@decaf-ts/decoration 0.0.21 → 0.0.22
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/README.md +1 -1
- package/dist/decoration.cjs +5 -5
- package/dist/decoration.esm.cjs +5 -5
- package/lib/esm/metadata/Metadata.js +5 -5
- package/lib/metadata/Metadata.cjs +5 -5
- package/package.json +1 -1
package/README.md
CHANGED
package/dist/decoration.cjs
CHANGED
|
@@ -223,7 +223,7 @@
|
|
|
223
223
|
* @return {string|undefined} Description text if present, otherwise `undefined`.
|
|
224
224
|
*/
|
|
225
225
|
static description(model, prop) {
|
|
226
|
-
return this.get(model,
|
|
226
|
+
return this.get(model, this.key(exports.DecorationKeys.DESCRIPTION, (prop ? prop : exports.DecorationKeys.CLASS)));
|
|
227
227
|
}
|
|
228
228
|
/**
|
|
229
229
|
* @description Retrieves the recorded params for a method.
|
|
@@ -234,7 +234,7 @@
|
|
|
234
234
|
* @return {any[]|undefined} Array of constructor references describing each parameter or `undefined` when not available.
|
|
235
235
|
*/
|
|
236
236
|
static params(model, prop) {
|
|
237
|
-
return this.get(model,
|
|
237
|
+
return this.get(model, this.key(exports.DecorationKeys.METHODS, prop, exports.DecorationKeys.DESIGN_PARAMS));
|
|
238
238
|
}
|
|
239
239
|
/**
|
|
240
240
|
* @description Retrieves a single recorded parameter type for a method.
|
|
@@ -262,7 +262,7 @@
|
|
|
262
262
|
* @return {any|undefined} Constructor reference for the return type or `undefined` when not available.
|
|
263
263
|
*/
|
|
264
264
|
static return(model, prop) {
|
|
265
|
-
return this.get(model,
|
|
265
|
+
return this.get(model, this.key(exports.DecorationKeys.METHODS, prop, exports.DecorationKeys.DESIGN_RETURN));
|
|
266
266
|
}
|
|
267
267
|
/**
|
|
268
268
|
* @description Retrieves the recorded design type for a property.
|
|
@@ -272,7 +272,7 @@
|
|
|
272
272
|
* @return {Constructor|undefined} Constructor reference for the property type or `undefined` if not available.
|
|
273
273
|
*/
|
|
274
274
|
static type(model, prop) {
|
|
275
|
-
return this.get(model,
|
|
275
|
+
return this.get(model, this.key(exports.DecorationKeys.PROPERTIES, prop));
|
|
276
276
|
}
|
|
277
277
|
/**
|
|
278
278
|
* @description Resolves the canonical constructor associated with the provided model handle and metadata.
|
|
@@ -996,4 +996,4 @@
|
|
|
996
996
|
exports.setValueBySplitter = setValueBySplitter;
|
|
997
997
|
|
|
998
998
|
}));
|
|
999
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdGlvbi5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMudHMiLCIuLi9zcmMvbWV0YWRhdGEvTWV0YWRhdGEudHMiLCIuLi9zcmMvZGVjb3JhdGlvbi9EZWNvcmF0aW9uLnRzIiwiLi4vc3JjL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzaWNNZXRhZGF0YSB9IGZyb20gXCIuL21ldGFkYXRhL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgZmxhdm91ciBpZGVudGlmaWVyIGZvciB0aGUgZGVjb3JhdG9yIHN5c3RlbS5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGZhbGxiYWNrIGZsYXZvdXIgdXNlZCB3aGVuIG5vIHNwZWNpZmljIHZhbHVlIGlzIHByb3ZpZGVkLCBlbnN1cmluZyBjb25zaXN0ZW50IGRlY29yYXRvciBzZWxlY3Rpb24gYWNyb3NzIHRoZSBsaWJyYXJ5LlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBjb25zdCBEZWZhdWx0Rmxhdm91clxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0Rmxhdm91ciA9IFwiZGVjYWZcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2hhcmFjdGVyIHVzZWQgdG8gc3BsaXQgbmVzdGVkIG1ldGFkYXRhIGtleXMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBkZWxpbWl0ZXIgYXBwbGllZCBieSB0aGUgbWV0YWRhdGEgc3RvcmUgd2hlbiB0cmF2ZXJzaW5nIG5lc3RlZCBvYmplY3QgcGF0aHMgZm9yIHJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMuXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGNvbnN0IE9iamVjdEtleVNwbGl0dGVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IE9iamVjdEtleVNwbGl0dGVyID0gXCIuXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGFkYXRhIHRva2VuIHJlZ2lzdHJ5IGZvciB0aGUgZGVjb3JhdGlvbiBzeXN0ZW0uXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBrZXlzIHVzZWQgZHVyaW5nIHJlZmxlY3Rpb24gYW5kIG1ldGFkYXRhIHN0b3JhZ2UgZm9yIGNsYXNzZXMsIHByb3BlcnRpZXMsIG1ldGhvZHMsIGRlc2NyaXB0aW9ucywgYW5kIHJlZ2lzdGVyZWQgbGlicmFyaWVzLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQGNvbnN0IERlY29yYXRpb25LZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGVudW0gRGVjb3JhdGlvbktleXMge1xuICAvKiogQGRlc2NyaXB0aW9uIFN0b3JhZ2UgYnVja2V0IGZvciBkZWNvcmF0aW9uLWF3YXJlIGxpYnJhcnkgcmVnaXN0cmF0aW9ucy4gKi9cbiAgTElCUkFSSUVTID0gXCJsaWJyYXJpZXNcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBTdG9yYWdlIGtleSBtaXJyb3JlZCBvbiBjb25zdHJ1Y3RvcnMgdGhhdCBob2xkcyBydW50aW1lIG1ldGFkYXRhLiAqL1xuICBSRUZMRUNUID0gYF9fJHtEZWZhdWx0Rmxhdm91cn1gLFxuICAvKiogQGRlc2NyaXB0aW9uIENvbnRhaW5lciBvZiByZWZsZWN0ZWQgcHJvcGVydHkgbWV0YWRhdGEgZm9yIGEgbW9kZWwuICovXG4gIFBST1BFUlRJRVMgPSBcInByb3BlcnRpZXNcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBDb250YWluZXIgb2YgcmVmbGVjdGVkIG1ldGhvZCBtZXRhZGF0YSBmb3IgYSBtb2RlbC4gKi9cbiAgTUVUSE9EUyA9IFwibWV0aG9kc1wiLFxuICAvKiogQGRlc2NyaXB0aW9uIEtleSB1bmRlciB3aGljaCB0aGUgbW9kZWwgY29uc3RydWN0b3IgcmVmZXJlbmNlIGlzIHBlcnNpc3RlZC4gKi9cbiAgQ0xBU1MgPSBcImNsYXNzXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb25zIGZvciBjbGFzc2VzIGFuZCBtZW1iZXJzLiAqL1xuICBERVNDUklQVElPTiA9IFwiZGVzY3JpcHRpb25cIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBTdG9yYWdlIHNsb3QgdHJhY2tpbmcgdGhlIG9yaWdpbmFsIGNvbnN0cnVjdG9yIHdoZW4gb3ZlcnJpZGRlbi4gKi9cbiAgQ09OU1RSVUNUT1IgPSBcIl9fb3JpZ2luYWxcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBDb2xsZWN0ZWQgcGFyYW1ldGVyIG1ldGFkYXRhIGZvciBjb25maWd1cmVkIGRlY29yYXRvcnMuICovXG4gIFBBUkFNRVRFUlMgPSBcInBhcmFtZXRlcnNcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWZsZWN0IG1ldGFkYXRhIGtleSBmb3IgYSBwcm9wZXJ0eSdzIGRlc2lnbiB0eXBlLiAqL1xuICBERVNJR05fVFlQRSA9IFwiZGVzaWduOnR5cGVcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWZsZWN0IG1ldGFkYXRhIGtleSBmb3IgcmVjb3JkZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzLiAqL1xuICBERVNJR05fUEFSQU1TID0gXCJkZXNpZ246cGFyYW10eXBlc1wiLFxuICAvKiogQGRlc2NyaXB0aW9uIFJlZmxlY3QgbWV0YWRhdGEga2V5IGZvciBhIG1ldGhvZCdzIHJldHVybiB0eXBlLiAqL1xuICBERVNJR05fUkVUVVJOID0gXCJkZXNpZ246cmV0dXJudHlwZVwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IG1ldGFkYXRhIGluc3RhbmNlLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIGRlZmF1bHQgbWV0YWRhdGEgc2hhcGUgdXNlZCB3aGVuIGluaXRpYWxpc2luZyBuZXcgbWV0YWRhdGEgZW50cmllcyBmb3IgYSBtb2RlbC5cbiAqIEB0eXBlIHttb2R1bGU6ZGVjb3JhdGlvbi5CYXNpY01ldGFkYXRhPGFueT59XG4gKiBAY29uc3QgRGVmYXVsdE1ldGFkYXRhXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRNZXRhZGF0YTogQmFzaWNNZXRhZGF0YTxhbnk+ID0ge1xuICBbRGVjb3JhdGlvbktleXMuUFJPUEVSVElFU106IFtdLFxufSBhcyB1bmtub3duIGFzIEJhc2ljTWV0YWRhdGE8YW55PjtcbiIsImltcG9ydCB7IEJhc2ljTWV0YWRhdGEsIENvbnN0cnVjdG9yIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY29yYXRpb25LZXlzLCBPYmplY3RLZXlTcGxpdHRlciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgbmVzdGVkIHZhbHVlIGZyb20gYW4gb2JqZWN0IGdpdmVuIGEgcGF0aC5cbiAqIEBzdW1tYXJ5IFdhbGtzIGFuIG9iamVjdCBzdHJ1Y3R1cmUgdXNpbmcgYSBzcGxpdHRlci1kZWxpbWl0ZWQgcGF0aCBhbmQgcmV0dXJucyB0aGUgdmFsdWUgYXQgdGhhdCBsb2NhdGlvbiBvciBgdW5kZWZpbmVkYCBpZiBhbnkga2V5IGlzIG1pc3NpbmcuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iaiBPYmplY3QgdG8gdHJhdmVyc2UgZm9yIHRoZSBsb29rdXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBTcGxpdHRlci1kZWxpbWl0ZWQgcGF0aCB0byB0aGUgZGVzaXJlZCB2YWx1ZSAoZS5nLiwgXCJhLmIuY1wiKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3BsaXR0ZXI9T2JqZWN0S2V5U3BsaXR0ZXJdIERlbGltaXRlciB1c2VkIHRvIHNlcGFyYXRlIHRoZSBwYXRoIHNlZ21lbnRzLlxuICogQHJldHVybiB7YW55fHVuZGVmaW5lZH0gVmFsdWUgcmVzb2x2ZWQgYXQgdGhlIGdpdmVuIHBhdGggb3IgYHVuZGVmaW5lZGAgd2hlbiBub3QgZm91bmQuXG4gKiBAZnVuY3Rpb24gZ2V0VmFsdWVCeVNwbGl0dGVyXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgZ2V0VmFsdWVCeVNwbGl0dGVyXG4gKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JqZWN0XG4gKiAgIEMtPj5GOiAob2JqLCBwYXRoLCBzcGxpdHRlcilcbiAqICAgRi0+PkY6IHNwbGl0IHBhdGggaW50byBrZXlzXG4gKiAgIGxvb3AgZm9yIGVhY2gga2V5XG4gKiAgICAgRi0+Pk86IGFjY2VzcyBjdXJyZW50W2tleV1cbiAqICAgICBhbHQgbWlzc2luZyBvciBudWxsaXNoXG4gKiAgICAgICBGLS0+PkM6IHJldHVybiB1bmRlZmluZWRcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIEYtLT4+QzogcmV0dXJuIGZpbmFsIHZhbHVlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlQnlTcGxpdHRlcihcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHNwbGl0dGVyOiBzdHJpbmcgPSBPYmplY3RLZXlTcGxpdHRlclxuKTogYW55IHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoc3BsaXR0ZXIpO1xuICBsZXQgY3VycmVudCA9IG9iajtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgaWYgKFxuICAgICAgY3VycmVudCA9PT0gbnVsbCB8fFxuICAgICAgY3VycmVudCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSlcbiAgICApXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cblxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2V0cyBhIG5lc3RlZCB2YWx1ZSBvbiBhbiBvYmplY3QgZ2l2ZW4gYSBwYXRoLlxuICogQHN1bW1hcnkgVHJhdmVyc2VzIG9yIGNyZWF0ZXMgaW50ZXJtZWRpYXRlIG9iamVjdHMgZm9sbG93aW5nIGEgc3BsaXR0ZXItZGVsaW1pdGVkIHBhdGggYW5kIGFzc2lnbnMgdGhlIHByb3ZpZGVkIHZhbHVlIGF0IHRoZSBkZXN0aW5hdGlvbiBrZXkuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iaiBPYmplY3QgdG8gbXV0YXRlIHdoaWxlIGRyaWxsaW5nIGludG8gbmVzdGVkIGtleXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBTcGxpdHRlci1kZWxpbWl0ZWQgZGVzdGluYXRpb24gcGF0aCAoZS5nLiwgXCJhLmIuY1wiKS5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSBWYWx1ZSB0byBzZXQgYXQgdGhlIGRlc3RpbmF0aW9uIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NwbGl0dGVyPU9iamVjdEtleVNwbGl0dGVyXSBEZWxpbWl0ZXIgdXNlZCB0byBzZXBhcmF0ZSB0aGUgcGF0aCBzZWdtZW50cy5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAZnVuY3Rpb24gc2V0VmFsdWVCeVNwbGl0dGVyXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgc2V0VmFsdWVCeVNwbGl0dGVyXG4gKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JqZWN0XG4gKiAgIEMtPj5GOiAob2JqLCBwYXRoLCB2YWx1ZSwgc3BsaXR0ZXIpXG4gKiAgIEYtPj5GOiBzcGxpdCBwYXRoIGludG8ga2V5c1xuICogICBsb29wIGZvciBlYWNoIGtleVxuICogICAgIGFsdCBrZXkgbWlzc2luZ1xuICogICAgICAgRi0+Pk86IGNyZWF0ZSBpbnRlcm1lZGlhdGUgb2JqZWN0XG4gKiAgICAgZWxzZSBrZXkgZXhpc3RzXG4gKiAgICAgICBGLT4+TzogZGVzY2VuZCBpbnRvIGV4aXN0aW5nIG9iamVjdFxuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgRi0tPj5DOiB2b2lkXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFZhbHVlQnlTcGxpdHRlcihcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4gIHNwbGl0dGVyID0gT2JqZWN0S2V5U3BsaXR0ZXJcbik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChzcGxpdHRlcikuZmlsdGVyKChrKSA9PiBrLmxlbmd0aCA+IDApO1xuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBsZXQgY3VycmVudDogUmVjb3JkPGFueSwgYW55PiA9IG9iajtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoXG4gICAgICBjdXJyZW50W2tleV0gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgY3VycmVudFtrZXldID09PSBudWxsIHx8XG4gICAgICB0eXBlb2YgY3VycmVudFtrZXldICE9PSBcIm9iamVjdFwiXG4gICAgKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSB7fTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuXG4gIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gIGN1cnJlbnRbbGFzdEtleV0gPSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2VudHJhbGl6ZWQgcnVudGltZSBtZXRhZGF0YSBzdG9yZSBib3VuZCB0byBjb25zdHJ1Y3RvcnMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyB1dGlsaXRpZXMgdG8gcmVhZCBhbmQgd3JpdGUgc3RydWN0dXJlZCBtZXRhZGF0YSBmb3IgY2xhc3NlcyBhbmQgdGhlaXIgbWVtYmVycywgd2l0aCBvcHRpb25hbCBtaXJyb3Jpbmcgb250byB0aGUgY29uc3RydWN0b3IgdmlhIGEgd2VsbC1rbm93biBzeW1ib2wga2V5LiBTdXBwb3J0cyBuZXN0ZWQga2V5IHBhdGhzIHVzaW5nIGEgY29uZmlndXJhYmxlIHNwbGl0dGVyIGFuZCBvZmZlcnMgYm90aCBpbnN0YW5jZSBhbmQgc3RhdGljIEFQSXMuXG4gKiBAdGVtcGxhdGUgTSBUaGUgbW9kZWwgdHlwZSB0aGUgbWV0YWRhdGEgYmVsb25ncyB0by5cbiAqIEB0ZW1wbGF0ZSBNRVRBIEV4dGVuZHMgQmFzaWNNZXRhZGF0YTxNPiByZXByZXNlbnRpbmcgdGhlIG1ldGFkYXRhIHN0cnVjdHVyZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cj1EZWZhdWx0Rmxhdm91cl0gT3B0aW9uYWwgZmxhdm91ciBpZGVudGlmaWVyIGFwcGxpZWQgd2hlbiBpbnN0YW50aWF0aW5nIGhlbHBlciBidWlsZGVycy5cbiAqIEBjbGFzc1xuICogQGV4YW1wbGVcbiAqIC8vIERlZmluZSBhbmQgcmVhZCBtZXRhZGF0YSBmb3IgYSBjbGFzc1xuICogY2xhc3MgVXNlciB7IG5hbWUhOiBzdHJpbmcgfVxuICogTWV0YWRhdGEuc2V0KFVzZXIsIFwiZGVzY3JpcHRpb24uY2xhc3NcIiwgXCJBIHVzZXIgbW9kZWxcIik7XG4gKiBNZXRhZGF0YS5zZXQoVXNlciwgXCJwcm9wZXJ0aWVzLm5hbWVcIiwgU3RyaW5nKTtcbiAqIGNvbnN0IGRlc2MgPSBNZXRhZGF0YS5nZXQoVXNlciwgXCJkZXNjcmlwdGlvbi5jbGFzc1wiKTsgLy8gXCJBIHVzZXIgbW9kZWxcIlxuICogY29uc3QgdHlwZSA9IE1ldGFkYXRhLnR5cGUoVXNlciwgXCJuYW1lXCIpOyAvLyBTdHJpbmdcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDb25zdHJ1Y3RvclxuICogICBwYXJ0aWNpcGFudCBTIGFzIE1ldGFkYXRhIChzdGF0aWMpXG4gKiAgIEMtPj5TOiBzZXQoVXNlciwgXCJwcm9wZXJ0aWVzLm5hbWVcIiwgU3RyaW5nKVxuICogICBDLT4+UzogZ2V0KFVzZXIsIFwicHJvcGVydGllcy5uYW1lXCIpXG4gKiAgIFMtLT4+QzogU3RyaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW4tbWVtb3J5IHN0b3JhZ2Ugb2YgbWV0YWRhdGEgYnkgY29uc3RydWN0b3Igc3ltYm9sXG4gICAqIEBzdW1tYXJ5IE1hcHMgYSBTeW1ib2wgZGVyaXZlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvciB0byBpdHMgbWV0YWRhdGEgb2JqZWN0LCBlbmFibGluZyBlZmZpY2llbnQgbG9va3VwLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX21ldGFkYXRhOiBSZWNvcmQ8c3ltYm9sLCBhbnk+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXRoIGRlbGltaXRlciBmb3IgbmVzdGVkIG1ldGFkYXRhIGtleXNcbiAgICogQHN1bW1hcnkgVXNlZCBieSBnZXQvc2V0IG9wZXJhdGlvbnMgdG8gbmF2aWdhdGUgbmVzdGVkIHN0cnVjdHVyZXMsIGRlZmF1bHRzIHRvIE9iamVjdEtleVNwbGl0dGVyLlxuICAgKi9cbiAgc3RhdGljIHNwbGl0dGVyID0gT2JqZWN0S2V5U3BsaXR0ZXI7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3ltYm9sIGtleSB1c2VkIHRvIG1pcnJvciBtZXRhZGF0YSBvbiB0aGUgY29uc3RydWN0b3JcbiAgICogQHN1bW1hcnkgV2hlbiBtaXJyb3JpbmcgaXMgZW5hYmxlZCwgdGhlIG1ldGFkYXRhIG9iamVjdCBpcyBkZWZpbmVkIG9uIHRoZSBjb25zdHJ1Y3RvciB1bmRlciB0aGlzIG5vbi1lbnVtZXJhYmxlIGtleS5cbiAgICovXG4gIHN0YXRpYyBiYXNlS2V5ID0gRGVjb3JhdGlvbktleXMuUkVGTEVDVDtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIG1ldGFkYXRhIGlzIG1pcnJvcmVkIG9udG8gdGhlIGNvbnN0cnVjdG9yXG4gICAqIEBzdW1tYXJ5IFdoZW4gdHJ1ZSwgdGhlIG1ldGFkYXRhIG9iamVjdCBpcyBkZWZpbmVkIG9uIHRoZSBjb25zdHJ1Y3RvciB1bmRlciB0aGUgbm9uLWVudW1lcmFibGUgYmFzZUtleS5cbiAgICovXG4gIHN0YXRpYyBtaXJyb3I6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHN0YXRpYyBTeW1ib2w8TT4ob2JqOiBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHJldHVybiBTeW1ib2wuZm9yKFtvYmoudG9TdHJpbmcoKSwgb2JqLm5hbWVdLmpvaW4oXCIgLSBcIikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0cyBrbm93biBwcm9wZXJ0eSBrZXlzIGZvciBhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBSZWFkcyB0aGUgbWV0YWRhdGEgZW50cnkgYW5kIHJldHVybnMgdGhlIG5hbWVzIG9mIHByb3BlcnRpZXMgdGhhdCBoYXZlIHJlY29yZGVkIHR5cGUgaW5mb3JtYXRpb24uXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3J9IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB3aG9zZSBwcm9wZXJ0eSBtZXRhZGF0YSBzaG91bGQgYmUgaW5zcGVjdGVkLlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXXx1bmRlZmluZWR9IEFycmF5IG9mIHByb3BlcnR5IG5hbWVzIG9yIGB1bmRlZmluZWRgIGlmIG5vIG1ldGFkYXRhIGV4aXN0cy5cbiAgICovXG4gIHN0YXRpYyBwcm9wZXJ0aWVzKG1vZGVsOiBDb25zdHJ1Y3Rvcik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXQobW9kZWwpO1xuICAgIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWV0YS5wcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlzdHMga25vd24gbWV0aG9kcyBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIG1ldGFkYXRhIGVudHJ5IGFuZCByZXR1cm5zIHRoZSBtZXRob2QgbmFtZXMgdGhhdCBoYXZlIHJlY29yZGVkIHNpZ25hdHVyZSBtZXRhZGF0YSBmb3IgdGhlIHByb3ZpZGVkIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yfSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igd2hvc2UgbWV0aG9kIG1ldGFkYXRhIHNob3VsZCBiZSBpbnNwZWN0ZWQuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfHVuZGVmaW5lZH0gQXJyYXkgb2YgbWV0aG9kIG5hbWVzIG9yIGB1bmRlZmluZWRgIGlmIG5vIG1ldGFkYXRhIGV4aXN0cy5cbiAgICovXG4gIHN0YXRpYyBtZXRob2RzKG1vZGVsOiBDb25zdHJ1Y3Rvcik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXQobW9kZWwsIERlY29yYXRpb25LZXlzLk1FVEhPRFMpO1xuICAgIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWV0YSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciBhIGNsYXNzIG9yIGEgcHJvcGVydHkuXG4gICAqIEBzdW1tYXJ5IExvb2tzIHVwIHRoZSBkZXNjcmlwdGlvbiBzdG9yZWQgdW5kZXIgdGhlIG1ldGFkYXRhIFwiZGVzY3JpcHRpb25cIiBtYXAuIElmIGEgcHJvcGVydHkga2V5IGlzIHByb3ZpZGVkLCByZXR1cm5zIHRoZSBwcm9wZXJ0eSdzIGRlc2NyaXB0aW9uOyBvdGhlcndpc2UgcmV0dXJucyB0aGUgY2xhc3MgZGVzY3JpcHRpb24uXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB3aG9zZSBkZXNjcmlwdGlvbiBpcyBiZWluZyByZXRyaWV2ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcF0gT3B0aW9uYWwgcHJvcGVydHkga2V5ICh0eXBlZCBhcyBga2V5b2YgTWApIGZvciB3aGljaCB0byBmZXRjaCB0aGUgZGVzY3JpcHRpb24uXG4gICAqIEByZXR1cm4ge3N0cmluZ3x1bmRlZmluZWR9IERlc2NyaXB0aW9uIHRleHQgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgc3RhdGljIGRlc2NyaXB0aW9uPE0+KFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBwcm9wPzoga2V5b2YgTVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldChcbiAgICAgIG1vZGVsLFxuICAgICAgW0RlY29yYXRpb25LZXlzLkRFU0NSSVBUSU9OLCBwcm9wID8gcHJvcCA6IERlY29yYXRpb25LZXlzLkNMQVNTXS5qb2luKFxuICAgICAgICB0aGlzLnNwbGl0dGVyXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSByZWNvcmRlZCBwYXJhbXMgZm9yIGEgbWV0aG9kLlxuICAgKiBAc3VtbWFyeSBSZWFkcyB0aGUgbWV0YWRhdGEgZW50cnkgdW5kZXIgYG1ldGhvZHMuPHByb3A+LmRlc2lnbjpwYXJhbXR5cGVzYCB0byByZXR1cm4gdGhlIHBhcmFtZXRlciBjb25zdHJ1Y3RvcnMgZm9yIHRoZSBnaXZlbiBtZXRob2QuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciBvd25pbmcgdGhlIG1ldGhvZCBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgTWV0aG9kIG5hbWUgd2hvc2UgcGFyYW1ldGVycyBzaG91bGQgYmUgZmV0Y2hlZC5cbiAgICogQHJldHVybiB7YW55W118dW5kZWZpbmVkfSBBcnJheSBvZiBjb25zdHJ1Y3RvciByZWZlcmVuY2VzIGRlc2NyaWJpbmcgZWFjaCBwYXJhbWV0ZXIgb3IgYHVuZGVmaW5lZGAgd2hlbiBub3QgYXZhaWxhYmxlLlxuICAgKi9cbiAgc3RhdGljIHBhcmFtczxNPihtb2RlbDogQ29uc3RydWN0b3I8TT4sIHByb3A6IHN0cmluZyk6IGFueVtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoXG4gICAgICBtb2RlbCxcbiAgICAgIFtEZWNvcmF0aW9uS2V5cy5NRVRIT0RTLCBwcm9wLCBEZWNvcmF0aW9uS2V5cy5ERVNJR05fUEFSQU1TXS5qb2luKFxuICAgICAgICB0aGlzLnNwbGl0dGVyXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgc2luZ2xlIHJlY29yZGVkIHBhcmFtZXRlciB0eXBlIGZvciBhIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgTG9va3MgdXAgdGhlIHBhcmFtZXRlciBtZXRhZGF0YSBmb3IgdGhlIHByb3ZpZGVkIGluZGV4LCBlbmZvcmNpbmcgYm91bmRzIGFuZCByZXR1cm5pbmcgdGhlIGNvbnN0cnVjdG9yIHJlZmVyZW5jZSBmb3IgdGhhdCBhcmd1bWVudC5cbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIG93bmluZyB0aGUgbWV0aG9kIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBNZXRob2QgbmFtZSB3aG9zZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIHJldHVybmVkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggWmVyby1iYXNlZCBpbmRleCBvZiB0aGUgZGVzaXJlZCBwYXJhbWV0ZXIgbWV0YWRhdGEuXG4gICAqIEByZXR1cm4ge2FueXx1bmRlZmluZWR9IENvbnN0cnVjdG9yIHJlZmVyZW5jZSBmb3IgdGhlIHBhcmFtZXRlciBvciBgdW5kZWZpbmVkYCBpZiBub3QgcmVjb3JkZWQuXG4gICAqL1xuICBzdGF0aWMgcGFyYW08TT4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIHByb3A6IHN0cmluZyxcbiAgICBpbmRleDogbnVtYmVyXG4gICk6IGFueSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5wYXJhbXMobW9kZWwsIHByb3ApO1xuICAgIGlmICghcGFyYW1zKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChpbmRleCA+IHBhcmFtcy5sZW5ndGggLSAxKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUGFyYW1ldGVyIGluZGV4ICR7aW5kZXh9IG91dCBvZiByYW5nZSBmb3IgJHtTdHJpbmcocHJvcCl9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcGFyYW1zW2luZGV4XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSByZWNvcmRlZCByZXR1cm4gdHlwZSBmb3IgYSBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IFJlYWRzIHRoZSBtZXRhZGF0YSBlbnRyeSB1bmRlciBgbWV0aG9kcy48cHJvcD4uZGVzaWduOnJldHVybnR5cGVgIHRvIHJldHVybiB0aGUgcmV0dXJuIHR5cGUgZm9yIHRoZSBnaXZlbiBtZXRob2QuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB3aG9zZSBtZXRob2QgbWV0YWRhdGEgc2hvdWxkIGJlIGluc3BlY3RlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgTWV0aG9kIG5hbWUgd2hvc2UgcmV0dXJuIHR5cGUgc2hvdWxkIGJlIGZldGNoZWQuXG4gICAqIEByZXR1cm4ge2FueXx1bmRlZmluZWR9IENvbnN0cnVjdG9yIHJlZmVyZW5jZSBmb3IgdGhlIHJldHVybiB0eXBlIG9yIGB1bmRlZmluZWRgIHdoZW4gbm90IGF2YWlsYWJsZS5cbiAgICovXG4gIHN0YXRpYyByZXR1cm48TT4obW9kZWw6IENvbnN0cnVjdG9yPE0+LCBwcm9wOiBzdHJpbmcpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldChcbiAgICAgIG1vZGVsLFxuICAgICAgW0RlY29yYXRpb25LZXlzLk1FVEhPRFMsIHByb3AsIERlY29yYXRpb25LZXlzLkRFU0lHTl9SRVRVUk5dLmpvaW4oXG4gICAgICAgIHRoaXMuc3BsaXR0ZXJcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIHJlY29yZGVkIGRlc2lnbiB0eXBlIGZvciBhIHByb3BlcnR5LlxuICAgKiBAc3VtbWFyeSBSZWFkcyB0aGUgbWV0YWRhdGEgZW50cnkgdW5kZXIgYHByb3BlcnRpZXMuPHByb3A+YCB0byByZXR1cm4gdGhlIGNvbnN0cnVjdG9yIHJlY29yZGVkIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcn0gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIHdob3NlIHByb3BlcnR5IG1ldGFkYXRhIHNob3VsZCBiZSBpbnNwZWN0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IG5hbWUgd2hvc2UgdHlwZSBtZXRhZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yfHVuZGVmaW5lZH0gQ29uc3RydWN0b3IgcmVmZXJlbmNlIGZvciB0aGUgcHJvcGVydHkgdHlwZSBvciBgdW5kZWZpbmVkYCBpZiBub3QgYXZhaWxhYmxlLlxuICAgKi9cbiAgc3RhdGljIHR5cGUobW9kZWw6IENvbnN0cnVjdG9yLCBwcm9wOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoXG4gICAgICBtb2RlbCxcbiAgICAgIFtEZWNvcmF0aW9uS2V5cy5QUk9QRVJUSUVTLCBwcm9wXS5qb2luKHRoaXMuc3BsaXR0ZXIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZXMgdGhlIGNhbm9uaWNhbCBjb25zdHJ1Y3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIG1vZGVsIGhhbmRsZSBhbmQgbWV0YWRhdGEuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHN0b3JlZCBjb25zdHJ1Y3RvciByZWZlcmVuY2Ugd2hlbiB0aGUgcHJvdmlkZWQgbW9kZWwgaXMgYSBwcm94eSBvciByZWR1Y2VkIHZhbHVlLiBGYWxscyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtb2RlbCB3aGVuIG5vIGNvbnN0cnVjdG9yIG1ldGFkYXRhIGhhcyBiZWVuIHJlY29yZGVkIHlldC5cbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgTW9kZWwgdXNlZCB3aGVuIHJlY29yZGluZyBtZXRhZGF0YS5cbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8TT59IENhbm9uaWNhbCBjb25zdHJ1Y3RvciBpZiBzdG9yZWQsIG90aGVyd2lzZSB0aGUgcHJvdmlkZWQgb25lYC5cbiAgICovXG4gIHN0YXRpYyBjb25zdHI8TT4obW9kZWw6IENvbnN0cnVjdG9yPE0+KTogQ29uc3RydWN0b3I8TT4ge1xuICAgIHJldHVybiBtb2RlbFtEZWNvcmF0aW9uS2V5cy5DT05TVFJVQ1RPUiBhcyBrZXlvZiB0eXBlb2YgbW9kZWxdIHx8IG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbWV0YWRhdGEgZm9yIGEgbW9kZWwgb3IgYSBzcGVjaWZpYyBrZXkgd2l0aGluIGl0LlxuICAgKiBAc3VtbWFyeSBXaGVuIGNhbGxlZCB3aXRoIGEgY29uc3RydWN0b3Igb25seSwgcmV0dXJucyB0aGUgZW50aXJlIG1ldGFkYXRhIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsLiBXaGVuIGEga2V5IHBhdGggaXMgcHJvdmlkZWQsIHJldHVybnMgdGhlIHZhbHVlIHN0b3JlZCBhdCB0aGF0IG5lc3RlZCBrZXkuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEB0ZW1wbGF0ZSBNRVRBXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB1c2VkIHRvIGxvY2F0ZSB0aGUgbWV0YWRhdGEgcmVjb3JkLlxuICAgKiBAcmV0dXJuIHtNRVRBfHVuZGVmaW5lZH0gTWV0YWRhdGEgb2JqZWN0LCB0aGUgdmFsdWUgYXQgdGhlIGtleSBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBub3RoaW5nIGV4aXN0cy5cbiAgICovXG4gIHN0YXRpYyBnZXQ8TSwgTUVUQSBleHRlbmRzIEJhc2ljTWV0YWRhdGE8TT4gPSBCYXNpY01ldGFkYXRhPE0+PihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbiAgKTogTUVUQSB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbWV0YWRhdGEgZm9yIGEgbW9kZWwgb3IgYSBzcGVjaWZpYyBrZXkgd2l0aGluIGl0LlxuICAgKiBAc3VtbWFyeSBXaGVuIGNhbGxlZCB3aXRoIGEgY29uc3RydWN0b3Igb25seSwgcmV0dXJucyB0aGUgZW50aXJlIG1ldGFkYXRhIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsLiBXaGVuIGEga2V5IHBhdGggaXMgcHJvdmlkZWQsIHJldHVybnMgdGhlIHZhbHVlIHN0b3JlZCBhdCB0aGF0IG5lc3RlZCBrZXkuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEB0ZW1wbGF0ZSBNRVRBXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB1c2VkIHRvIGxvY2F0ZSB0aGUgbWV0YWRhdGEgcmVjb3JkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IE5lc3RlZCBrZXkgcGF0aCB0byBmZXRjaCBhIHNwZWNpZmljIHZhbHVlLlxuICAgKiBAcmV0dXJuIHtNRVRBfCp8dW5kZWZpbmVkfSBNZXRhZGF0YSBvYmplY3QsIHRoZSB2YWx1ZSBhdCB0aGUga2V5IHBhdGgsIG9yIGB1bmRlZmluZWRgIGlmIG5vdGhpbmcgZXhpc3RzLlxuICAgKi9cbiAgc3RhdGljIGdldChtb2RlbDogQ29uc3RydWN0b3IsIGtleTogc3RyaW5nKTogYW55O1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtZXRhZGF0YSBmb3IgYSBtb2RlbCBvciBhIHNwZWNpZmljIGtleSB3aXRoaW4gaXQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gY2FsbGVkIHdpdGggYSBjb25zdHJ1Y3RvciBvbmx5LCByZXR1cm5zIHRoZSBlbnRpcmUgbWV0YWRhdGEgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZWwuIFdoZW4gYSBrZXkgcGF0aCBpcyBwcm92aWRlZCwgcmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkIGF0IHRoYXQgbmVzdGVkIGtleS5cbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHRlbXBsYXRlIE1FVEFcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPnxzdHJpbmd9IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB1c2VkIHRvIGxvY2F0ZSB0aGUgbWV0YWRhdGEgcmVjb3JkIG9yIGEgcHJlLXJlc29sdmVkIHN5bWJvbCBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gT3B0aW9uYWwgbmVzdGVkIGtleSBwYXRoIHRvIGZldGNoIGEgc3BlY2lmaWMgdmFsdWUuXG4gICAqIEByZXR1cm4ge01FVEF8Knx1bmRlZmluZWR9IE1ldGFkYXRhIG9iamVjdCwgdGhlIHZhbHVlIGF0IHRoZSBrZXkgcGF0aCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90aGluZyBleGlzdHMuXG4gICAqL1xuICBzdGF0aWMgZ2V0KG1vZGVsOiBDb25zdHJ1Y3Rvciwga2V5Pzogc3RyaW5nKSB7XG4gICAgaWYgKGtleSA9PT0gRGVjb3JhdGlvbktleXMuQ09OU1RSVUNUT1IpIHJldHVybiB0aGlzLmNvbnN0cihtb2RlbCk7XG4gICAgY29uc3QgcmVzb2x2ZWRNb2RlbCA9IHRoaXMuY29uc3RyKG1vZGVsKTtcbiAgICBjb25zdCBjb25zdHJ1Y3RvcnMgPSB0aGlzLmNvbGxlY3RDb25zdHJ1Y3RvckNoYWluKHJlc29sdmVkTW9kZWwpO1xuICAgIGlmIChjb25zdHJ1Y3RvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBmYWxsYmFja1N5bWJvbCA9IFN5bWJvbC5mb3IocmVzb2x2ZWRNb2RlbC50b1N0cmluZygpKTtcbiAgICAgIHJldHVybiB0aGlzLmlubmVyR2V0KGZhbGxiYWNrU3ltYm9sLCBrZXkpO1xuICAgIH1cbiAgICBjb25zdCBjb2xsZWN0ZWRWYWx1ZXMgPSBjb25zdHJ1Y3RvcnNcbiAgICAgIC5tYXAoKGN0b3IpID0+IHRoaXMuaW5uZXJHZXQodGhpcy5TeW1ib2woY3RvciksIGtleSkpXG4gICAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoY29sbGVjdGVkVmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB0aGlzLm1lcmdlTWV0YWRhdGFDaGFpbihjb2xsZWN0ZWRWYWx1ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbWV0YWRhdGEgc3RvcmVkIHVuZGVyIGEgc3ltYm9sIGtleS5cbiAgICogQHN1bW1hcnkgSW50ZXJuYWwgaGVscGVyIHRoYXQgcmVzb2x2ZXMgYW5kIG9wdGlvbmFsbHkgZHJpbGxzIGludG8gdGhlIGluLW1lbW9yeSBtZXRhZGF0YSBtYXAgZm9yIHRoZSBwcm92aWRlZCBzeW1ib2wgYW5kIGtleSBwYXRoLlxuICAgKiBAcGFyYW0ge3N5bWJvbH0gc3ltYm9sIFN5bWJvbCByZXByZXNlbnRpbmcgdGhlIG1ldGFkYXRhIGJ1Y2tldC5cbiAgICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBba2V5XSBPcHRpb25hbCBuZXN0ZWQga2V5IHJlZmVyZW5jaW5nIGEgc3BlY2lmaWMgbWV0YWRhdGEgZW50cnkuXG4gICAqIEByZXR1cm4ge2FueX0gU3RvcmVkIG1ldGFkYXRhIG9iamVjdCBvciB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIGtleSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBpbm5lckdldChzeW1ib2w6IHN5bWJvbCwga2V5Pzogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgaWYgKCF0aGlzLl9tZXRhZGF0YVtzeW1ib2xdKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICgha2V5KSByZXR1cm4gdGhpcy5fbWV0YWRhdGFbc3ltYm9sXTtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiBnZXRWYWx1ZUJ5U3BsaXR0ZXIodGhpcy5fbWV0YWRhdGFbc3ltYm9sXSwga2V5LCB0aGlzLnNwbGl0dGVyKTtcbiAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFbc3ltYm9sXVtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgdGhlIGluaGVyaXRhbmNlIGNoYWluIGZvciBhIGNvbnN0cnVjdG9yLCBvcmRlcmVkIGZyb20gYmFzZSB0byBtb3N0LXNwZWNpZmljIGNsYXNzLlxuICAgKiBAc3VtbWFyeSBXYWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIHN0YXJ0aW5nIGZyb20gdGhlIHByb3ZpZGVkIGNvbnN0cnVjdG9yIHVudGlsIHJlYWNoaW5nIEZ1bmN0aW9uL09iamVjdCBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGVkIGNvbnN0cnVjdG9ycy5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcn0gbW9kZWwgQ29uc3RydWN0b3Igd2hvc2UgY2hhaW4gc2hvdWxkIGJlIGNvbGxlY3RlZC5cbiAgICogQHJldHVybiB7Q29uc3RydWN0b3JbXX0gQXJyYXkgb2YgY29uc3RydWN0b3JzIG9yZGVyZWQgZnJvbSBiYXNlIHRvIGxlYWYuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjb2xsZWN0Q29uc3RydWN0b3JDaGFpbihtb2RlbDogQ29uc3RydWN0b3IpOiBDb25zdHJ1Y3RvcltdIHtcbiAgICBjb25zdCBjaGFpbjogQ29uc3RydWN0b3JbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcblxuICAgIHdoaWxlICh0eXBlb2YgY3VycmVudCA9PT0gXCJmdW5jdGlvblwiICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgICBjaGFpbi5wdXNoKGN1cnJlbnQgYXMgQ29uc3RydWN0b3IpO1xuICAgICAgY29uc3QgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50ID09PSBGdW5jdGlvbiB8fCBwYXJlbnQgPT09IE9iamVjdCkgYnJlYWs7XG4gICAgICBjdXJyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIHJldHVybiBjaGFpbi5yZXZlcnNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1lcmdlcyBtZXRhZGF0YSB2YWx1ZXMgY29sbGVjdGVkIGFjcm9zcyB0aGUgaW5oZXJpdGFuY2UgY2hhaW4uXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGEgZGVlcCBtZXJnZSBmb3IgcGxhaW4gb2JqZWN0cyB3aGlsZSBsZXR0aW5nIG5vbi1vYmplY3QgdmFsdWVzIG92ZXJyaWRlIGVhcmxpZXIgb25lcyB0byBwcmVzZXJ2ZSBjaGlsZCBtZXRhZGF0YSBwcmVjZWRlbmNlLlxuICAgKiBAcGFyYW0ge2FueVtdfSB2YWx1ZXMgTWV0YWRhdGEgdmFsdWVzIGdhdGhlcmVkIGZyb20gYmFzZSB0byBjaGlsZC5cbiAgICogQHJldHVybiB7YW55fSBBZ2dyZWdhdGVkIG1ldGFkYXRhIHZhbHVlIHJlc3BlY3RpbmcgaW5oZXJpdGFuY2UgcHJlY2VkZW5jZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIG1lcmdlTWV0YWRhdGFDaGFpbih2YWx1ZXM6IGFueVtdKSB7XG4gICAgbGV0IGFjYzogYW55ID0gdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmIChhY2MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY2MgPSB0aGlzLmNsb25lTWV0YWRhdGFWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc1BsYWluT2JqZWN0KGFjYykgJiYgdGhpcy5pc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICBhY2MgPSB0aGlzLm1lcmdlUGxhaW5PYmplY3RzKFxuICAgICAgICAgIGFjYyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgICAgIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGFjYyA9IHRoaXMuY2xvbmVNZXRhZGF0YVZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9kdWNlcyBhIGRlZXAgY2xvbmUgb2YgYSBtZXRhZGF0YSB2YWx1ZSB3aGVuIG5lY2Vzc2FyeS5cbiAgICogQHN1bW1hcnkgQXJyYXlzIGFyZSBzaGFsbG93LWNsb25lZCwgcGxhaW4gb2JqZWN0cyBhcmUgZGVlcC1jbG9uZWQsIGFuZCBwcmltaXRpdmUvZnVuY3Rpb24gdmFsdWVzIGFyZSByZXR1cm5lZCBhcy1pcy5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIE1ldGFkYXRhIHZhbHVlIHRvIGNsb25lLlxuICAgKiBAcmV0dXJuIHthbnl9IENsb25lZCBtZXRhZGF0YSB2YWx1ZSBwcmV2ZW50aW5nIG11dGF0aW9uIG9mIHRoZSBiYWNraW5nIHN0b3JlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY2xvbmVNZXRhZGF0YVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbLi4udmFsdWVdO1xuICAgIGlmICh0aGlzLmlzUGxhaW5PYmplY3QodmFsdWUpKVxuICAgICAgcmV0dXJuIHRoaXMubWVyZ2VQbGFpbk9iamVjdHMoe30sIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVlcGx5IG1lcmdlcyB0d28gcGxhaW4gbWV0YWRhdGEgb2JqZWN0cy5cbiAgICogQHN1bW1hcnkgUmVjdXJzaXZlbHkgbWVyZ2VzIG5lc3RlZCBwbGFpbiBvYmplY3RzIHdoaWxlIGNsb25pbmcgYXJyYXlzOyB2YWx1ZXMgZnJvbSBgc291cmNlYCBvdmVycmlkZSB0aG9zZSBmcm9tIGB0YXJnZXRgIHdoZW4gY29uZmxpY3RzIG9jY3VyLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRhcmdldCBCYXNlIG9iamVjdCB0byBtZXJnZSBpbnRvLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHNvdXJjZSBPYmplY3QgcHJvdmlkaW5nIG92ZXJyaWRpbmcgbWV0YWRhdGEuXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIGFueT59IE5ld2x5IG1lcmdlZCBtZXRhZGF0YSBvYmplY3QuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBtZXJnZVBsYWluT2JqZWN0cyhcbiAgICB0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgc291cmNlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4udGFyZ2V0IH07XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzb3VyY2UpKSB7XG4gICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSByZXN1bHRba2V5XTtcblxuICAgICAgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChzb3VyY2VWYWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmlzUGxhaW5PYmplY3QodGFyZ2V0VmFsdWUpXG4gICAgICAgICAgPyB0aGlzLm1lcmdlUGxhaW5PYmplY3RzKFxuICAgICAgICAgICAgICB0YXJnZXRWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgICAgICAgICBzb3VyY2VWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgICAgICApXG4gICAgICAgICAgOiB0aGlzLm1lcmdlUGxhaW5PYmplY3RzKHt9LCBzb3VyY2VWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZVZhbHVlKSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IFsuLi5zb3VyY2VWYWx1ZV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRba2V5XSA9IHNvdXJjZVZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0IHN1aXRhYmxlIGZvciBkZWVwIG1lcmdpbmcuXG4gICAqIEBzdW1tYXJ5IEVuc3VyZXMgYXJyYXlzIGFuZCBudWxsIGFyZSBleGNsdWRlZCB3aGlsZSBhY2NlcHRpbmcgb2JqZWN0cyBjcmVhdGVkIHZpYSBsaXRlcmFsL2NsYXNzIHN5bnRheC5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIFZhbHVlIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgd2hlbiB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBpc1BsYWluT2JqZWN0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdyaXRlcyBtZXRhZGF0YSB1bmRlciBhIHN5bWJvbCBrZXkuXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIGhlbHBlciB0aGF0IGVuc3VyZXMgdGhlIG1ldGFkYXRhIGJ1Y2tldCBleGlzdHMgZm9yIHRoZSBwcm92aWRlZCBzeW1ib2wgYW5kIHBlcnNpc3RzIHRoZSBnaXZlbiB2YWx1ZSwgZHJpbGxpbmcgaW50byBuZXN0ZWQgc3RydWN0dXJlcyB3aGVuIHRoZSBrZXkgaXMgYSBzdHJpbmcgcGF0aC5cbiAgICogQHBhcmFtIHtzeW1ib2x9IHN5bWJvbCBTeW1ib2wgcmVwcmVzZW50aW5nIHRoZSBtZXRhZGF0YSBidWNrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0ga2V5IE5lc3RlZCBrZXkgcGF0aCBvciBkaXJlY3Qgc3ltYm9sIHVuZGVyIHdoaWNoIHRvIHN0b3JlIHRoZSBtZXRhZGF0YSB2YWx1ZS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIFZhbHVlIHBlcnNpc3RlZCBpbiB0aGUgbWV0YWRhdGEgc3RvcmUuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBpbm5lclNldChzeW1ib2w6IHN5bWJvbCwga2V5OiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX21ldGFkYXRhW3N5bWJvbF0pIHRoaXMuX21ldGFkYXRhW3N5bWJvbF0gPSB7fSBhcyBhbnk7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gc2V0VmFsdWVCeVNwbGl0dGVyKFxuICAgICAgICB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0aGlzLnNwbGl0dGVyXG4gICAgICApO1xuICAgIHRoaXMuX21ldGFkYXRhW3N5bWJvbF1ba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXcml0ZXMgYSBtZXRhZGF0YSB2YWx1ZSBhdCBhIGdpdmVuIG5lc3RlZCBrZXkgcGF0aC5cbiAgICogQHN1bW1hcnkgRW5zdXJlcyB0aGUgbWV0YWRhdGEgcmVjb3JkIGV4aXN0cyBmb3IgdGhlIGNvbnN0cnVjdG9yLCBtaXJyb3JzIGl0IG9uIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGVuYWJsZWQsIGFuZCBzZXRzIHRoZSBwcm92aWRlZCB2YWx1ZSBvbiB0aGUgbmVzdGVkIGtleSBwYXRoIHVzaW5nIHRoZSBjb25maWd1cmVkIHNwbGl0dGVyLlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fHN0cmluZ30gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIHRvIHdoaWNoIHRoZSBtZXRhZGF0YSBiZWxvbmdzIG9yIGEgZGlyZWN0IGlkZW50aWZpZXIgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IE5lc3RlZCBrZXkgcGF0aCBhdCB3aGljaCB0byBzdG9yZSB0aGUgdmFsdWUuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBWYWx1ZSB0byBzdG9yZSBpbiB0aGUgbWV0YWRhdGEuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0KG1vZGVsOiBDb25zdHJ1Y3RvciB8IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoa2V5ID09PSBEZWNvcmF0aW9uS2V5cy5DT05TVFJVQ1RPUikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCBEZWNvcmF0aW9uS2V5cy5DT05TVFJVQ1RPUiwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBtb2RlbCAhPT0gXCJzdHJpbmdcIikgbW9kZWwgPSB0aGlzLmNvbnN0cihtb2RlbCkgfHwgbW9kZWw7XG4gICAgY29uc3Qgc3ltYm9sID1cbiAgICAgIHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IFN5bWJvbC5mb3IobW9kZWwpIDogdGhpcy5TeW1ib2wobW9kZWwpO1xuICAgIHRoaXMuaW5uZXJTZXQoc3ltYm9sLCBrZXksIHZhbHVlKTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbW9kZWwgIT09IFwic3RyaW5nXCIgJiZcbiAgICAgIE1ldGFkYXRhLm1pcnJvciAmJlxuICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbCwgdGhpcy5iYXNlS2V5KVxuICAgICkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCB0aGlzLmJhc2VLZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIGRlY29yYXRpb24tYXdhcmUgbGlicmFyeSBhbmQgaXRzIHZlcnNpb24uXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgdmVyc2lvbiBzdHJpbmcgZm9yIGFuIGludGVncmF0aW5nIGxpYnJhcnkgdW5kZXIgdGhlIHNoYXJlZCBsaWJyYXJpZXMgbWV0YWRhdGEgc3ltYm9sLCBwcmV2ZW50aW5nIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25zIGZvciB0aGUgc2FtZSBsaWJyYXJ5IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaWJyYXJ5IFBhY2thZ2UgbmFtZSBvciBpZGVudGlmaWVyIHRvIHJlZ2lzdGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiBTZW1hbnRpYyB2ZXJzaW9uIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGxpYnJhcnkuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgbGlicmFyeSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJMaWJyYXJ5KGxpYnJhcnk6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihEZWNvcmF0aW9uS2V5cy5MSUJSQVJJRVMpO1xuICAgIGNvbnN0IGxpYiA9IHRoaXMuaW5uZXJHZXQoc3ltYm9sLCBsaWJyYXJ5KTtcbiAgICBpZiAobGliKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTGlicmFyeSBhbHJlYWR5ICR7bGlicmFyeX0gcmVnaXN0ZXJlZCB3aXRoIHZlcnNpb24gJHt2ZXJzaW9ufWBcbiAgICAgICk7XG4gICAgdGhpcy5pbm5lclNldChzeW1ib2wsIGxpYnJhcnksIHZlcnNpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0cyByZWdpc3RlcmVkIGRlY29yYXRpb24tYXdhcmUgbGlicmFyaWVzLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBpbi1tZW1vcnkgbWFwIG9mIGxpYnJhcnkgaWRlbnRpZmllcnMgdG8gc2VtYW50aWMgdmVyc2lvbnMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBEZWNvcmF0aW9uIG1ldGFkYXRhIHN0b3JlLlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBNYXAgb2YgcmVnaXN0ZXJlZCBsaWJyYXJ5IGlkZW50aWZpZXJzIHRvIHRoZWlyIHZlcnNpb24gc3RyaW5ncy5cbiAgICovXG4gIHN0YXRpYyBsaWJyYXJpZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihEZWNvcmF0aW9uS2V5cy5MSUJSQVJJRVMpO1xuICAgIHJldHVybiB0aGlzLmlubmVyR2V0KHN5bWJvbCkgfHwge307XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEpvaW5zIHBhdGggc2VnbWVudHMgdXNpbmcgdGhlIGN1cnJlbnQgc3BsaXR0ZXIuXG4gICAqIEBzdW1tYXJ5IENvbnN0cnVjdHMgYSBuZXN0ZWQgbWV0YWRhdGEga2V5IGJ5IGNvbmNhdGVuYXRpbmcgc3RyaW5nIHNlZ21lbnRzIHdpdGggdGhlIGNvbmZpZ3VyZWQgc3BsaXR0ZXIgZm9yIHVzZSB3aXRoIHRoZSBtZXRhZGF0YSBzdG9yZS5cbiAgICogQHBhcmFtIHsuLi5zdHJpbmd9IHN0cnMgS2V5IHNlZ21lbnRzIHRvIGpvaW4gaW50byBhIGZ1bGwgbWV0YWRhdGEgcGF0aC5cbiAgICogQHJldHVybiB7c3RyaW5nfSBTcGxpdHRlci1qb2luZWQgbWV0YWRhdGEga2V5LlxuICAgKi9cbiAgc3RhdGljIGtleSguLi5zdHJzOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBzdHJzLmpvaW4odGhpcy5zcGxpdHRlcik7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERlY29yYXRpb25CdWlsZGVyQnVpbGQsXG4gIERlY29yYXRpb25CdWlsZGVyRW5kLFxuICBEZWNvcmF0aW9uQnVpbGRlck1pZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJTdGFydCxcbiAgRmxhdm91clJlc29sdmVyLFxuICBJRGVjb3JhdGlvbkJ1aWxkZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0Rmxhdm91ciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCByZXNvbHZlciB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgZGVmYXVsdCBmbGF2b3VyLlxuICogQHN1bW1hcnkgUmVzb2x2ZXMgdGhlIGZsYXZvdXIgZm9yIGEgZ2l2ZW4gdGFyZ2V0IGJ5IGFsd2F5cyByZXR1cm5pbmcgdGhlIGxpYnJhcnkncyBgRGVmYXVsdEZsYXZvdXJgIHZhbHVlLlxuICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCBUYXJnZXQgb2JqZWN0IGJlaW5nIGRlY29yYXRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gUmVzb2x2ZWQgZmxhdm91ciBpZGVudGlmaWVyLlxuICogQGZ1bmN0aW9uIGRlZmF1bHRGbGF2b3VyUmVzb2x2ZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5mdW5jdGlvbiBkZWZhdWx0Rmxhdm91clJlc29sdmVyKHRhcmdldDogb2JqZWN0KSB7XG4gIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVW5pb24gdHlwZSBjb3ZlcmluZyBzdXBwb3J0ZWQgZGVjb3JhdG9yIGtpbmRzLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbnkgb2YgdGhlIHN0YW5kYXJkIFR5cGVTY3JpcHQgZGVjb3JhdG9yIHNpZ25hdHVyZXMgKGNsYXNzLCBwcm9wZXJ0eSwgb3IgbWV0aG9kKSwgZW5hYmxpbmcgZmxleGlibGUgcmVnaXN0cmF0aW9uIGFuZCBhcHBsaWNhdGlvbiB3aXRoaW4gdGhlIERlY29yYXRpb24gc3lzdGVtLlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlRGVmIERlY29yYXRvclR5cGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgRGVjb3JhdG9yVHlwZXMgPVxuICB8IENsYXNzRGVjb3JhdG9yXG4gIHwgUHJvcGVydHlEZWNvcmF0b3JcbiAgfCBNZXRob2REZWNvcmF0b3I7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgZGVmaW5pdGlvbiBmb3IgYSBkZWNvcmF0b3IgZmFjdG9yeSBmdW5jdGlvbi5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYXJiaXRyYXJ5IGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIGNvbmNyZXRlIGRlY29yYXRvciBmdW5jdGlvbiB0byBiZSBhcHBsaWVkIHRvIGEgdGFyZ2V0LlxuICogQHRlbXBsYXRlIEFcbiAqIEB0eXBlRGVmIERlY29yYXRvckZhY3RvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JGYWN0b3J5ID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBEZWNvcmF0b3JUeXBlcztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQXJndW1lbnQgYnVuZGxlIGZvciBhIGRlY29yYXRvciBmYWN0b3J5LlxuICogQHN1bW1hcnkgT2JqZWN0IGZvcm0gdXNlZCB0byBkZWZlciBkZWNvcmF0b3IgY3JlYXRpb24sIGNhcnJ5aW5nIGJvdGggdGhlIGZhY3RvcnkgZnVuY3Rpb24gYW5kIGl0cyBhcmd1bWVudCBsaXN0IHRvIGJlIGludm9rZWQgbGF0ZXIgZHVyaW5nIGFwcGxpY2F0aW9uLlxuICogQHR5cGVEZWYgRGVjb3JhdG9yRmFjdG9yeUFyZ3NcbiAqIEBwcm9wZXJ0eSB7RGVjb3JhdG9yRmFjdG9yeX0gZGVjb3JhdG9yIEZhY3RvcnkgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhIGRlY29yYXRvciB3aGVuIGludm9rZWQuXG4gKiBAcHJvcGVydHkge2FueVtdfSBhcmdzIExpc3Qgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGRlY29yYXRvciBmYWN0b3J5LlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIERlY29yYXRvckZhY3RvcnlBcmdzID0ge1xuICBkZWNvcmF0b3I6IERlY29yYXRvckZhY3Rvcnk7XG4gIGFyZ3M6IGFueVtdO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVW5pb24gdGhhdCByZXByZXNlbnRzIGVpdGhlciBhIHJlYWR5LXRvLWFwcGx5IGRlY29yYXRvciBvciBhIGZhY3Rvcnkgd2l0aCBhcmd1bWVudHMuXG4gKiBAc3VtbWFyeSBBbGxvd3MgcmVnaXN0ZXJpbmcgZGVjb3JhdG9ycyBpbiB0d28gZm9ybXM6IGFzIGRpcmVjdCBkZWNvcmF0b3IgZnVuY3Rpb25zIG9yIGFzIGRlZmVycmVkIGZhY3RvcmllcyBwYWlyZWQgd2l0aCB0aGVpciBhcmd1bWVudCBsaXN0cyBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvbi5cbiAqIEB0eXBlRGVmIERlY29yYXRvckRhdGFcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JEYXRhID0gRGVjb3JhdG9yVHlwZXMgfCBEZWNvcmF0b3JGYWN0b3J5QXJncztcbmV4cG9ydCB0eXBlIEV4dGVuZERlY29yYXRvckRhdGEgPVxuICB8IERlY29yYXRvclR5cGVzXG4gIHwgT21pdDxEZWNvcmF0b3JGYWN0b3J5QXJncywgXCJhcmdzXCI+O1xudHlwZSBTdG9yZWREZWNvcmF0b3JEYXRhID0gRGVjb3JhdG9yRGF0YSB8IEV4dGVuZERlY29yYXRvckRhdGE7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIGRlY29yYXRvciBtYW5hZ2VtZW50IGNsYXNzIHRoYXQgaGFuZGxlcyBmbGF2b3VyZWQgZGVjb3JhdG9ycy5cbiAqIEBzdW1tYXJ5IFRoZSBEZWNvcmF0aW9uIGNsYXNzIHByb3ZpZGVzIGEgYnVpbGRlciBwYXR0ZXJuIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgZGVjb3JhdG9ycyB3aXRoIGRpZmZlcmVudCBmbGF2b3Vycy4gSXQgc3VwcG9ydHMgcmVnaXN0ZXJpbmcsIGV4dGVuZGluZywgYW5kIGFwcGx5aW5nIGRlY29yYXRvcnMgd2l0aCBjb250ZXh0LWF3YXJlIGZsYXZvdXIgcmVzb2x1dGlvbiwgYWxsb3dpbmcgZnJhbWV3b3JrLXNwZWNpZmljIGltcGxlbWVudGF0aW9ucyB3aGlsZSBtYWludGFpbmluZyBhIGNvbnNpc3RlbnQgQVBJLlxuICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgZGVjb3JhdG9yIChDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cj1EZWZhdWx0Rmxhdm91cl0gT3B0aW9uYWwgZmxhdm91ciBwYXJhbWV0ZXIgZm9yIHRoZSBkZWNvcmF0b3IgY29udGV4dC5cbiAqIEBjbGFzc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBkZWNvcmF0aW9uIGZvciAnY29tcG9uZW50JyB3aXRoIGRlZmF1bHQgZmxhdm91clxuICogY29uc3QgY29tcG9uZW50RGVjb3JhdG9yID0gbmV3IERlY29yYXRpb24oKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKGN1c3RvbUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQ3JlYXRlIGEgZmxhdm91cmVkIGRlY29yYXRpb25cbiAqIGNvbnN0IHZ1ZUNvbXBvbmVudCA9IG5ldyBEZWNvcmF0aW9uKCd2dWUnKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKHZ1ZUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQXBwbHkgdGhlIGRlY29yYXRpb25cbiAqIEBjb21wb25lbnREZWNvcmF0b3JcbiAqIGNsYXNzIE15Q29tcG9uZW50IHt9XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEZWNvcmF0aW9uXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgRmxhdm91clJlc29sdmVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgRGVjb3JhdG9yRmFjdG9yeVxuICpcbiAqICAgQy0+PkQ6IG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpXG4gKiAgIEMtPj5EOiBmb3Ioa2V5KVxuICogICBDLT4+RDogZGVmaW5lKGRlY29yYXRvcnMpXG4gKiAgIEQtPj5EOiByZWdpc3RlcihrZXksIGZsYXZvdXIsIGRlY29yYXRvcnMpXG4gKiAgIEQtPj5GOiBkZWNvcmF0b3JGYWN0b3J5KGtleSwgZmxhdm91cilcbiAqICAgRi0+PlI6IHJlc29sdmUodGFyZ2V0KVxuICogICBSLS0+PkY6IHJlc29sdmVkIGZsYXZvdXJcbiAqICAgRi0+PkY6IGFwcGx5IGRlY29yYXRvcnNcbiAqICAgRi0tPj5DOiBkZWNvcmF0ZWQgdGFyZ2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNvcmF0aW9uIGltcGxlbWVudHMgSURlY29yYXRpb25CdWlsZGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWFwIG9mIHJlZ2lzdGVyZWQgZGVjb3JhdG9ycy5cbiAgICogQHN1bW1hcnkgU3RvcmVzIGFsbCByZWdpc3RlcmVkIGRlY29yYXRvcnMgb3JnYW5pc2VkIGJ5IGtleSBhbmQgZmxhdm91ci5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRlY29yYXRvcnM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAge1xuICAgICAgICBkZWNvcmF0b3JzPzogU2V0PERlY29yYXRvckRhdGE+O1xuICAgICAgICBleHRyYXM/OiBTZXQ8U3RvcmVkRGVjb3JhdG9yRGF0YT47XG4gICAgICB9XG4gICAgPlxuICA+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byByZXNvbHZlIGZsYXZvdXIgZnJvbSBhIHRhcmdldC5cbiAgICogQHN1bW1hcnkgUmVzb2x2ZXIgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHRoZSBhcHByb3ByaWF0ZSBmbGF2b3VyIGZvciBhIGdpdmVuIHRhcmdldC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZsYXZvdXJSZXNvbHZlcjogRmxhdm91clJlc29sdmVyID0gZGVmYXVsdEZsYXZvdXJSZXNvbHZlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldCBvZiBkZWNvcmF0b3JzIGZvciB0aGUgY3VycmVudCBjb250ZXh0LlxuICAgKi9cbiAgcHJpdmF0ZSBkZWNvcmF0b3JzPzogU2V0PERlY29yYXRvckRhdGE+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0IG9mIGFkZGl0aW9uYWwgZGVjb3JhdG9ycy5cbiAgICovXG4gIHByaXZhdGUgZXh0cmFzPzogU2V0PFN0b3JlZERlY29yYXRvckRhdGE+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCBkZWNvcmF0b3Iga2V5LlxuICAgKi9cbiAgcHJpdmF0ZSBrZXk/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmbGF2b3VyOiBzdHJpbmcgPSBEZWZhdWx0Rmxhdm91cikge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGtleSBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlci5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGlzZXMgYSBuZXcgZGVjb3JhdGlvbiBjaGFpbiB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IElkZW50aWZpZXIgZm9yIHRoZSBkZWNvcmF0b3IuXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyTWlkfSBCdWlsZGVyIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBmb3Ioa2V5OiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlck1pZCB7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgZGVjb3JhdG9ycyB0byB0aGUgY3VycmVudCBjb250ZXh0LlxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBtZXRob2QgdG8gYWRkIGRlY29yYXRvcnMgd2l0aCBhZGRvbiBzdXBwb3J0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthZGRvbj1mYWxzZV0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRlY29yYXRvcnMgYXJlIGFkZGl0aXZlIGV4dHJhcy5cbiAgICogQHBhcmFtIHsuLi5EZWNvcmF0b3JEYXRhfSBkZWNvcmF0b3JzIERlY29yYXRvcnMgdG8gcmVnaXN0ZXIgZm9yIHRoZSBjb25maWd1cmVkIGtleS5cbiAgICogQHJldHVybiB7dGhpc30gQ3VycmVudCBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBwcml2YXRlIGRlY29yYXRlKFxuICAgIGFkZG9uOiBib29sZWFuID0gZmFsc2UsXG4gICAgLi4uZGVjb3JhdG9yczogU3RvcmVkRGVjb3JhdG9yRGF0YVtdXG4gICk6IHRoaXMge1xuICAgIGlmICghdGhpcy5rZXkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJrZXkgbXVzdCBiZSBwcm92aWRlZCBiZWZvcmUgZGVjb3JhdG9ycyBjYW4gYmUgYWRkZWRcIik7XG4gICAgaWYgKFxuICAgICAgKCFkZWNvcmF0b3JzIHx8ICFkZWNvcmF0b3JzLmxlbmd0aCkgJiZcbiAgICAgICFhZGRvbiAmJlxuICAgICAgdGhpcy5mbGF2b3VyICE9PSBEZWZhdWx0Rmxhdm91clxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJNdXN0IHByb3ZpZGUgb3ZlcnJpZGVzIG9yIGFkZG9ucyB0byBvdmVycmlkZSBvciBleHRlbmQgZGVjYWYncyBkZWNvcmF0b3JzXCJcbiAgICAgICk7XG4gICAgKHRoaXMgYXMgYW55KVthZGRvbiA/IFwiZXh0cmFzXCIgOiBcImRlY29yYXRvcnNcIl0gPSBuZXcgU2V0KFtcbiAgICAgIC4uLih0aGlzW2FkZG9uID8gXCJleHRyYXNcIiA6IFwiZGVjb3JhdG9yc1wiXSB8fCBuZXcgU2V0KCkpLnZhbHVlcygpLFxuICAgICAgLi4uZGVjb3JhdG9ycyxcbiAgICBdKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIHRoZSBiYXNlIGRlY29yYXRvcnMuXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIHByaW1hcnkgZGVjb3JhdG9ycyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgICogQHBhcmFtIHsuLi5EZWNvcmF0b3JEYXRhfSBkZWNvcmF0b3JzIERlY29yYXRvcnMgdG8gZGVmaW5lLlxuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlckVuZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgZmluaXNoaW5nIHRoZSBjaGFpbiAoYWxzbyBpbXBsZW1lbnRzIERlY29yYXRpb25CdWlsZGVyQnVpbGQpLlxuICAgKi9cbiAgZGVmaW5lKFxuICAgIC4uLmRlY29yYXRvcnM6IERlY29yYXRvckRhdGFbXVxuICApOiBEZWNvcmF0aW9uQnVpbGRlckVuZCAmIERlY29yYXRpb25CdWlsZGVyQnVpbGQge1xuICAgIGlmIChcbiAgICAgIGRlY29yYXRvcnMuZmluZCgoZCkgPT4gdHlwZW9mIGQgPT09IFwib2JqZWN0XCIpICYmXG4gICAgICBkZWNvcmF0b3JzLmxlbmd0aCAhPT0gMVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFdoZW4gdXNpbmcgYW4gb3ZlcnJpZGFibGUgZGVjb3JhdG9yLCBvbmx5IG9uZSBpcyBhbGxvd2VkYFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZShmYWxzZSwgLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4dGVuZHMgZXhpc3RpbmcgZGVjb3JhdG9ycy5cbiAgICogQHN1bW1hcnkgQWRkcyBhZGRpdGlvbmFsIGRlY29yYXRvcnMgdG8gdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgICogQHBhcmFtIHsuLi5EZWNvcmF0b3JEYXRhfSBkZWNvcmF0b3JzIEFkZGl0aW9uYWwgZGVjb3JhdG9ycyB0byByZWdpc3RlciBhcyBhZGRvbnMuXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyQnVpbGR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIGJ1aWxkaW5nIHRoZSBkZWNvcmF0b3IuXG4gICAqL1xuICBleHRlbmQoLi4uZGVjb3JhdG9yczogRXh0ZW5kRGVjb3JhdG9yRGF0YVtdKTogRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCB7XG4gICAgaWYgKFxuICAgICAgZGVjb3JhdG9ycy5maW5kKChkKSA9PiB0eXBlb2YgZCA9PT0gXCJvYmplY3RcIikgJiZcbiAgICAgIGRlY29yYXRvcnMubGVuZ3RoICE9PSAxXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgV2hlbiBleHRlbmRpbmcgdXNpbmcgYW4gb3ZlcnJpZGFibGUgZGVjb3JhdG9yLCBvbmx5IG9uZSBpcyBhbGxvd2VkYFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZSh0cnVlLCAuLi5kZWNvcmF0b3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSBjb250ZXh0LWF3YXJlIGRlY29yYXRvciBmb3IgYSBrZXkvZmxhdm91ci5cbiAgICogQHN1bW1hcnkgUHJvZHVjZXMgYSBkZWNvcmF0b3IgZnVuY3Rpb24gYm91bmQgdG8gdGhlIHByb3ZpZGVkIGtleSBhbmQgZmxhdm91ci4gVGhlIHJlc3VsdGluZyBkZWNvcmF0b3IgcmVzb2x2ZXMgdGhlIGFjdHVhbCBkZWNvcmF0b3JzIHRvIGFwcGx5IGF0IGludm9jYXRpb24gdGltZSBiYXNlZCBvbiB0aGUgdGFyZ2V0J3MgcmVzb2x2ZWQgZmxhdm91ciBhbmQgdGhlIHJlZ2lzdGVyZWQgYmFzZSBhbmQgZXh0cmEgZGVjb3JhdG9ycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBEZWNvcmF0aW9uIGtleSB1c2VkIHRvIGxvb2sgdXAgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Y9RGVmYXVsdEZsYXZvdXJdIEV4cGxpY2l0IGZsYXZvdXIgdG8gYmluZCB0aGUgZmFjdG9yeSB0by5cbiAgICogQHJldHVybiB7Q2xhc3NEZWNvcmF0b3J8TWV0aG9kRGVjb3JhdG9yfFByb3BlcnR5RGVjb3JhdG9yfFBhcmFtZXRlckRlY29yYXRvcn0gRGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgYXBwbGllcyB0aGUgcmVzb2x2ZWQgZGVjb3JhdG9ycy5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyIENvZGVcbiAgICogICBwYXJ0aWNpcGFudCBCIGFzIERlY29yYXRpb24gKGJ1aWxkZXIpXG4gICAqICAgcGFydGljaXBhbnQgRiBhcyBkZWNvcmF0b3JGYWN0b3J5KGtleSwgZilcbiAgICogICBwYXJ0aWNpcGFudCBSIGFzIGZsYXZvdXJSZXNvbHZlclxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQXBwbGllZCBEZWNvcmF0b3JzXG4gICAqICAgVS0+PkI6IGRlZmluZSgpL2V4dGVuZCgpIGFuZCBhcHBseSgpXG4gICAqICAgQi0+PkY6IGNyZWF0ZSBjb250ZXh0IGRlY29yYXRvclxuICAgKiAgIEYtPj5SOiByZXNvbHZlKHRhcmdldClcbiAgICogICBSLS0+PkY6IGZsYXZvdXJcbiAgICogICBGLT4+QTogY29sbGVjdCBiYXNlICsgZXh0cmFzXG4gICAqICAgbG9vcCBlYWNoIGRlY29yYXRvclxuICAgKiAgICAgQS0+PlU6IGludm9rZSBkZWNvcmF0b3IodGFyZ2V0LCBrZXk/LCBkZXNjPylcbiAgICogICBlbmRcbiAgICovXG4gIHByb3RlY3RlZCBkZWNvcmF0b3JGYWN0b3J5KGtleTogc3RyaW5nLCBmOiBzdHJpbmcgPSBEZWZhdWx0Rmxhdm91cikge1xuICAgIGZ1bmN0aW9uIGNvbnRleHREZWNvcmF0b3IoXG4gICAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgICApIHtcbiAgICAgIGNvbnN0IGZsYXZvdXIgPSBEZWNvcmF0aW9uLmZsYXZvdXJSZXNvbHZlcih0YXJnZXQpO1xuICAgICAgY29uc3QgY2FjaGUgPSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XTtcbiAgICAgIGxldCBkZWNvcmF0b3JzO1xuICAgICAgY29uc3QgZXh0cmFzID0gY2FjaGVbZmxhdm91cl1cbiAgICAgICAgPyBjYWNoZVtmbGF2b3VyXS5leHRyYXNcbiAgICAgICAgOiBjYWNoZVtEZWZhdWx0Rmxhdm91cl0uZXh0cmFzO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGNhY2hlICYmXG4gICAgICAgIGNhY2hlW2ZsYXZvdXJdICYmXG4gICAgICAgIGNhY2hlW2ZsYXZvdXJdLmRlY29yYXRvcnMgJiZcbiAgICAgICAgY2FjaGVbZmxhdm91cl0uZGVjb3JhdG9ycy5zaXplXG4gICAgICApIHtcbiAgICAgICAgZGVjb3JhdG9ycyA9IGNhY2hlW2ZsYXZvdXJdLmRlY29yYXRvcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvcmF0b3JzID0gY2FjaGVbRGVmYXVsdEZsYXZvdXJdLmRlY29yYXRvcnM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VEZWNvcmF0b3JzTGlzdCA9IFsuLi4oZGVjb3JhdG9ycyA/IGRlY29yYXRvcnMudmFsdWVzKCkgOiBbXSldO1xuXG4gICAgICBjb25zdCBkZWZhdWx0RGVjb3JhdG9yc0xpc3QgPSBbXG4gICAgICAgIC4uLihjYWNoZVtEZWZhdWx0Rmxhdm91cl0/LmRlY29yYXRvcnMgfHwgbmV3IFNldCgpKS52YWx1ZXMoKSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IGJhc2VBcmdzQnlJbmRleCA9IGJhc2VEZWNvcmF0b3JzTGlzdC5yZWR1Y2UoXG4gICAgICAgIChhY2N1bSwgZW50cnksIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGVudHJ5ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBcImFyZ3NcIiBpbiAoZW50cnkgYXMgYW55KSAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheSgoZW50cnkgYXMgYW55KS5hcmdzKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYWNjdW1baW5kZXhdID0gKGVudHJ5IGFzIGFueSkuYXJncztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9LFxuICAgICAgICB7fSBhcyBSZWNvcmQ8bnVtYmVyLCBhbnlbXT5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRlZmF1bHRBcmdzQnlJbmRleCA9IGRlZmF1bHREZWNvcmF0b3JzTGlzdC5yZWR1Y2UoXG4gICAgICAgIChhY2N1bSwgZW50cnksIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGVudHJ5ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBcImFyZ3NcIiBpbiAoZW50cnkgYXMgYW55KSAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheSgoZW50cnkgYXMgYW55KS5hcmdzKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYWNjdW1baW5kZXhdID0gKGVudHJ5IGFzIGFueSkuYXJncztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9LFxuICAgICAgICB7fSBhcyBSZWNvcmQ8bnVtYmVyLCBhbnlbXT5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHRvQXBwbHkgPSBbXG4gICAgICAgIC4uLmJhc2VEZWNvcmF0b3JzTGlzdCxcbiAgICAgICAgLi4uKGV4dHJhcyA/IGV4dHJhcy52YWx1ZXMoKSA6IFtdKSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IGJhc2VMZW5ndGggPSBiYXNlRGVjb3JhdG9yc0xpc3QubGVuZ3RoO1xuXG4gICAgICByZXR1cm4gdG9BcHBseS5yZWR1Y2UoXG4gICAgICAgIChfLCBkLCBpbmRleCkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGQgYXMgYW55O1xuICAgICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVJbmRleCA9IGluZGV4IDwgYmFzZUxlbmd0aCA/IGluZGV4IDogMDtcbiAgICAgICAgICAgICAgY29uc3QgYXJncyA9XG4gICAgICAgICAgICAgICAgXCJhcmdzXCIgaW4gZW50cnkgJiYgQXJyYXkuaXNBcnJheShlbnRyeS5hcmdzKVxuICAgICAgICAgICAgICAgICAgPyBlbnRyeS5hcmdzXG4gICAgICAgICAgICAgICAgICA6IChiYXNlQXJnc0J5SW5kZXhbY2FuZGlkYXRlSW5kZXhdID8/XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRBcmdzQnlJbmRleFtjYW5kaWRhdGVJbmRleF0gPz9cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEFyZ3NCeUluZGV4WzBdID8/XG4gICAgICAgICAgICAgICAgICAgIFtdKTtcblxuICAgICAgICAgICAgICByZXR1cm4gKGVudHJ5LmRlY29yYXRvciguLi5hcmdzKSBhcyBhbnkpKFxuICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgcmV0dXJuIChkIGFzIGFueSkodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZGVjb3JhdG9yIHR5cGU6ICR7dHlwZW9mIGR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7IHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IgfVxuICAgICAgKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRleHREZWNvcmF0b3IsIFwibmFtZVwiLCB7XG4gICAgICB2YWx1ZTogW2YsIGtleV0uam9pbihcIl9kZWNvcmF0b3JfZm9yX1wiKSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gY29udGV4dERlY29yYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgZmluYWwgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICAgKiBAc3VtbWFyeSBCdWlsZHMgYW5kIHJldHVybnMgdGhlIGRlY29yYXRvciBmYWN0b3J5IGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJuIHtDbGFzc0RlY29yYXRvcnxNZXRob2REZWNvcmF0b3J8UHJvcGVydHlEZWNvcmF0b3J8UGFyYW1ldGVyRGVjb3JhdG9yfSBHZW5lcmF0ZWQgZGVjb3JhdG9yIGZ1bmN0aW9uIHJlYWR5IGZvciBhcHBsaWNhdGlvbi5cbiAgICovXG4gIGFwcGx5KCk6IChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApID0+IGFueSB7XG4gICAgaWYgKCF0aGlzLmtleSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGtleSBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICBjb25zdCBleGlzdGluZ0RlY29yYXRvcnMgPVxuICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW3RoaXMua2V5XT8uW3RoaXMuZmxhdm91cl0/LmRlY29yYXRvcnM7XG4gICAgY29uc3QgZGVjb3JhdG9yc1RvUmVnaXN0ZXIgPVxuICAgICAgdGhpcy5kZWNvcmF0b3JzIHx8IGV4aXN0aW5nRGVjb3JhdG9ycyB8fCBuZXcgU2V0PERlY29yYXRvckRhdGE+KCk7XG5cbiAgICBEZWNvcmF0aW9uLnJlZ2lzdGVyKFxuICAgICAgdGhpcy5rZXksXG4gICAgICB0aGlzLmZsYXZvdXIsXG4gICAgICBkZWNvcmF0b3JzVG9SZWdpc3RlcixcbiAgICAgIHRoaXMuZXh0cmFzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0b3JGYWN0b3J5KHRoaXMua2V5LCB0aGlzLmZsYXZvdXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgZGVjb3JhdG9ycyBmb3IgYSBzcGVjaWZpYyBrZXkgYW5kIGZsYXZvdXIuXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIG1ldGhvZCB0byBzdG9yZSBkZWNvcmF0b3JzIGluIHRoZSBzdGF0aWMgcmVnaXN0cnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgRGVjb3JhdG9yIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgRGVjb3JhdG9yIGZsYXZvdXIuXG4gICAqIEBwYXJhbSB7U2V0PERlY29yYXRvckRhdGE+fSBbZGVjb3JhdG9yc10gUHJpbWFyeSBkZWNvcmF0b3JzIHJlZ2lzdGVyZWQgZm9yIHRoZSBrZXkuXG4gICAqIEBwYXJhbSB7U2V0PERlY29yYXRvckRhdGE+fSBbZXh0cmFzXSBBZGRpdGlvbmFsIGRlY29yYXRvcnMgcmVnaXN0ZXJlZCBhcyBmbGF2b3VyLXNwZWNpZmljIGFkZG9ucy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZsYXZvdXI6IHN0cmluZyxcbiAgICBkZWNvcmF0b3JzPzogU2V0PERlY29yYXRvckRhdGE+LFxuICAgIGV4dHJhcz86IFNldDxTdG9yZWREZWNvcmF0b3JEYXRhPlxuICApIHtcbiAgICBpZiAoIWtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8ga2V5IHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIH1cbiAgICBpZiAoIWRlY29yYXRvcnMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBkZWNvcmF0b3JzIHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIGlmICghZmxhdm91cilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGZsYXZvdXIgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG5cbiAgICBpZiAoIURlY29yYXRpb24uZGVjb3JhdG9yc1trZXldKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XSA9IHt9O1xuICAgIGlmICghRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0pXG4gICAgICBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXSA9IHt9O1xuICAgIGlmIChkZWNvcmF0b3JzKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycztcbiAgICBpZiAoZXh0cmFzKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5leHRyYXMgPSBleHRyYXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGdsb2JhbCBmbGF2b3VyIHJlc29sdmVyLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBkZWNvcmF0b3IgZmxhdm91cnMuXG4gICAqIEBwYXJhbSB7Rmxhdm91clJlc29sdmVyfSByZXNvbHZlciBGdW5jdGlvbiB0byByZXNvbHZlIGZsYXZvdXJzLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldEZsYXZvdXJSZXNvbHZlcihyZXNvbHZlcjogRmxhdm91clJlc29sdmVyKSB7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVuaWVuY2Ugc3RhdGljIGVudHJ5IHRvIHN0YXJ0IGEgZGVjb3JhdGlvbiBidWlsZGVyLlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IERlY29yYXRpb24gaW5zdGFuY2UgYW5kIGluaXRpYXRlcyB0aGUgYnVpbGRlciBjaGFpbiB3aXRoIHRoZSBwcm92aWRlZCBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgRGVjb3JhdGlvbiBrZXkgdG8gY29uZmlndXJlLlxuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlck1pZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgZm9yKGtleTogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJNaWQge1xuICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbigpLmZvcihrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgYSBidWlsZGVyIGZvciBhIHNwZWNpZmljIGZsYXZvdXIuXG4gICAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIG1ldGhvZCB0byBiZWdpbiBhIERlY29yYXRpb24gYnVpbGRlciBjaGFpbiBib3VuZCB0byB0aGUgZ2l2ZW4gZmxhdm91ciBpZGVudGlmaWVyLCBhbGxvd2luZyByZWdpc3RyYXRpb24gb2YgZmxhdm91ci1zcGVjaWZpYyBkZWNvcmF0b3JzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciBGbGF2b3VyIG5hbWUgdG8gYmluZCB0byB0aGUgYnVpbGRlci5cbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJTdGFydH0gQnVpbGRlciBzdGFydCBpbnRlcmZhY2UgdG8gY29udGludWUgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyBmbGF2b3VyZWRBcyhmbGF2b3VyOiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlclN0YXJ0IHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZmxhdm91cik7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIi4vbWV0YWRhdGEvTWV0YWRhdGFcIjtcbmltcG9ydCB7IERlY29yYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uIH0gZnJvbSBcIi4vZGVjb3JhdGlvbi9EZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFzc2lnbnMgYXJiaXRyYXJ5IG1ldGFkYXRhIHRvIGEgdGFyZ2V0IHVzaW5nIGEgc3RyaW5nIGtleS5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciBmYWN0b3J5IHRoYXQgc3RvcmVzIGEga2V5L3ZhbHVlIHBhaXIgaW4gdGhlIGNlbnRyYWwgbWV0YWRhdGEgc3RvcmUgZm9yIHRoZSBwcm92aWRlZCBjbGFzcyBvciBtZW1iZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IE1ldGFkYXRhIGtleSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdGFyZ2V0LlxuICogQHBhcmFtIHthbnl9IHZhbHVlIE1ldGFkYXRhIHZhbHVlIHRvIHN0b3JlIHVuZGVyIHRoZSBnaXZlbiBrZXkuXG4gKiBAcmV0dXJuIHtDbGFzc0RlY29yYXRvcnxNZXRob2REZWNvcmF0b3J8UHJvcGVydHlEZWNvcmF0b3J8UGFyYW1ldGVyRGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCB3cml0ZXMgdGhlIG1ldGFkYXRhIHdoZW4gYXBwbGllZC5cbiAqIEBmdW5jdGlvbiBtZXRhZGF0YVxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldGFkYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHJldHVybiBmdW5jdGlvbiBtZXRhZGF0YShcbiAgICBtb2RlbDogYW55LFxuXG4gICAgcHJvcD86IGFueSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvciB8IG51bWJlclxuICApIHtcbiAgICBNZXRhZGF0YS5zZXQocHJvcCA/IG1vZGVsLmNvbnN0cnVjdG9yIDogbW9kZWwsIGtleSwgdmFsdWUpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDYXB0dXJlcyBhbmQgc3RvcmVzIGEgcHJvcGVydHkncyBkZXNpZ24gdHlwZS5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciBmYWN0b3J5IHRoYXQgcmVhZHMgdGhlIHJlZmxlY3RlZCBgZGVzaWduOnR5cGVgIGZvciBhIHByb3BlcnR5IGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIG1ldGFkYXRhIHN0b3JlIHVuZGVyIHRoZSBwcm9wZXJ0aWVzIG1hcC5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCByZWNvcmRzIHRoZSBwcm9wZXJ0eSdzIHR5cGUgbWV0YWRhdGEgd2hlbiBhcHBsaWVkLlxuICogQGZ1bmN0aW9uIHByb3BcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wKCkge1xuICBmdW5jdGlvbiBpbm5lclByb3AoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyUHJvcChtb2RlbDogb2JqZWN0LCBwcm9wPzogYW55KSB7XG4gICAgICBjb25zdCBkZXNpZ25UeXBlID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcbiAgICAgICAgRGVjb3JhdGlvbktleXMuREVTSUdOX1RZUEUsXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBwcm9wXG4gICAgICApO1xuICAgICAgcmV0dXJuIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoRGVjb3JhdGlvbktleXMuUFJPUEVSVElFUywgcHJvcCksXG4gICAgICAgIGRlc2lnblR5cGVcbiAgICAgICkobW9kZWwsIHByb3ApO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRGVjb3JhdGlvbktleXMuUFJPUEVSVElFUylcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogaW5uZXJQcm9wLFxuICAgICAgYXJnczogW10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2FwdHVyZXMgYSBzaW5nbGUgcGFyYW1ldGVyIHR5cGUgZm9yIHRoZSBkZWNvcmF0ZWQgbWV0aG9kLlxuICogQHN1bW1hcnkgRGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBlbnN1cmVzIHRoZSBtZXRob2QgbWV0YWRhdGEgaXMgaW5pdGlhbGlzZWQgYW5kIHN0b3JlcyB0aGUgcmVmbGVjdGVkIHBhcmFtZXRlciBjb25zdHJ1Y3RvciBhdCB0aGUgcHJvdmlkZWQgaW5kZXguXG4gKiBAcmV0dXJuIHtQYXJhbWV0ZXJEZWNvcmF0b3J9IERlY29yYXRvciB0aGF0IHJlY29yZHMgdGhlIHBhcmFtZXRlciB0eXBlIHdoZW4gYXBwbGllZC5cbiAqIEBmdW5jdGlvbiBwYXJhbVxuICogQGNhdGVnb3J5IFBhcmFtZXRlciBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlciBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IFAgYXMgcGFyYW0oKVxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1ldGFkYXRhXG4gKiAgIFUtPj5QOiBwYXJhbSgpKHRhcmdldCwga2V5LCBpbmRleClcbiAqICAgUC0+PlU6IG1ldGhvZCgpKHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKVxuICogICBQLT4+TTogcGFyYW1zKGNvbnN0cnVjdG9yLCBrZXkpXG4gKiAgIE0tLT4+UDogcGFyYW1ldGVyIGNvbnN0cnVjdG9yc1tdXG4gKiAgIFAtPj5NOiBzZXQobWV0aG9kcy5rZXkuaW5kZXgsIGNvbnN0cnVjdG9yKVxuICogICBQLS0+PlU6IHBhcmFtZXRlciByZWNvcmRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyYW0oKSB7XG4gIHJldHVybiBmdW5jdGlvbiBwYXJhbShcbiAgICBtb2RlbDogb2JqZWN0LFxuICAgIHByb3A6IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZCxcbiAgICBpbmRleDogbnVtYmVyXG4gICkge1xuICAgIGlmICghcHJvcClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEBwYXJhbSBkZWNvcmF0b3IgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBtZXRob2RzYCk7XG4gICAgbWV0aG9kKCkobW9kZWwsIHByb3AsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobW9kZWwsIHByb3ApKTtcbiAgICBjb25zdCBwYXJhbVRwZXMgPSBNZXRhZGF0YS5wYXJhbXMobW9kZWwuY29uc3RydWN0b3IgYXMgYW55LCBwcm9wIGFzIHN0cmluZyk7XG4gICAgaWYgKCFwYXJhbVRwZXMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcGFyYW1ldGVyIHR5cGVzIGZvciAke1N0cmluZyhwcm9wKX1gKTtcbiAgICBpZiAoaW5kZXggPj0gcGFyYW1UcGVzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFBhcmFtZXRlciBpbmRleCAke2luZGV4fSBvdXQgb2YgcmFuZ2UgZm9yICR7U3RyaW5nKHByb3ApfWBcbiAgICAgICk7XG4gICAgbWV0YWRhdGEoXG4gICAgICBNZXRhZGF0YS5rZXkoRGVjb3JhdGlvbktleXMuTUVUSE9EUywgcHJvcCBhcyBzdHJpbmcsIGluZGV4LnRvU3RyaW5nKCkpLFxuICAgICAgcGFyYW1UcGVzW2luZGV4XVxuICAgICkobW9kZWwsIHByb3ApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeHRlbmRzIGEgcGFyYW1ldGVyIGRlY29yYXRvciB3aXRoIGFkZGl0aW9uYWwgbWV0YWRhdGEuXG4gKiBAc3VtbWFyeSBBcHBsaWVzIHRoZSBkZWZhdWx0IGBwYXJhbSgpYCBkZWNvcmF0b3IgYW5kIGF1Z21lbnRzIHRoZSBzdG9yZWQgbWV0YWRhdGEgd2l0aCBhbiBhcmJpdHJhcnkga2V5L3ZhbHVlIHBhaXIuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IE1ldGFkYXRhIGtleSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcGFyYW1ldGVyLlxuICogQHBhcmFtIHthbnl9IHZhbHVlIE1ldGFkYXRhIHZhbHVlIHBlcnNpc3RlZCB1bmRlciB0aGUgZ2l2ZW4ga2V5LlxuICogQHJldHVybiB7UGFyYW1ldGVyRGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCByZWNvcmRzIGJvdGggdGhlIHBhcmFtZXRlciBkZXNpZ24gdHlwZSBhbmQgYWRkaXRpb25hbCBtZXRhZGF0YS5cbiAqIEBmdW5jdGlvbiBwYXJhbU1ldGFkYXRhXG4gKiBAY2F0ZWdvcnkgUGFyYW1ldGVyIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcmFtTWV0YWRhdGEoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHBhcmFtTWV0YWRhdGEodGFyZ2V0OiBhbnksIHByb3A6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHBhcmFtKCksXG4gICAgICBtZXRhZGF0YShNZXRhZGF0YS5rZXkoRGVjb3JhdGlvbktleXMuTUVUSE9EUywgcHJvcCwga2V5KSwgdmFsdWUpXG4gICAgKSh0YXJnZXQsIHByb3AsIGluZGV4KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVjb3JkcyBtZXRob2QgZGVzaWduLXRpbWUgbWV0YWRhdGEuXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGNhcHR1cmVzIGEgbWV0aG9kJ3MgcmVmbGVjdGVkIHBhcmFtZXRlciBhbmQgcmV0dXJuIHR5cGVzLCBzdG9yaW5nIHRoZW0gdW5kZXIgdGhlIGFwcHJvcHJpYXRlIG1ldGFkYXRhIGtleXMgc28gdGhleSBjYW4gYmUgaW5zcGVjdGVkIGF0IHJ1bnRpbWUuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IERlY29yYXRvciB0aGF0IHBlcnNpc3RzIHRoZSBtZXRob2QncyBzaWduYXR1cmUgaW5mb3JtYXRpb24gaW50byB0aGUgbWV0YWRhdGEgc3RvcmUgd2hlbiBhcHBsaWVkLlxuICogQGZ1bmN0aW9uIG1ldGhvZFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXIgQ29kZVxuICogICBwYXJ0aWNpcGFudCBGIGFzIG1ldGhvZCgpXG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTWV0YWRhdGFcbiAqICAgVS0+PkY6IG1ldGhvZCgpKHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKVxuICogICBGLT4+VTogUmVmbGVjdC5nZXRPd25NZXRhZGF0YShkZXNpZ246cGFyYW10eXBlcylcbiAqICAgRi0+PlU6IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoZGVzaWduOnJldHVybnR5cGUpXG4gKiAgIEYtPj5NOiBzZXQobWV0aG9kcy5rZXkuZGVzaWduOnBhcmFtdHlwZXMsIHBhcmFtcylcbiAqICAgRi0+Pk06IHNldChtZXRob2RzLmtleS5kZXNpZ246cmV0dXJudHlwZSwgcmV0dXJuVHlwZSlcbiAqICAgRi0tPj5VOiBkZWNvcmF0ZWQgZnVuY3Rpb25cbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWV0aG9kKCkge1xuICByZXR1cm4gZnVuY3Rpb24gbWV0aG9kKG9iajogYW55LCBwcm9wPzogYW55LCBkZXNjcmlwdG9yPzogYW55KSB7XG4gICAgY29uc3QgZGVzaWduUGFyYW1zID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcbiAgICAgIERlY29yYXRpb25LZXlzLkRFU0lHTl9QQVJBTVMsXG4gICAgICBvYmosXG4gICAgICBwcm9wXG4gICAgKTtcbiAgICBjb25zdCBkZXNpZ25SZXR1cm4gPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFxuICAgICAgRGVjb3JhdGlvbktleXMuREVTSUdOX1JFVFVSTixcbiAgICAgIG9iaixcbiAgICAgIHByb3BcbiAgICApO1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoXG4gICAgICAgICAgRGVjb3JhdGlvbktleXMuTUVUSE9EUyxcbiAgICAgICAgICBwcm9wLFxuICAgICAgICAgIERlY29yYXRpb25LZXlzLkRFU0lHTl9QQVJBTVNcbiAgICAgICAgKSxcbiAgICAgICAgZGVzaWduUGFyYW1zXG4gICAgICApLFxuICAgICAgbWV0YWRhdGEoXG4gICAgICAgIE1ldGFkYXRhLmtleShcbiAgICAgICAgICBEZWNvcmF0aW9uS2V5cy5NRVRIT0RTLFxuICAgICAgICAgIHByb3AsXG4gICAgICAgICAgRGVjb3JhdGlvbktleXMuREVTSUdOX1JFVFVSTlxuICAgICAgICApLFxuICAgICAgICBkZXNpZ25SZXR1cm5cbiAgICAgIClcbiAgICApKG9iaiwgcHJvcCwgZGVzY3JpcHRvcik7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmYWN0b3J5IHRoYXQgYXBwbGllcyBtdWx0aXBsZSBkZWNvcmF0b3JzIHRvIGEgc2luZ2xlIHRhcmdldC5cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBjb21wb3NpdGUgZGVjb3JhdG9yIHRoYXQgYXBwbGllcyBtdWx0aXBsZSBkZWNvcmF0b3JzIGluIHNlcXVlbmNlLCBjb3JyZWN0bHkgaGFuZGxpbmcgY2xhc3MsIG1ldGhvZCwgcHJvcGVydHksIGFuZCBwYXJhbWV0ZXIgZGVjb3JhdG9ycy5cbiAqIEBwYXJhbSB7QXJyYXk8Q2xhc3NEZWNvcmF0b3J8TWV0aG9kRGVjb3JhdG9yfFByb3BlcnR5RGVjb3JhdG9yfFBhcmFtZXRlckRlY29yYXRvcj59IGRlY29yYXRvcnMgQ29sbGVjdGlvbiBvZiBkZWNvcmF0b3JzIHRvIGFwcGx5LlxuICogQHJldHVybiB7Q2xhc3NEZWNvcmF0b3J8TWV0aG9kRGVjb3JhdG9yfFByb3BlcnR5RGVjb3JhdG9yfFBhcmFtZXRlckRlY29yYXRvcn0gRGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgYXBwbGllcyBhbGwgcHJvdmlkZWQgZGVjb3JhdG9ycyB0byB0aGUgdGFyZ2V0LlxuICogQGZ1bmN0aW9uIGFwcGx5XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlciBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IEEgYXMgYXBwbHkoLi4uZGVjb3JhdG9ycylcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEZWNvcmF0b3JcbiAqICAgVS0+PkE6IGdldCBkZWNvcmF0b3IoLi4uZGVjb3JhdG9ycylcbiAqICAgQS0+PlU6IHJldHVybnMgKHRhcmdldCwga2V5PywgZGVzYz8pID0+IHZvaWRcbiAqICAgVS0+PkE6IGludm9rZSBvbiB0YXJnZXRcbiAqICAgbG9vcCBmb3IgZWFjaCBkZWNvcmF0b3JcbiAqICAgICBBLT4+RDogaW52b2tlIGFwcHJvcHJpYXRlIGRlY29yYXRvciB0eXBlXG4gKiAgIGVuZFxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5KFxuICAuLi5kZWNvcmF0b3JzOiBBcnJheTxcbiAgICBDbGFzc0RlY29yYXRvciB8IE1ldGhvZERlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgUGFyYW1ldGVyRGVjb3JhdG9yXG4gID5cbikge1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5Pzogc3RyaW5nIHwgc3ltYm9sIHwgdW5rbm93bixcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yIHwgbnVtYmVyXG4gICkgPT4ge1xuICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnMpIHtcbiAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiAhZGVzY3JpcHRvcikge1xuICAgICAgICAoZGVjb3JhdG9yIGFzIENsYXNzRGVjb3JhdG9yKSh0YXJnZXQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIChkZWNvcmF0b3IgYXMgTWV0aG9kRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IpKFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5IGFzIHN0cmluZyB8IHN5bWJvbCxcbiAgICAgICAgZGVzY3JpcHRvciBhcyBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPlxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBwcm9wZXJ0eSBtZXRhZGF0YSBkZWNvcmF0b3IuXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSBmYWN0b3J5IHRoYXQgY29tYmluZXMgYG1ldGFkYXRhKGtleSwgdmFsdWUpYCBhbmQgYHByb3AoKWAgdG8gYm90aCBzZXQgYW4gYXJiaXRyYXJ5IG1ldGFkYXRhIGtleSBhbmQgcmVjb3JkIHRoZSBwcm9wZXJ0eSdzIGRlc2lnbiB0eXBlLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBNZXRhZGF0YSBrZXkgdG8gc2V0IGZvciB0aGUgcHJvcGVydHkuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgTWV0YWRhdGEgdmFsdWUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGtleS5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCBzZXRzIHRoZSBtZXRhZGF0YSBhbmQgY2FwdHVyZXMgdGhlIHByb3BlcnR5J3MgdHlwZS5cbiAqIEBmdW5jdGlvbiBwcm9wTWV0YWRhdGFcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTWV0YWRhdGEoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIGFwcGx5KG1ldGFkYXRhKGtleSwgdmFsdWUpLCBwcm9wKCkpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbWV0aG9kIG1ldGFkYXRhIGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIGZhY3RvcnkgdGhhdCBjb21iaW5lcyBgbWV0YWRhdGEoa2V5LCB2YWx1ZSlgIGFuZCBgbWV0aG9kKClgIHRvIGJvdGggc2V0IGFuIGFyYml0cmFyeSBtZXRhZGF0YSBrZXkgYW5kIHJlY29yZCB0aGUgbWV0aG9kJ3MgZGVzaWduIHJldHVybiBhbmQgcGFyYW0gdHlwZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IE1ldGFkYXRhIGtleSB0byBzZXQgZm9yIHRoZSBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSBNZXRhZGF0YSB2YWx1ZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUga2V5LlxuICogQHJldHVybiB7TWV0aG9kRGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCBzZXRzIHRoZSBtZXRhZGF0YSBhbmQgY2FwdHVyZXMgdGhlIG1ldGhvZCdzIHNpZ25hdHVyZSBtZXRhZGF0YS5cbiAqIEBmdW5jdGlvbiBtZXRob2RNZXRhZGF0YVxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRob2RNZXRhZGF0YShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICByZXR1cm4gYXBwbHkobWV0YWRhdGEoa2V5LCB2YWx1ZSksIG1ldGhvZCgpKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQXR0YWNoZXMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiB0byBhIGNsYXNzIG9yIG1lbWJlci5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciBmYWN0b3J5IHRoYXQgc3RvcmVzIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBpbiB0aGUgbWV0YWRhdGEgc3RvcmUgdW5kZXIgdGhlIGFwcHJvcHJpYXRlIGRlc2NyaXB0aW9uIGtleSBmb3IgYSBjbGFzcyBvciBpdHMgcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzYyBEZXNjcmlwdGl2ZSB0ZXh0IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBjbGFzcyBvciBwcm9wZXJ0eS5cbiAqIEByZXR1cm4ge0NsYXNzRGVjb3JhdG9yfE1ldGhvZERlY29yYXRvcnxQcm9wZXJ0eURlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgcmVjb3JkcyB0aGUgZGVzY3JpcHRpb24gd2hlbiBhcHBsaWVkLlxuICogQGZ1bmN0aW9uIGRlc2NyaXB0aW9uXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmlwdGlvbihkZXNjOiBzdHJpbmcpIHtcbiAgZnVuY3Rpb24gaW5uZXJEZXNjcmlwdGlvbihkZXNjOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaW5uZXJEZXNjcmlwdGlvbihcbiAgICAgIG9yaWdpbmFsOiBhbnksXG4gICAgICBwcm9wPzogYW55LFxuICAgICAgZGVzY3JpcHRvcj86IGFueVxuICAgICkge1xuICAgICAgcmV0dXJuIG1ldGFkYXRhKFxuICAgICAgICBbXG4gICAgICAgICAgRGVjb3JhdGlvbktleXMuREVTQ1JJUFRJT04sXG4gICAgICAgICAgcHJvcCA/IHByb3AudG9TdHJpbmcoKSA6IERlY29yYXRpb25LZXlzLkNMQVNTLFxuICAgICAgICBdLmpvaW4oTWV0YWRhdGEuc3BsaXR0ZXIpLFxuICAgICAgICBkZXNjXG4gICAgICApKG9yaWdpbmFsLCBwcm9wLCBkZXNjcmlwdG9yKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKERlY29yYXRpb25LZXlzLkRFU0NSSVBUSU9OKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBpbm5lckRlc2NyaXB0aW9uLFxuICAgICAgYXJnczogW2Rlc2NdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBSb290IGVudHJ5IHBvaW50IGZvciB0aGUgZGVjb3JhdGlvbiBwYWNrYWdlLlxuICogQHN1bW1hcnkgUmUtZXhwb3J0cyB0aGUgYnVpbGRlciBBUEksIGRlY29yYXRvciBoZWxwZXJzLCBtZXRhZGF0YSB1dGlsaXRpZXMsIGFuZCBzaGFyZWQgY29uc3RhbnRzIHNvIGNvbnN1bWVycyBjYW4gaW1wb3J0IHtAbGluayBEZWNvcmF0aW9ufSwge0BsaW5rIE1ldGFkYXRhfSwge0BsaW5rIERlY29yYXRpb25LZXlzfSwgYW5kIHtAbGluayBEZWZhdWx0Rmxhdm91cn0gZnJvbSBhIHNpbmdsZSBzdXJmYWNlLlxuICogQG1vZHVsZSBkZWNvcmF0aW9uXG4gKi9cblxuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiLi9tZXRhZGF0YS9pbmRleFwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tZXRhZGF0YVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgZGVjb3JhdGlvbiBwYWNrYWdlLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBzZW1hbnRpYyB2ZXJzaW9uIHN0cmluZyByZWdpc3RlcmVkIHRocm91Z2gge0BsaW5rIE1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeX0uXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcblxuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIiwgVkVSU0lPTik7XG4iXSwibmFtZXMiOlsiRGVjb3JhdGlvbktleXMiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUVBOzs7Ozs7SUFNRztBQUNJLFVBQU0sY0FBYyxHQUFHO0lBRTlCOzs7Ozs7SUFNRztBQUNJLFVBQU0saUJBQWlCLEdBQUc7SUFFakM7Ozs7Ozs7SUFPRztBQUNTQTtJQUFaLENBQUEsVUFBWSxjQUFjLEVBQUE7O0lBRXhCLElBQUEsY0FBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLFdBQXVCOztJQUV2QixJQUFBLGNBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxTQUErQjs7SUFFL0IsSUFBQSxjQUFBLENBQUEsWUFBQSxDQUFBLEdBQUEsWUFBeUI7O0lBRXpCLElBQUEsY0FBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLFNBQW1COztJQUVuQixJQUFBLGNBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlOztJQUVmLElBQUEsY0FBQSxDQUFBLGFBQUEsQ0FBQSxHQUFBLGFBQTJCOztJQUUzQixJQUFBLGNBQUEsQ0FBQSxhQUFBLENBQUEsR0FBQSxZQUEwQjs7SUFFMUIsSUFBQSxjQUFBLENBQUEsWUFBQSxDQUFBLEdBQUEsWUFBeUI7O0lBRXpCLElBQUEsY0FBQSxDQUFBLGFBQUEsQ0FBQSxHQUFBLGFBQTJCOztJQUUzQixJQUFBLGNBQUEsQ0FBQSxlQUFBLENBQUEsR0FBQSxtQkFBbUM7O0lBRW5DLElBQUEsY0FBQSxDQUFBLGVBQUEsQ0FBQSxHQUFBLG1CQUFtQztJQUNyQyxDQUFDLEVBdkJXQSxzQkFBYyxLQUFkQSxzQkFBYyxHQXVCekIsRUFBQSxDQUFBLENBQUE7SUFFRDs7Ozs7O0lBTUc7QUFDVSxVQUFBLGVBQWUsR0FBdUI7SUFDakQsSUFBQSxDQUFDQSxzQkFBYyxDQUFDLFVBQVUsR0FBRyxFQUFFOzs7SUN6RGpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXVCRztJQUNHLFNBQVUsa0JBQWtCLENBQ2hDLEdBQXdCLEVBQ3hCLElBQVksRUFDWixXQUFtQixpQkFBaUIsRUFBQTtRQUVwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNqQyxJQUFJLE9BQU8sR0FBRyxHQUFHO0lBRWpCLElBQUEsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDdEIsSUFDRSxPQUFPLEtBQUssSUFBSTtJQUNoQixZQUFBLE9BQU8sS0FBSyxTQUFTO2dCQUNyQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDO0lBRW5ELFlBQUEsT0FBTyxTQUFTO0lBQ2xCLFFBQUEsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7O0lBR3hCLElBQUEsT0FBTyxPQUFPO0lBQ2hCO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF5Qkc7SUFDRyxTQUFVLGtCQUFrQixDQUNoQyxHQUF3QixFQUN4QixJQUFZLEVBQ1osS0FBVSxFQUNWLFFBQVEsR0FBRyxpQkFBaUIsRUFBQTtRQUU1QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUM3RCxJQUFBLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUU7UUFFdkIsSUFBSSxPQUFPLEdBQXFCLEdBQUc7SUFFbkMsSUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDeEMsUUFBQSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25CLFFBQUEsSUFDRSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUztJQUMxQixZQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJO0lBQ3JCLFlBQUEsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxFQUNoQztJQUNBLFlBQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7O0lBRW5CLFFBQUEsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7O1FBR3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNyQyxJQUFBLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLO0lBQzFCO0lBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXFCRztVQUNVLFFBQVEsQ0FBQTtJQUNuQjs7O0lBR0c7aUJBQ1ksSUFBUyxDQUFBLFNBQUEsR0FBd0IsRUFBRSxDQUFDO0lBRW5EOzs7SUFHRztpQkFDSSxJQUFRLENBQUEsUUFBQSxHQUFHLGlCQUFpQixDQUFDO0lBQ3BDOzs7SUFHRztJQUNJLElBQUEsU0FBQSxJQUFBLENBQUEsT0FBTyxHQUFHQSxzQkFBYyxDQUFDLE9BQU8sQ0FBQztJQUN4Qzs7O0lBR0c7aUJBQ0ksSUFBTSxDQUFBLE1BQUEsR0FBWSxJQUFJLENBQUM7SUFFOUIsSUFBQSxXQUFBLEdBQUE7UUFFQSxPQUFPLE1BQU0sQ0FBSSxHQUFtQixFQUFBO1lBQ2xDLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDOztJQUczRDs7Ozs7SUFLRztRQUNILE9BQU8sVUFBVSxDQUFDLEtBQWtCLEVBQUE7WUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDNUIsUUFBQSxJQUFJLENBQUMsSUFBSTtJQUFFLFlBQUEsT0FBTyxTQUFTO1lBQzNCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDOztJQUdyQzs7Ozs7SUFLRztRQUNILE9BQU8sT0FBTyxDQUFDLEtBQWtCLEVBQUE7SUFDL0IsUUFBQSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRUEsc0JBQWMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsUUFBQSxJQUFJLENBQUMsSUFBSTtJQUFFLFlBQUEsT0FBTyxTQUFTO0lBQzNCLFFBQUEsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzs7SUFHMUI7Ozs7Ozs7SUFPRztJQUNILElBQUEsT0FBTyxXQUFXLENBQ2hCLEtBQXFCLEVBQ3JCLElBQWMsRUFBQTtJQUVkLFFBQUEsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUNiLEtBQUssRUFDTCxDQUFDQSxzQkFBYyxDQUFDLFdBQVcsRUFBRSxJQUFJLEdBQUcsSUFBSSxHQUFHQSxzQkFBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDbkUsSUFBSSxDQUFDLFFBQVEsQ0FDZCxDQUNGOztJQUdIOzs7Ozs7O0lBT0c7SUFDSCxJQUFBLE9BQU8sTUFBTSxDQUFJLEtBQXFCLEVBQUUsSUFBWSxFQUFBO1lBQ2xELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FDYixLQUFLLEVBQ0wsQ0FBQ0Esc0JBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFQSxzQkFBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FDL0QsSUFBSSxDQUFDLFFBQVEsQ0FDZCxDQUNGOztJQUdIOzs7Ozs7OztJQVFHO0lBQ0gsSUFBQSxPQUFPLEtBQUssQ0FDVixLQUFxQixFQUNyQixJQUFZLEVBQ1osS0FBYSxFQUFBO1lBRWIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO0lBQ3ZDLFFBQUEsSUFBSSxDQUFDLE1BQU07SUFBRSxZQUFBLE9BQU8sU0FBUztJQUM3QixRQUFBLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztJQUMzQixZQUFBLE1BQU0sSUFBSSxLQUFLLENBQ2IsQ0FBQSxnQkFBQSxFQUFtQixLQUFLLENBQUEsa0JBQUEsRUFBcUIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFFLENBQUEsQ0FDNUQ7SUFDSCxRQUFBLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQzs7SUFHdEI7Ozs7Ozs7SUFPRztJQUNILElBQUEsT0FBTyxNQUFNLENBQUksS0FBcUIsRUFBRSxJQUFZLEVBQUE7WUFDbEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUNiLEtBQUssRUFDTCxDQUFDQSxzQkFBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUVBLHNCQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUMvRCxJQUFJLENBQUMsUUFBUSxDQUNkLENBQ0Y7O0lBR0g7Ozs7OztJQU1HO0lBQ0gsSUFBQSxPQUFPLElBQUksQ0FBQyxLQUFrQixFQUFFLElBQVksRUFBQTtZQUMxQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQ2IsS0FBSyxFQUNMLENBQUNBLHNCQUFjLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3REOztJQUdIOzs7Ozs7SUFNRztRQUNILE9BQU8sTUFBTSxDQUFJLEtBQXFCLEVBQUE7WUFDcEMsT0FBTyxLQUFLLENBQUNBLHNCQUFjLENBQUMsV0FBaUMsQ0FBQyxJQUFJLEtBQUs7O0lBd0J6RTs7Ozs7Ozs7SUFRRztJQUNILElBQUEsT0FBTyxHQUFHLENBQUMsS0FBa0IsRUFBRSxHQUFZLEVBQUE7SUFDekMsUUFBQSxJQUFJLEdBQUcsS0FBS0Esc0JBQWMsQ0FBQyxXQUFXO0lBQUUsWUFBQSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ2pFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3hDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUM7SUFDaEUsUUFBQSxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUM3QixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDM0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUM7O1lBRTNDLE1BQU0sZUFBZSxHQUFHO0lBQ3JCLGFBQUEsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUM7aUJBQ25ELE1BQU0sQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLEtBQUssU0FBUyxDQUFDO0lBRXpDLFFBQUEsSUFBSSxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUM7SUFBRSxZQUFBLE9BQU8sU0FBUztJQUVsRCxRQUFBLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQzs7SUFHakQ7Ozs7OztJQU1HO0lBQ0ssSUFBQSxPQUFPLFFBQVEsQ0FBQyxNQUFjLEVBQUUsR0FBcUIsRUFBQTtJQUMzRCxRQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUFFLFlBQUEsT0FBTyxTQUFTO0lBQzdDLFFBQUEsSUFBSSxDQUFDLEdBQUc7SUFBRSxZQUFBLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDdkMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO0lBQ3pCLFlBQUEsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3ZFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUM7O0lBR3BDOzs7OztJQUtHO1FBQ0ssT0FBTyx1QkFBdUIsQ0FBQyxLQUFrQixFQUFBO1lBQ3ZELE1BQU0sS0FBSyxHQUFrQixFQUFFO1lBQy9CLElBQUksT0FBTyxHQUFRLEtBQUs7WUFFeEIsT0FBTyxPQUFPLE9BQU8sS0FBSyxVQUFVLElBQUksT0FBTyxLQUFLLFFBQVEsRUFBRTtJQUM1RCxZQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBc0IsQ0FBQztnQkFDbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssTUFBTTtvQkFBRTtnQkFDekQsT0FBTyxHQUFHLE1BQU07O0lBR2xCLFFBQUEsT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFOztJQUd4Qjs7Ozs7SUFLRztRQUNLLE9BQU8sa0JBQWtCLENBQUMsTUFBYSxFQUFBO1lBQzdDLElBQUksR0FBRyxHQUFRLFNBQVM7SUFFeEIsUUFBQSxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtJQUMxQixZQUFBLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRTtJQUNyQixnQkFBQSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQztvQkFDcEM7O0lBR0YsWUFBQSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDeEQsR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FDMUIsR0FBMEIsRUFDMUIsS0FBNEIsQ0FDN0I7b0JBQ0Q7O0lBR0YsWUFBQSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQzs7SUFHdEMsUUFBQSxPQUFPLEdBQUc7O0lBR1o7Ozs7O0lBS0c7UUFDSyxPQUFPLGtCQUFrQixDQUFDLEtBQVUsRUFBQTtJQUMxQyxRQUFBLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFBRSxZQUFBLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUMzQyxRQUFBLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7Z0JBQzNCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxLQUE0QixDQUFDO0lBQ2pFLFFBQUEsT0FBTyxLQUFLOztJQUdkOzs7Ozs7SUFNRztJQUNLLElBQUEsT0FBTyxpQkFBaUIsQ0FDOUIsTUFBMkIsRUFDM0IsTUFBMkIsRUFBQTtJQUUzQixRQUFBLE1BQU0sTUFBTSxHQUF3QixFQUFFLEdBQUcsTUFBTSxFQUFFO1lBRWpELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtJQUNyQyxZQUFBLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDL0IsWUFBQSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBRS9CLFlBQUEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXOzBCQUN4QyxJQUFJLENBQUMsaUJBQWlCLENBQ3BCLFdBQWtDLEVBQ2xDLFdBQWtDOzBCQUVwQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLFdBQWtDLENBQUM7b0JBQ2xFOztJQUdGLFlBQUEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUM5QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQztvQkFDOUI7O0lBR0YsWUFBQSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVzs7SUFHM0IsUUFBQSxPQUFPLE1BQU07O0lBR2Y7Ozs7O0lBS0c7UUFDSyxPQUFPLGFBQWEsQ0FBQyxLQUFVLEVBQUE7SUFDckMsUUFBQSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ3JFLFlBQUEsT0FBTyxLQUFLO1lBQ2QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxDQUFDLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSTs7SUFHckQ7Ozs7Ozs7SUFPRztJQUNLLElBQUEsT0FBTyxRQUFRLENBQUMsTUFBYyxFQUFFLEdBQW9CLEVBQUUsS0FBVSxFQUFBO0lBQ3RFLFFBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQUUsWUFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQVM7WUFDL0QsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO0lBQ3pCLFlBQUEsT0FBTyxrQkFBa0IsQ0FDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFDdEIsR0FBRyxFQUNILEtBQUssRUFDTCxJQUFJLENBQUMsUUFBUSxDQUNkO1lBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLOztJQUdyQzs7Ozs7Ozs7SUFRRztJQUNILElBQUEsT0FBTyxHQUFHLENBQUMsS0FBMkIsRUFBRSxHQUFXLEVBQUUsS0FBVSxFQUFBO0lBQzdELFFBQUEsSUFBSSxHQUFHLEtBQUtBLHNCQUFjLENBQUMsV0FBVyxFQUFFO2dCQUN0QyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRUEsc0JBQWMsQ0FBQyxXQUFXLEVBQUU7SUFDdkQsZ0JBQUEsVUFBVSxFQUFFLEtBQUs7SUFDakIsZ0JBQUEsWUFBWSxFQUFFLEtBQUs7SUFDbkIsZ0JBQUEsUUFBUSxFQUFFLEtBQUs7SUFDZixnQkFBQSxLQUFLLEVBQUUsS0FBSztJQUNiLGFBQUEsQ0FBQztnQkFDRjs7WUFFRixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSztZQUNsRSxNQUFNLE1BQU0sR0FDVixPQUFPLEtBQUssS0FBSyxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNwRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDO1lBQ2pDLElBQ0UsT0FBTyxLQUFLLEtBQUssUUFBUTtJQUN6QixZQUFBLFFBQVEsQ0FBQyxNQUFNO0lBQ2YsWUFBQSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUMxRDtnQkFDQSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO0lBQ3pDLGdCQUFBLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLGdCQUFBLFlBQVksRUFBRSxLQUFLO0lBQ25CLGdCQUFBLFFBQVEsRUFBRSxLQUFLO0lBQ2YsZ0JBQUEsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQzlCLGFBQUEsQ0FBQzs7O0lBSU47Ozs7Ozs7SUFPRztJQUNILElBQUEsT0FBTyxlQUFlLENBQUMsT0FBZSxFQUFFLE9BQWUsRUFBQTtZQUNyRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDQSxzQkFBYyxDQUFDLFNBQVMsQ0FBQztZQUNuRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7SUFDMUMsUUFBQSxJQUFJLEdBQUc7Z0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FDYixDQUFBLGdCQUFBLEVBQW1CLE9BQU8sQ0FBNEIseUJBQUEsRUFBQSxPQUFPLENBQUUsQ0FBQSxDQUNoRTtZQUNILElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7O0lBR3pDOzs7O0lBSUc7SUFDSCxJQUFBLE9BQU8sU0FBUyxHQUFBO1lBQ2QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQ0Esc0JBQWMsQ0FBQyxTQUFTLENBQUM7WUFDbkQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7O0lBR3BDOzs7OztJQUtHO0lBQ0gsSUFBQSxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQWMsRUFBQTtZQUMxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7OztJQ3hoQm5DOzs7Ozs7O0lBT0c7SUFDSDtJQUNBLFNBQVMsc0JBQXNCLENBQUMsTUFBYyxFQUFBO0lBQzVDLElBQUEsT0FBTyxjQUFjO0lBQ3ZCO0lBK0NBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXNDRztVQUNVLFVBQVUsQ0FBQTtJQUNyQjs7O0lBR0c7aUJBQ1ksSUFBVSxDQUFBLFVBQUEsR0FTckIsRUFBRSxDQUFDO0lBRVA7OztJQUdHO2lCQUNZLElBQWUsQ0FBQSxlQUFBLEdBQW9CLHNCQUFzQixDQUFDO0lBaUJ6RSxJQUFBLFdBQUEsQ0FBb0IsVUFBa0IsY0FBYyxFQUFBO1lBQWhDLElBQU8sQ0FBQSxPQUFBLEdBQVAsT0FBTzs7SUFFM0I7Ozs7O0lBS0c7SUFDSCxJQUFBLEdBQUcsQ0FBQyxHQUFXLEVBQUE7SUFDYixRQUFBLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRztJQUNkLFFBQUEsT0FBTyxJQUFJOztJQUdiOzs7Ozs7SUFNRztJQUNLLElBQUEsUUFBUSxDQUNkLEtBQUEsR0FBaUIsS0FBSyxFQUN0QixHQUFHLFVBQWlDLEVBQUE7WUFFcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO0lBQ1gsWUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDO1lBQ3hFLElBQ0UsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO0lBQ2xDLFlBQUEsQ0FBQyxLQUFLO2dCQUNOLElBQUksQ0FBQyxPQUFPLEtBQUssY0FBYztJQUUvQixZQUFBLE1BQU0sSUFBSSxLQUFLLENBQ2IsMkVBQTJFLENBQzVFO0lBQ0YsUUFBQSxJQUFZLENBQUMsS0FBSyxHQUFHLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQztnQkFDdkQsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFO0lBQ2hFLFlBQUEsR0FBRyxVQUFVO0lBQ2QsU0FBQSxDQUFDO0lBRUYsUUFBQSxPQUFPLElBQUk7O0lBR2I7Ozs7O0lBS0c7UUFDSCxNQUFNLENBQ0osR0FBRyxVQUEyQixFQUFBO0lBRTlCLFFBQUEsSUFDRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQztnQkFDN0MsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO0lBRXZCLFlBQUEsTUFBTSxJQUFJLEtBQUssQ0FDYixDQUFBLHdEQUFBLENBQTBELENBQzNEO1lBQ0gsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFHLFVBQVUsQ0FBQzs7SUFHNUM7Ozs7O0lBS0c7UUFDSCxNQUFNLENBQUMsR0FBRyxVQUFpQyxFQUFBO0lBQ3pDLFFBQUEsSUFDRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQztnQkFDN0MsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO0lBRXZCLFlBQUEsTUFBTSxJQUFJLEtBQUssQ0FDYixDQUFBLGtFQUFBLENBQW9FLENBQ3JFO1lBQ0gsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQzs7SUFHM0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXFCRztJQUNPLElBQUEsZ0JBQWdCLENBQUMsR0FBVyxFQUFFLENBQUEsR0FBWSxjQUFjLEVBQUE7SUFDaEUsUUFBQSxTQUFTLGdCQUFnQixDQUN2QixNQUFjLEVBQ2QsV0FBaUIsRUFDakIsVUFBeUMsRUFBQTtnQkFFekMsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQ3hDLFlBQUEsSUFBSSxVQUFVO0lBQ2QsWUFBQSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTztJQUMxQixrQkFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakIsa0JBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU07SUFFaEMsWUFBQSxJQUNFLEtBQUs7b0JBQ0wsS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUNkLGdCQUFBLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVO29CQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksRUFDOUI7SUFDQSxnQkFBQSxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVU7O3FCQUNqQztJQUNMLGdCQUFBLFVBQVUsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsVUFBVTs7SUFHL0MsWUFBQSxNQUFNLGtCQUFrQixHQUFHLENBQUMsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRXZFLFlBQUEsTUFBTSxxQkFBcUIsR0FBRztJQUM1QixnQkFBQSxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFVBQVUsSUFBSSxJQUFJLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRTtpQkFDN0Q7SUFFRCxZQUFBLE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FDL0MsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssS0FBSTtvQkFDdEIsSUFDRSxPQUFPLEtBQUssS0FBSyxRQUFRO0lBQ3pCLG9CQUFBLE1BQU0sSUFBSyxLQUFhO3dCQUN4QixLQUFLLENBQUMsT0FBTyxDQUFFLEtBQWEsQ0FBQyxJQUFJLENBQUMsRUFDbEM7SUFDQSxvQkFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUksS0FBYSxDQUFDLElBQUk7O0lBRXBDLGdCQUFBLE9BQU8sS0FBSztpQkFDYixFQUNELEVBQTJCLENBQzVCO0lBRUQsWUFBQSxNQUFNLGtCQUFrQixHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FDckQsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssS0FBSTtvQkFDdEIsSUFDRSxPQUFPLEtBQUssS0FBSyxRQUFRO0lBQ3pCLG9CQUFBLE1BQU0sSUFBSyxLQUFhO3dCQUN4QixLQUFLLENBQUMsT0FBTyxDQUFFLEtBQWEsQ0FBQyxJQUFJLENBQUMsRUFDbEM7SUFDQSxvQkFBQSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUksS0FBYSxDQUFDLElBQUk7O0lBRXBDLGdCQUFBLE9BQU8sS0FBSztpQkFDYixFQUNELEVBQTJCLENBQzVCO0lBRUQsWUFBQSxNQUFNLE9BQU8sR0FBRztJQUNkLGdCQUFBLEdBQUcsa0JBQWtCO0lBQ3JCLGdCQUFBLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7aUJBQ25DO0lBRUQsWUFBQSxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNO2dCQUU1QyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQ25CLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEtBQUk7b0JBQ2QsUUFBUSxPQUFPLENBQUM7d0JBQ2QsS0FBSyxRQUFRLEVBQUU7NEJBQ2IsTUFBTSxLQUFLLEdBQUcsQ0FBUTtJQUN0Qix3QkFBQSxNQUFNLGNBQWMsR0FBRyxLQUFLLEdBQUcsVUFBVSxHQUFHLEtBQUssR0FBRyxDQUFDO0lBQ3JELHdCQUFBLE1BQU0sSUFBSSxHQUNSLE1BQU0sSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSTtrQ0FDdkMsS0FBSyxDQUFDO0lBQ1IsK0JBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQztvQ0FDaEMsa0JBQWtCLENBQUMsY0FBYyxDQUFDO29DQUNsQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDckIsZ0NBQUEsRUFBRSxDQUFDO0lBRVQsd0JBQUEsT0FBUSxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFTLENBQ3RDLE1BQU0sRUFDTixXQUFXLEVBQ1gsVUFBVSxDQUNYOztJQUVILG9CQUFBLEtBQUssVUFBVTs0QkFDYixPQUFRLENBQVMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQztJQUNwRCxvQkFBQTs0QkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLENBQUEsMkJBQUEsRUFBOEIsT0FBTyxDQUFDLENBQUEsQ0FBRSxDQUFDOztpQkFFOUQsRUFDRCxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLENBQ3BDOztJQUVILFFBQUEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUU7Z0JBQzlDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDdkMsWUFBQSxRQUFRLEVBQUUsS0FBSztJQUNoQixTQUFBLENBQUM7SUFDRixRQUFBLE9BQU8sZ0JBQWdCOztJQUd6Qjs7OztJQUlHO1FBQ0gsS0FBSyxHQUFBO1lBS0gsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO0lBQ1gsWUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDO0lBQy9ELFFBQUEsTUFBTSxrQkFBa0IsR0FDdEIsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVU7WUFDN0QsTUFBTSxvQkFBb0IsR0FDeEIsSUFBSSxDQUFDLFVBQVUsSUFBSSxrQkFBa0IsSUFBSSxJQUFJLEdBQUcsRUFBaUI7SUFFbkUsUUFBQSxVQUFVLENBQUMsUUFBUSxDQUNqQixJQUFJLENBQUMsR0FBRyxFQUNSLElBQUksQ0FBQyxPQUFPLEVBQ1osb0JBQW9CLEVBQ3BCLElBQUksQ0FBQyxNQUFNLENBQ1o7SUFDRCxRQUFBLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQzs7SUFHdEQ7Ozs7Ozs7O0lBUUc7UUFDSyxPQUFPLFFBQVEsQ0FDckIsR0FBVyxFQUNYLE9BQWUsRUFDZixVQUErQixFQUMvQixNQUFpQyxFQUFBO1lBRWpDLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFDUixZQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUM7O0lBRS9ELFFBQUEsSUFBSSxDQUFDLFVBQVU7SUFDYixZQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUM7SUFDdEUsUUFBQSxJQUFJLENBQUMsT0FBTztJQUNWLFlBQUEsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQztJQUVuRSxRQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztJQUFFLFlBQUEsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ2hFLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDdEMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO0lBQzFDLFFBQUEsSUFBSSxVQUFVO0lBQUUsWUFBQSxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVO0lBQzNFLFFBQUEsSUFBSSxNQUFNO0lBQUUsWUFBQSxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNOztJQUdqRTs7Ozs7SUFLRztRQUNILE9BQU8sa0JBQWtCLENBQUMsUUFBeUIsRUFBQTtJQUNqRCxRQUFBLFVBQVUsQ0FBQyxlQUFlLEdBQUcsUUFBUTs7SUFHdkM7Ozs7O0lBS0c7UUFDSCxPQUFPLEdBQUcsQ0FBQyxHQUFXLEVBQUE7WUFDcEIsT0FBTyxJQUFJLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7O0lBR2xDOzs7OztJQUtHO1FBQ0gsT0FBTyxXQUFXLENBQUMsT0FBZSxFQUFBO0lBQ2hDLFFBQUEsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUM7Ozs7SUN4YWxDOzs7Ozs7OztJQVFHO0lBQ2EsU0FBQSxRQUFRLENBQUMsR0FBVyxFQUFFLEtBQVUsRUFBQTtJQUM5QyxJQUFBLE9BQU8sU0FBUyxRQUFRLENBQ3RCLEtBQVUsRUFFVixJQUFVOztRQUVWLFVBQXdDLEVBQUE7SUFFeEMsUUFBQSxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDO0lBQzVELEtBQUM7SUFDSDtJQUVBOzs7Ozs7SUFNRzthQUNhLElBQUksR0FBQTtJQUNsQixJQUFBLFNBQVMsU0FBUyxHQUFBO0lBQ2hCLFFBQUEsT0FBTyxTQUFTLFNBQVMsQ0FBQyxLQUFhLEVBQUUsSUFBVSxFQUFBO0lBQ2pELFlBQUEsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FDdkNBLHNCQUFjLENBQUMsV0FBVyxFQUMxQixLQUFLLEVBQ0wsSUFBSSxDQUNMO2dCQUNELE9BQU8sUUFBUSxDQUNiLFFBQVEsQ0FBQyxHQUFHLENBQUNBLHNCQUFjLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUM3QyxVQUFVLENBQ1gsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO0lBQ2hCLFNBQUM7O0lBR0gsSUFBQSxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUNBLHNCQUFjLENBQUMsVUFBVTtJQUM1QyxTQUFBLE1BQU0sQ0FBQztJQUNOLFFBQUEsU0FBUyxFQUFFLFNBQVM7SUFDcEIsUUFBQSxJQUFJLEVBQUUsRUFBRTtTQUNUO0lBQ0EsU0FBQSxLQUFLLEVBQUU7SUFDWjtJQUVBOzs7Ozs7Ozs7Ozs7Ozs7OztJQWlCRzthQUNhLEtBQUssR0FBQTtJQUNuQixJQUFBLE9BQU8sU0FBUyxLQUFLLENBQ25CLEtBQWEsRUFDYixJQUFpQyxFQUNqQyxLQUFhLEVBQUE7SUFFYixRQUFBLElBQUksQ0FBQyxJQUFJO0lBQ1AsWUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLENBQUEsbURBQUEsQ0FBcUQsQ0FBQztJQUN4RSxRQUFBLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuRSxRQUFBLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQWtCLEVBQUUsSUFBYyxDQUFDO0lBQzNFLFFBQUEsSUFBSSxDQUFDLFNBQVM7Z0JBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUErQiw0QkFBQSxFQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBRSxDQUFBLENBQUM7SUFDaEUsUUFBQSxJQUFJLEtBQUssSUFBSSxTQUFTLENBQUMsTUFBTTtJQUMzQixZQUFBLE1BQU0sSUFBSSxLQUFLLENBQ2IsQ0FBQSxnQkFBQSxFQUFtQixLQUFLLENBQUEsa0JBQUEsRUFBcUIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFFLENBQUEsQ0FDNUQ7WUFDSCxRQUFRLENBQ04sUUFBUSxDQUFDLEdBQUcsQ0FBQ0Esc0JBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBYyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUN0RSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQ2pCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztJQUNoQixLQUFDO0lBQ0g7SUFFQTs7Ozs7Ozs7SUFRRztJQUNhLFNBQUEsYUFBYSxDQUFDLEdBQVcsRUFBRSxLQUFVLEVBQUE7SUFDbkQsSUFBQSxPQUFPLFNBQVMsYUFBYSxDQUFDLE1BQVcsRUFBRSxJQUFTLEVBQUUsS0FBYSxFQUFBO0lBQ2pFLFFBQUEsT0FBTyxLQUFLLENBQ1YsS0FBSyxFQUFFLEVBQ1AsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUNBLHNCQUFjLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FDakUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztJQUN4QixLQUFDO0lBQ0g7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFpQkc7YUFDYSxNQUFNLEdBQUE7SUFDcEIsSUFBQSxPQUFPLFNBQVMsTUFBTSxDQUFDLEdBQVEsRUFBRSxJQUFVLEVBQUUsVUFBZ0IsRUFBQTtJQUMzRCxRQUFBLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQ3pDQSxzQkFBYyxDQUFDLGFBQWEsRUFDNUIsR0FBRyxFQUNILElBQUksQ0FDTDtJQUNELFFBQUEsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FDekNBLHNCQUFjLENBQUMsYUFBYSxFQUM1QixHQUFHLEVBQ0gsSUFBSSxDQUNMO1lBQ0QsT0FBTyxLQUFLLENBQ1YsUUFBUSxDQUNOLFFBQVEsQ0FBQyxHQUFHLENBQ1ZBLHNCQUFjLENBQUMsT0FBTyxFQUN0QixJQUFJLEVBQ0pBLHNCQUFjLENBQUMsYUFBYSxDQUM3QixFQUNELFlBQVksQ0FDYixFQUNELFFBQVEsQ0FDTixRQUFRLENBQUMsR0FBRyxDQUNWQSxzQkFBYyxDQUFDLE9BQU8sRUFDdEIsSUFBSSxFQUNKQSxzQkFBYyxDQUFDLGFBQWEsQ0FDN0IsRUFDRCxZQUFZLENBQ2IsQ0FDRixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDO0lBQzFCLEtBQUM7SUFDSDtJQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFrQkc7SUFDYSxTQUFBLEtBQUssQ0FDbkIsR0FBRyxVQUVGLEVBQUE7SUFFRCxJQUFBLE9BQU8sQ0FDTCxNQUFjLEVBQ2QsV0FBdUMsRUFDdkMsVUFBd0MsS0FDdEM7SUFDRixRQUFBLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO0lBQ2xDLFlBQUEsSUFBSSxNQUFNLFlBQVksUUFBUSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUM1QyxTQUE0QixDQUFDLE1BQU0sQ0FBQztvQkFDckM7O0lBRUQsWUFBQSxTQUFpRCxDQUNoRCxNQUFNLEVBQ04sV0FBOEIsRUFDOUIsVUFBOEMsQ0FDL0M7O0lBRUwsS0FBQztJQUNIO0lBRUE7Ozs7Ozs7O0lBUUc7SUFDYSxTQUFBLFlBQVksQ0FBQyxHQUFXLEVBQUUsS0FBVSxFQUFBO0lBQ2xELElBQUEsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUM1QztJQUVBOzs7Ozs7OztJQVFHO0lBQ2EsU0FBQSxjQUFjLENBQUMsR0FBVyxFQUFFLEtBQVUsRUFBQTtJQUNwRCxJQUFBLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDOUM7SUFFQTs7Ozs7OztJQU9HO0lBRUcsU0FBVSxXQUFXLENBQUMsSUFBWSxFQUFBO1FBQ3RDLFNBQVMsZ0JBQWdCLENBQUMsSUFBWSxFQUFBO0lBQ3BDLFFBQUEsT0FBTyxTQUFTLGdCQUFnQixDQUM5QixRQUFhLEVBQ2IsSUFBVSxFQUNWLFVBQWdCLEVBQUE7SUFFaEIsWUFBQSxPQUFPLFFBQVEsQ0FDYjtJQUNFLGdCQUFBQSxzQkFBYyxDQUFDLFdBQVc7SUFDMUIsZ0JBQUEsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBR0Esc0JBQWMsQ0FBQyxLQUFLO0lBQzlDLGFBQUEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUN6QixJQUFJLENBQ0wsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQztJQUMvQixTQUFDOztJQUdILElBQUEsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDQSxzQkFBYyxDQUFDLFdBQVc7SUFDN0MsU0FBQSxNQUFNLENBQUM7SUFDTixRQUFBLFNBQVMsRUFBRSxnQkFBZ0I7WUFDM0IsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO1NBQ2I7SUFDQSxTQUFBLEtBQUssRUFBRTtJQUNaOztJQzFRQTs7OztJQUlHO0lBU0g7Ozs7OztJQU1HO0FBQ0ksVUFBTSxPQUFPLEdBQUc7SUFFdkIsUUFBUSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsRUFBRSxPQUFPLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsifQ==
|
|
999
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdGlvbi5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMudHMiLCIuLi9zcmMvbWV0YWRhdGEvTWV0YWRhdGEudHMiLCIuLi9zcmMvZGVjb3JhdGlvbi9EZWNvcmF0aW9uLnRzIiwiLi4vc3JjL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzaWNNZXRhZGF0YSB9IGZyb20gXCIuL21ldGFkYXRhL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgZmxhdm91ciBpZGVudGlmaWVyIGZvciB0aGUgZGVjb3JhdG9yIHN5c3RlbS5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGZhbGxiYWNrIGZsYXZvdXIgdXNlZCB3aGVuIG5vIHNwZWNpZmljIHZhbHVlIGlzIHByb3ZpZGVkLCBlbnN1cmluZyBjb25zaXN0ZW50IGRlY29yYXRvciBzZWxlY3Rpb24gYWNyb3NzIHRoZSBsaWJyYXJ5LlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBjb25zdCBEZWZhdWx0Rmxhdm91clxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0Rmxhdm91ciA9IFwiZGVjYWZcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2hhcmFjdGVyIHVzZWQgdG8gc3BsaXQgbmVzdGVkIG1ldGFkYXRhIGtleXMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBkZWxpbWl0ZXIgYXBwbGllZCBieSB0aGUgbWV0YWRhdGEgc3RvcmUgd2hlbiB0cmF2ZXJzaW5nIG5lc3RlZCBvYmplY3QgcGF0aHMgZm9yIHJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMuXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGNvbnN0IE9iamVjdEtleVNwbGl0dGVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IE9iamVjdEtleVNwbGl0dGVyID0gXCIuXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGFkYXRhIHRva2VuIHJlZ2lzdHJ5IGZvciB0aGUgZGVjb3JhdGlvbiBzeXN0ZW0uXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBrZXlzIHVzZWQgZHVyaW5nIHJlZmxlY3Rpb24gYW5kIG1ldGFkYXRhIHN0b3JhZ2UgZm9yIGNsYXNzZXMsIHByb3BlcnRpZXMsIG1ldGhvZHMsIGRlc2NyaXB0aW9ucywgYW5kIHJlZ2lzdGVyZWQgbGlicmFyaWVzLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQGNvbnN0IERlY29yYXRpb25LZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGVudW0gRGVjb3JhdGlvbktleXMge1xuICAvKiogQGRlc2NyaXB0aW9uIFN0b3JhZ2UgYnVja2V0IGZvciBkZWNvcmF0aW9uLWF3YXJlIGxpYnJhcnkgcmVnaXN0cmF0aW9ucy4gKi9cbiAgTElCUkFSSUVTID0gXCJsaWJyYXJpZXNcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBTdG9yYWdlIGtleSBtaXJyb3JlZCBvbiBjb25zdHJ1Y3RvcnMgdGhhdCBob2xkcyBydW50aW1lIG1ldGFkYXRhLiAqL1xuICBSRUZMRUNUID0gYF9fJHtEZWZhdWx0Rmxhdm91cn1gLFxuICAvKiogQGRlc2NyaXB0aW9uIENvbnRhaW5lciBvZiByZWZsZWN0ZWQgcHJvcGVydHkgbWV0YWRhdGEgZm9yIGEgbW9kZWwuICovXG4gIFBST1BFUlRJRVMgPSBcInByb3BlcnRpZXNcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBDb250YWluZXIgb2YgcmVmbGVjdGVkIG1ldGhvZCBtZXRhZGF0YSBmb3IgYSBtb2RlbC4gKi9cbiAgTUVUSE9EUyA9IFwibWV0aG9kc1wiLFxuICAvKiogQGRlc2NyaXB0aW9uIEtleSB1bmRlciB3aGljaCB0aGUgbW9kZWwgY29uc3RydWN0b3IgcmVmZXJlbmNlIGlzIHBlcnNpc3RlZC4gKi9cbiAgQ0xBU1MgPSBcImNsYXNzXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb25zIGZvciBjbGFzc2VzIGFuZCBtZW1iZXJzLiAqL1xuICBERVNDUklQVElPTiA9IFwiZGVzY3JpcHRpb25cIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBTdG9yYWdlIHNsb3QgdHJhY2tpbmcgdGhlIG9yaWdpbmFsIGNvbnN0cnVjdG9yIHdoZW4gb3ZlcnJpZGRlbi4gKi9cbiAgQ09OU1RSVUNUT1IgPSBcIl9fb3JpZ2luYWxcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBDb2xsZWN0ZWQgcGFyYW1ldGVyIG1ldGFkYXRhIGZvciBjb25maWd1cmVkIGRlY29yYXRvcnMuICovXG4gIFBBUkFNRVRFUlMgPSBcInBhcmFtZXRlcnNcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWZsZWN0IG1ldGFkYXRhIGtleSBmb3IgYSBwcm9wZXJ0eSdzIGRlc2lnbiB0eXBlLiAqL1xuICBERVNJR05fVFlQRSA9IFwiZGVzaWduOnR5cGVcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWZsZWN0IG1ldGFkYXRhIGtleSBmb3IgcmVjb3JkZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzLiAqL1xuICBERVNJR05fUEFSQU1TID0gXCJkZXNpZ246cGFyYW10eXBlc1wiLFxuICAvKiogQGRlc2NyaXB0aW9uIFJlZmxlY3QgbWV0YWRhdGEga2V5IGZvciBhIG1ldGhvZCdzIHJldHVybiB0eXBlLiAqL1xuICBERVNJR05fUkVUVVJOID0gXCJkZXNpZ246cmV0dXJudHlwZVwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IG1ldGFkYXRhIGluc3RhbmNlLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIGRlZmF1bHQgbWV0YWRhdGEgc2hhcGUgdXNlZCB3aGVuIGluaXRpYWxpc2luZyBuZXcgbWV0YWRhdGEgZW50cmllcyBmb3IgYSBtb2RlbC5cbiAqIEB0eXBlIHttb2R1bGU6ZGVjb3JhdGlvbi5CYXNpY01ldGFkYXRhPGFueT59XG4gKiBAY29uc3QgRGVmYXVsdE1ldGFkYXRhXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRNZXRhZGF0YTogQmFzaWNNZXRhZGF0YTxhbnk+ID0ge1xuICBbRGVjb3JhdGlvbktleXMuUFJPUEVSVElFU106IFtdLFxufSBhcyB1bmtub3duIGFzIEJhc2ljTWV0YWRhdGE8YW55PjtcbiIsImltcG9ydCB7IEJhc2ljTWV0YWRhdGEsIENvbnN0cnVjdG9yIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY29yYXRpb25LZXlzLCBPYmplY3RLZXlTcGxpdHRlciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgbmVzdGVkIHZhbHVlIGZyb20gYW4gb2JqZWN0IGdpdmVuIGEgcGF0aC5cbiAqIEBzdW1tYXJ5IFdhbGtzIGFuIG9iamVjdCBzdHJ1Y3R1cmUgdXNpbmcgYSBzcGxpdHRlci1kZWxpbWl0ZWQgcGF0aCBhbmQgcmV0dXJucyB0aGUgdmFsdWUgYXQgdGhhdCBsb2NhdGlvbiBvciBgdW5kZWZpbmVkYCBpZiBhbnkga2V5IGlzIG1pc3NpbmcuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iaiBPYmplY3QgdG8gdHJhdmVyc2UgZm9yIHRoZSBsb29rdXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBTcGxpdHRlci1kZWxpbWl0ZWQgcGF0aCB0byB0aGUgZGVzaXJlZCB2YWx1ZSAoZS5nLiwgXCJhLmIuY1wiKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3BsaXR0ZXI9T2JqZWN0S2V5U3BsaXR0ZXJdIERlbGltaXRlciB1c2VkIHRvIHNlcGFyYXRlIHRoZSBwYXRoIHNlZ21lbnRzLlxuICogQHJldHVybiB7YW55fHVuZGVmaW5lZH0gVmFsdWUgcmVzb2x2ZWQgYXQgdGhlIGdpdmVuIHBhdGggb3IgYHVuZGVmaW5lZGAgd2hlbiBub3QgZm91bmQuXG4gKiBAZnVuY3Rpb24gZ2V0VmFsdWVCeVNwbGl0dGVyXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgZ2V0VmFsdWVCeVNwbGl0dGVyXG4gKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JqZWN0XG4gKiAgIEMtPj5GOiAob2JqLCBwYXRoLCBzcGxpdHRlcilcbiAqICAgRi0+PkY6IHNwbGl0IHBhdGggaW50byBrZXlzXG4gKiAgIGxvb3AgZm9yIGVhY2gga2V5XG4gKiAgICAgRi0+Pk86IGFjY2VzcyBjdXJyZW50W2tleV1cbiAqICAgICBhbHQgbWlzc2luZyBvciBudWxsaXNoXG4gKiAgICAgICBGLS0+PkM6IHJldHVybiB1bmRlZmluZWRcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIEYtLT4+QzogcmV0dXJuIGZpbmFsIHZhbHVlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlQnlTcGxpdHRlcihcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHNwbGl0dGVyOiBzdHJpbmcgPSBPYmplY3RLZXlTcGxpdHRlclxuKTogYW55IHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoc3BsaXR0ZXIpO1xuICBsZXQgY3VycmVudCA9IG9iajtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgaWYgKFxuICAgICAgY3VycmVudCA9PT0gbnVsbCB8fFxuICAgICAgY3VycmVudCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSlcbiAgICApXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cblxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2V0cyBhIG5lc3RlZCB2YWx1ZSBvbiBhbiBvYmplY3QgZ2l2ZW4gYSBwYXRoLlxuICogQHN1bW1hcnkgVHJhdmVyc2VzIG9yIGNyZWF0ZXMgaW50ZXJtZWRpYXRlIG9iamVjdHMgZm9sbG93aW5nIGEgc3BsaXR0ZXItZGVsaW1pdGVkIHBhdGggYW5kIGFzc2lnbnMgdGhlIHByb3ZpZGVkIHZhbHVlIGF0IHRoZSBkZXN0aW5hdGlvbiBrZXkuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iaiBPYmplY3QgdG8gbXV0YXRlIHdoaWxlIGRyaWxsaW5nIGludG8gbmVzdGVkIGtleXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBTcGxpdHRlci1kZWxpbWl0ZWQgZGVzdGluYXRpb24gcGF0aCAoZS5nLiwgXCJhLmIuY1wiKS5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSBWYWx1ZSB0byBzZXQgYXQgdGhlIGRlc3RpbmF0aW9uIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NwbGl0dGVyPU9iamVjdEtleVNwbGl0dGVyXSBEZWxpbWl0ZXIgdXNlZCB0byBzZXBhcmF0ZSB0aGUgcGF0aCBzZWdtZW50cy5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAZnVuY3Rpb24gc2V0VmFsdWVCeVNwbGl0dGVyXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgc2V0VmFsdWVCeVNwbGl0dGVyXG4gKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JqZWN0XG4gKiAgIEMtPj5GOiAob2JqLCBwYXRoLCB2YWx1ZSwgc3BsaXR0ZXIpXG4gKiAgIEYtPj5GOiBzcGxpdCBwYXRoIGludG8ga2V5c1xuICogICBsb29wIGZvciBlYWNoIGtleVxuICogICAgIGFsdCBrZXkgbWlzc2luZ1xuICogICAgICAgRi0+Pk86IGNyZWF0ZSBpbnRlcm1lZGlhdGUgb2JqZWN0XG4gKiAgICAgZWxzZSBrZXkgZXhpc3RzXG4gKiAgICAgICBGLT4+TzogZGVzY2VuZCBpbnRvIGV4aXN0aW5nIG9iamVjdFxuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgRi0tPj5DOiB2b2lkXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFZhbHVlQnlTcGxpdHRlcihcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4gIHNwbGl0dGVyID0gT2JqZWN0S2V5U3BsaXR0ZXJcbik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChzcGxpdHRlcikuZmlsdGVyKChrKSA9PiBrLmxlbmd0aCA+IDApO1xuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBsZXQgY3VycmVudDogUmVjb3JkPGFueSwgYW55PiA9IG9iajtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoXG4gICAgICBjdXJyZW50W2tleV0gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgY3VycmVudFtrZXldID09PSBudWxsIHx8XG4gICAgICB0eXBlb2YgY3VycmVudFtrZXldICE9PSBcIm9iamVjdFwiXG4gICAgKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSB7fTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuXG4gIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gIGN1cnJlbnRbbGFzdEtleV0gPSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2VudHJhbGl6ZWQgcnVudGltZSBtZXRhZGF0YSBzdG9yZSBib3VuZCB0byBjb25zdHJ1Y3RvcnMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyB1dGlsaXRpZXMgdG8gcmVhZCBhbmQgd3JpdGUgc3RydWN0dXJlZCBtZXRhZGF0YSBmb3IgY2xhc3NlcyBhbmQgdGhlaXIgbWVtYmVycywgd2l0aCBvcHRpb25hbCBtaXJyb3Jpbmcgb250byB0aGUgY29uc3RydWN0b3IgdmlhIGEgd2VsbC1rbm93biBzeW1ib2wga2V5LiBTdXBwb3J0cyBuZXN0ZWQga2V5IHBhdGhzIHVzaW5nIGEgY29uZmlndXJhYmxlIHNwbGl0dGVyIGFuZCBvZmZlcnMgYm90aCBpbnN0YW5jZSBhbmQgc3RhdGljIEFQSXMuXG4gKiBAdGVtcGxhdGUgTSBUaGUgbW9kZWwgdHlwZSB0aGUgbWV0YWRhdGEgYmVsb25ncyB0by5cbiAqIEB0ZW1wbGF0ZSBNRVRBIEV4dGVuZHMgQmFzaWNNZXRhZGF0YTxNPiByZXByZXNlbnRpbmcgdGhlIG1ldGFkYXRhIHN0cnVjdHVyZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cj1EZWZhdWx0Rmxhdm91cl0gT3B0aW9uYWwgZmxhdm91ciBpZGVudGlmaWVyIGFwcGxpZWQgd2hlbiBpbnN0YW50aWF0aW5nIGhlbHBlciBidWlsZGVycy5cbiAqIEBjbGFzc1xuICogQGV4YW1wbGVcbiAqIC8vIERlZmluZSBhbmQgcmVhZCBtZXRhZGF0YSBmb3IgYSBjbGFzc1xuICogY2xhc3MgVXNlciB7IG5hbWUhOiBzdHJpbmcgfVxuICogTWV0YWRhdGEuc2V0KFVzZXIsIFwiZGVzY3JpcHRpb24uY2xhc3NcIiwgXCJBIHVzZXIgbW9kZWxcIik7XG4gKiBNZXRhZGF0YS5zZXQoVXNlciwgXCJwcm9wZXJ0aWVzLm5hbWVcIiwgU3RyaW5nKTtcbiAqIGNvbnN0IGRlc2MgPSBNZXRhZGF0YS5nZXQoVXNlciwgXCJkZXNjcmlwdGlvbi5jbGFzc1wiKTsgLy8gXCJBIHVzZXIgbW9kZWxcIlxuICogY29uc3QgdHlwZSA9IE1ldGFkYXRhLnR5cGUoVXNlciwgXCJuYW1lXCIpOyAvLyBTdHJpbmdcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDb25zdHJ1Y3RvclxuICogICBwYXJ0aWNpcGFudCBTIGFzIE1ldGFkYXRhIChzdGF0aWMpXG4gKiAgIEMtPj5TOiBzZXQoVXNlciwgXCJwcm9wZXJ0aWVzLm5hbWVcIiwgU3RyaW5nKVxuICogICBDLT4+UzogZ2V0KFVzZXIsIFwicHJvcGVydGllcy5uYW1lXCIpXG4gKiAgIFMtLT4+QzogU3RyaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW4tbWVtb3J5IHN0b3JhZ2Ugb2YgbWV0YWRhdGEgYnkgY29uc3RydWN0b3Igc3ltYm9sXG4gICAqIEBzdW1tYXJ5IE1hcHMgYSBTeW1ib2wgZGVyaXZlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvciB0byBpdHMgbWV0YWRhdGEgb2JqZWN0LCBlbmFibGluZyBlZmZpY2llbnQgbG9va3VwLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX21ldGFkYXRhOiBSZWNvcmQ8c3ltYm9sLCBhbnk+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXRoIGRlbGltaXRlciBmb3IgbmVzdGVkIG1ldGFkYXRhIGtleXNcbiAgICogQHN1bW1hcnkgVXNlZCBieSBnZXQvc2V0IG9wZXJhdGlvbnMgdG8gbmF2aWdhdGUgbmVzdGVkIHN0cnVjdHVyZXMsIGRlZmF1bHRzIHRvIE9iamVjdEtleVNwbGl0dGVyLlxuICAgKi9cbiAgc3RhdGljIHNwbGl0dGVyID0gT2JqZWN0S2V5U3BsaXR0ZXI7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3ltYm9sIGtleSB1c2VkIHRvIG1pcnJvciBtZXRhZGF0YSBvbiB0aGUgY29uc3RydWN0b3JcbiAgICogQHN1bW1hcnkgV2hlbiBtaXJyb3JpbmcgaXMgZW5hYmxlZCwgdGhlIG1ldGFkYXRhIG9iamVjdCBpcyBkZWZpbmVkIG9uIHRoZSBjb25zdHJ1Y3RvciB1bmRlciB0aGlzIG5vbi1lbnVtZXJhYmxlIGtleS5cbiAgICovXG4gIHN0YXRpYyBiYXNlS2V5ID0gRGVjb3JhdGlvbktleXMuUkVGTEVDVDtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIG1ldGFkYXRhIGlzIG1pcnJvcmVkIG9udG8gdGhlIGNvbnN0cnVjdG9yXG4gICAqIEBzdW1tYXJ5IFdoZW4gdHJ1ZSwgdGhlIG1ldGFkYXRhIG9iamVjdCBpcyBkZWZpbmVkIG9uIHRoZSBjb25zdHJ1Y3RvciB1bmRlciB0aGUgbm9uLWVudW1lcmFibGUgYmFzZUtleS5cbiAgICovXG4gIHN0YXRpYyBtaXJyb3I6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHN0YXRpYyBTeW1ib2w8TT4ob2JqOiBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHJldHVybiBTeW1ib2wuZm9yKFtvYmoudG9TdHJpbmcoKSwgb2JqLm5hbWVdLmpvaW4oXCIgLSBcIikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0cyBrbm93biBwcm9wZXJ0eSBrZXlzIGZvciBhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBSZWFkcyB0aGUgbWV0YWRhdGEgZW50cnkgYW5kIHJldHVybnMgdGhlIG5hbWVzIG9mIHByb3BlcnRpZXMgdGhhdCBoYXZlIHJlY29yZGVkIHR5cGUgaW5mb3JtYXRpb24uXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3J9IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB3aG9zZSBwcm9wZXJ0eSBtZXRhZGF0YSBzaG91bGQgYmUgaW5zcGVjdGVkLlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXXx1bmRlZmluZWR9IEFycmF5IG9mIHByb3BlcnR5IG5hbWVzIG9yIGB1bmRlZmluZWRgIGlmIG5vIG1ldGFkYXRhIGV4aXN0cy5cbiAgICovXG4gIHN0YXRpYyBwcm9wZXJ0aWVzKG1vZGVsOiBDb25zdHJ1Y3Rvcik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXQobW9kZWwpO1xuICAgIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWV0YS5wcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlzdHMga25vd24gbWV0aG9kcyBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIG1ldGFkYXRhIGVudHJ5IGFuZCByZXR1cm5zIHRoZSBtZXRob2QgbmFtZXMgdGhhdCBoYXZlIHJlY29yZGVkIHNpZ25hdHVyZSBtZXRhZGF0YSBmb3IgdGhlIHByb3ZpZGVkIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yfSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igd2hvc2UgbWV0aG9kIG1ldGFkYXRhIHNob3VsZCBiZSBpbnNwZWN0ZWQuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfHVuZGVmaW5lZH0gQXJyYXkgb2YgbWV0aG9kIG5hbWVzIG9yIGB1bmRlZmluZWRgIGlmIG5vIG1ldGFkYXRhIGV4aXN0cy5cbiAgICovXG4gIHN0YXRpYyBtZXRob2RzKG1vZGVsOiBDb25zdHJ1Y3Rvcik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXQobW9kZWwsIERlY29yYXRpb25LZXlzLk1FVEhPRFMpO1xuICAgIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWV0YSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciBhIGNsYXNzIG9yIGEgcHJvcGVydHkuXG4gICAqIEBzdW1tYXJ5IExvb2tzIHVwIHRoZSBkZXNjcmlwdGlvbiBzdG9yZWQgdW5kZXIgdGhlIG1ldGFkYXRhIFwiZGVzY3JpcHRpb25cIiBtYXAuIElmIGEgcHJvcGVydHkga2V5IGlzIHByb3ZpZGVkLCByZXR1cm5zIHRoZSBwcm9wZXJ0eSdzIGRlc2NyaXB0aW9uOyBvdGhlcndpc2UgcmV0dXJucyB0aGUgY2xhc3MgZGVzY3JpcHRpb24uXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB3aG9zZSBkZXNjcmlwdGlvbiBpcyBiZWluZyByZXRyaWV2ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcF0gT3B0aW9uYWwgcHJvcGVydHkga2V5ICh0eXBlZCBhcyBga2V5b2YgTWApIGZvciB3aGljaCB0byBmZXRjaCB0aGUgZGVzY3JpcHRpb24uXG4gICAqIEByZXR1cm4ge3N0cmluZ3x1bmRlZmluZWR9IERlc2NyaXB0aW9uIHRleHQgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgc3RhdGljIGRlc2NyaXB0aW9uPE0+KFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBwcm9wPzoga2V5b2YgTVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldChcbiAgICAgIG1vZGVsLFxuICAgICAgdGhpcy5rZXkoXG4gICAgICAgIERlY29yYXRpb25LZXlzLkRFU0NSSVBUSU9OLFxuICAgICAgICAocHJvcCA/IHByb3AgOiBEZWNvcmF0aW9uS2V5cy5DTEFTUykgYXMgc3RyaW5nXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSByZWNvcmRlZCBwYXJhbXMgZm9yIGEgbWV0aG9kLlxuICAgKiBAc3VtbWFyeSBSZWFkcyB0aGUgbWV0YWRhdGEgZW50cnkgdW5kZXIgYG1ldGhvZHMuPHByb3A+LmRlc2lnbjpwYXJhbXR5cGVzYCB0byByZXR1cm4gdGhlIHBhcmFtZXRlciBjb25zdHJ1Y3RvcnMgZm9yIHRoZSBnaXZlbiBtZXRob2QuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciBvd25pbmcgdGhlIG1ldGhvZCBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgTWV0aG9kIG5hbWUgd2hvc2UgcGFyYW1ldGVycyBzaG91bGQgYmUgZmV0Y2hlZC5cbiAgICogQHJldHVybiB7YW55W118dW5kZWZpbmVkfSBBcnJheSBvZiBjb25zdHJ1Y3RvciByZWZlcmVuY2VzIGRlc2NyaWJpbmcgZWFjaCBwYXJhbWV0ZXIgb3IgYHVuZGVmaW5lZGAgd2hlbiBub3QgYXZhaWxhYmxlLlxuICAgKi9cbiAgc3RhdGljIHBhcmFtczxNPihtb2RlbDogQ29uc3RydWN0b3I8TT4sIHByb3A6IHN0cmluZyk6IGFueVtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoXG4gICAgICBtb2RlbCxcbiAgICAgIHRoaXMua2V5KERlY29yYXRpb25LZXlzLk1FVEhPRFMsIHByb3AsIERlY29yYXRpb25LZXlzLkRFU0lHTl9QQVJBTVMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgc2luZ2xlIHJlY29yZGVkIHBhcmFtZXRlciB0eXBlIGZvciBhIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgTG9va3MgdXAgdGhlIHBhcmFtZXRlciBtZXRhZGF0YSBmb3IgdGhlIHByb3ZpZGVkIGluZGV4LCBlbmZvcmNpbmcgYm91bmRzIGFuZCByZXR1cm5pbmcgdGhlIGNvbnN0cnVjdG9yIHJlZmVyZW5jZSBmb3IgdGhhdCBhcmd1bWVudC5cbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIG93bmluZyB0aGUgbWV0aG9kIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBNZXRob2QgbmFtZSB3aG9zZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIHJldHVybmVkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggWmVyby1iYXNlZCBpbmRleCBvZiB0aGUgZGVzaXJlZCBwYXJhbWV0ZXIgbWV0YWRhdGEuXG4gICAqIEByZXR1cm4ge2FueXx1bmRlZmluZWR9IENvbnN0cnVjdG9yIHJlZmVyZW5jZSBmb3IgdGhlIHBhcmFtZXRlciBvciBgdW5kZWZpbmVkYCBpZiBub3QgcmVjb3JkZWQuXG4gICAqL1xuICBzdGF0aWMgcGFyYW08TT4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIHByb3A6IHN0cmluZyxcbiAgICBpbmRleDogbnVtYmVyXG4gICk6IGFueSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5wYXJhbXMobW9kZWwsIHByb3ApO1xuICAgIGlmICghcGFyYW1zKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChpbmRleCA+IHBhcmFtcy5sZW5ndGggLSAxKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUGFyYW1ldGVyIGluZGV4ICR7aW5kZXh9IG91dCBvZiByYW5nZSBmb3IgJHtTdHJpbmcocHJvcCl9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcGFyYW1zW2luZGV4XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSByZWNvcmRlZCByZXR1cm4gdHlwZSBmb3IgYSBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IFJlYWRzIHRoZSBtZXRhZGF0YSBlbnRyeSB1bmRlciBgbWV0aG9kcy48cHJvcD4uZGVzaWduOnJldHVybnR5cGVgIHRvIHJldHVybiB0aGUgcmV0dXJuIHR5cGUgZm9yIHRoZSBnaXZlbiBtZXRob2QuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB3aG9zZSBtZXRob2QgbWV0YWRhdGEgc2hvdWxkIGJlIGluc3BlY3RlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgTWV0aG9kIG5hbWUgd2hvc2UgcmV0dXJuIHR5cGUgc2hvdWxkIGJlIGZldGNoZWQuXG4gICAqIEByZXR1cm4ge2FueXx1bmRlZmluZWR9IENvbnN0cnVjdG9yIHJlZmVyZW5jZSBmb3IgdGhlIHJldHVybiB0eXBlIG9yIGB1bmRlZmluZWRgIHdoZW4gbm90IGF2YWlsYWJsZS5cbiAgICovXG4gIHN0YXRpYyByZXR1cm48TT4obW9kZWw6IENvbnN0cnVjdG9yPE0+LCBwcm9wOiBzdHJpbmcpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldChcbiAgICAgIG1vZGVsLFxuICAgICAgdGhpcy5rZXkoRGVjb3JhdGlvbktleXMuTUVUSE9EUywgcHJvcCwgRGVjb3JhdGlvbktleXMuREVTSUdOX1JFVFVSTilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIHJlY29yZGVkIGRlc2lnbiB0eXBlIGZvciBhIHByb3BlcnR5LlxuICAgKiBAc3VtbWFyeSBSZWFkcyB0aGUgbWV0YWRhdGEgZW50cnkgdW5kZXIgYHByb3BlcnRpZXMuPHByb3A+YCB0byByZXR1cm4gdGhlIGNvbnN0cnVjdG9yIHJlY29yZGVkIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcn0gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIHdob3NlIHByb3BlcnR5IG1ldGFkYXRhIHNob3VsZCBiZSBpbnNwZWN0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IG5hbWUgd2hvc2UgdHlwZSBtZXRhZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yfHVuZGVmaW5lZH0gQ29uc3RydWN0b3IgcmVmZXJlbmNlIGZvciB0aGUgcHJvcGVydHkgdHlwZSBvciBgdW5kZWZpbmVkYCBpZiBub3QgYXZhaWxhYmxlLlxuICAgKi9cbiAgc3RhdGljIHR5cGUobW9kZWw6IENvbnN0cnVjdG9yLCBwcm9wOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQobW9kZWwsIHRoaXMua2V5KERlY29yYXRpb25LZXlzLlBST1BFUlRJRVMsIHByb3ApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZXMgdGhlIGNhbm9uaWNhbCBjb25zdHJ1Y3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIG1vZGVsIGhhbmRsZSBhbmQgbWV0YWRhdGEuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHN0b3JlZCBjb25zdHJ1Y3RvciByZWZlcmVuY2Ugd2hlbiB0aGUgcHJvdmlkZWQgbW9kZWwgaXMgYSBwcm94eSBvciByZWR1Y2VkIHZhbHVlLiBGYWxscyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtb2RlbCB3aGVuIG5vIGNvbnN0cnVjdG9yIG1ldGFkYXRhIGhhcyBiZWVuIHJlY29yZGVkIHlldC5cbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgTW9kZWwgdXNlZCB3aGVuIHJlY29yZGluZyBtZXRhZGF0YS5cbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8TT59IENhbm9uaWNhbCBjb25zdHJ1Y3RvciBpZiBzdG9yZWQsIG90aGVyd2lzZSB0aGUgcHJvdmlkZWQgb25lYC5cbiAgICovXG4gIHN0YXRpYyBjb25zdHI8TT4obW9kZWw6IENvbnN0cnVjdG9yPE0+KTogQ29uc3RydWN0b3I8TT4ge1xuICAgIHJldHVybiBtb2RlbFtEZWNvcmF0aW9uS2V5cy5DT05TVFJVQ1RPUiBhcyBrZXlvZiB0eXBlb2YgbW9kZWxdIHx8IG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbWV0YWRhdGEgZm9yIGEgbW9kZWwgb3IgYSBzcGVjaWZpYyBrZXkgd2l0aGluIGl0LlxuICAgKiBAc3VtbWFyeSBXaGVuIGNhbGxlZCB3aXRoIGEgY29uc3RydWN0b3Igb25seSwgcmV0dXJucyB0aGUgZW50aXJlIG1ldGFkYXRhIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsLiBXaGVuIGEga2V5IHBhdGggaXMgcHJvdmlkZWQsIHJldHVybnMgdGhlIHZhbHVlIHN0b3JlZCBhdCB0aGF0IG5lc3RlZCBrZXkuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEB0ZW1wbGF0ZSBNRVRBXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB1c2VkIHRvIGxvY2F0ZSB0aGUgbWV0YWRhdGEgcmVjb3JkLlxuICAgKiBAcmV0dXJuIHtNRVRBfHVuZGVmaW5lZH0gTWV0YWRhdGEgb2JqZWN0LCB0aGUgdmFsdWUgYXQgdGhlIGtleSBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBub3RoaW5nIGV4aXN0cy5cbiAgICovXG4gIHN0YXRpYyBnZXQ8TSwgTUVUQSBleHRlbmRzIEJhc2ljTWV0YWRhdGE8TT4gPSBCYXNpY01ldGFkYXRhPE0+PihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbiAgKTogTUVUQSB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbWV0YWRhdGEgZm9yIGEgbW9kZWwgb3IgYSBzcGVjaWZpYyBrZXkgd2l0aGluIGl0LlxuICAgKiBAc3VtbWFyeSBXaGVuIGNhbGxlZCB3aXRoIGEgY29uc3RydWN0b3Igb25seSwgcmV0dXJucyB0aGUgZW50aXJlIG1ldGFkYXRhIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsLiBXaGVuIGEga2V5IHBhdGggaXMgcHJvdmlkZWQsIHJldHVybnMgdGhlIHZhbHVlIHN0b3JlZCBhdCB0aGF0IG5lc3RlZCBrZXkuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEB0ZW1wbGF0ZSBNRVRBXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB1c2VkIHRvIGxvY2F0ZSB0aGUgbWV0YWRhdGEgcmVjb3JkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IE5lc3RlZCBrZXkgcGF0aCB0byBmZXRjaCBhIHNwZWNpZmljIHZhbHVlLlxuICAgKiBAcmV0dXJuIHtNRVRBfCp8dW5kZWZpbmVkfSBNZXRhZGF0YSBvYmplY3QsIHRoZSB2YWx1ZSBhdCB0aGUga2V5IHBhdGgsIG9yIGB1bmRlZmluZWRgIGlmIG5vdGhpbmcgZXhpc3RzLlxuICAgKi9cbiAgc3RhdGljIGdldChtb2RlbDogQ29uc3RydWN0b3IsIGtleTogc3RyaW5nKTogYW55O1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtZXRhZGF0YSBmb3IgYSBtb2RlbCBvciBhIHNwZWNpZmljIGtleSB3aXRoaW4gaXQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gY2FsbGVkIHdpdGggYSBjb25zdHJ1Y3RvciBvbmx5LCByZXR1cm5zIHRoZSBlbnRpcmUgbWV0YWRhdGEgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZWwuIFdoZW4gYSBrZXkgcGF0aCBpcyBwcm92aWRlZCwgcmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkIGF0IHRoYXQgbmVzdGVkIGtleS5cbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHRlbXBsYXRlIE1FVEFcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPnxzdHJpbmd9IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB1c2VkIHRvIGxvY2F0ZSB0aGUgbWV0YWRhdGEgcmVjb3JkIG9yIGEgcHJlLXJlc29sdmVkIHN5bWJvbCBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gT3B0aW9uYWwgbmVzdGVkIGtleSBwYXRoIHRvIGZldGNoIGEgc3BlY2lmaWMgdmFsdWUuXG4gICAqIEByZXR1cm4ge01FVEF8Knx1bmRlZmluZWR9IE1ldGFkYXRhIG9iamVjdCwgdGhlIHZhbHVlIGF0IHRoZSBrZXkgcGF0aCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90aGluZyBleGlzdHMuXG4gICAqL1xuICBzdGF0aWMgZ2V0KG1vZGVsOiBDb25zdHJ1Y3Rvciwga2V5Pzogc3RyaW5nKSB7XG4gICAgaWYgKGtleSA9PT0gRGVjb3JhdGlvbktleXMuQ09OU1RSVUNUT1IpIHJldHVybiB0aGlzLmNvbnN0cihtb2RlbCk7XG4gICAgY29uc3QgcmVzb2x2ZWRNb2RlbCA9IHRoaXMuY29uc3RyKG1vZGVsKTtcbiAgICBjb25zdCBjb25zdHJ1Y3RvcnMgPSB0aGlzLmNvbGxlY3RDb25zdHJ1Y3RvckNoYWluKHJlc29sdmVkTW9kZWwpO1xuICAgIGlmIChjb25zdHJ1Y3RvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBmYWxsYmFja1N5bWJvbCA9IFN5bWJvbC5mb3IocmVzb2x2ZWRNb2RlbC50b1N0cmluZygpKTtcbiAgICAgIHJldHVybiB0aGlzLmlubmVyR2V0KGZhbGxiYWNrU3ltYm9sLCBrZXkpO1xuICAgIH1cbiAgICBjb25zdCBjb2xsZWN0ZWRWYWx1ZXMgPSBjb25zdHJ1Y3RvcnNcbiAgICAgIC5tYXAoKGN0b3IpID0+IHRoaXMuaW5uZXJHZXQodGhpcy5TeW1ib2woY3RvciksIGtleSkpXG4gICAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoY29sbGVjdGVkVmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB0aGlzLm1lcmdlTWV0YWRhdGFDaGFpbihjb2xsZWN0ZWRWYWx1ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbWV0YWRhdGEgc3RvcmVkIHVuZGVyIGEgc3ltYm9sIGtleS5cbiAgICogQHN1bW1hcnkgSW50ZXJuYWwgaGVscGVyIHRoYXQgcmVzb2x2ZXMgYW5kIG9wdGlvbmFsbHkgZHJpbGxzIGludG8gdGhlIGluLW1lbW9yeSBtZXRhZGF0YSBtYXAgZm9yIHRoZSBwcm92aWRlZCBzeW1ib2wgYW5kIGtleSBwYXRoLlxuICAgKiBAcGFyYW0ge3N5bWJvbH0gc3ltYm9sIFN5bWJvbCByZXByZXNlbnRpbmcgdGhlIG1ldGFkYXRhIGJ1Y2tldC5cbiAgICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBba2V5XSBPcHRpb25hbCBuZXN0ZWQga2V5IHJlZmVyZW5jaW5nIGEgc3BlY2lmaWMgbWV0YWRhdGEgZW50cnkuXG4gICAqIEByZXR1cm4ge2FueX0gU3RvcmVkIG1ldGFkYXRhIG9iamVjdCBvciB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIGtleSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBpbm5lckdldChzeW1ib2w6IHN5bWJvbCwga2V5Pzogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgaWYgKCF0aGlzLl9tZXRhZGF0YVtzeW1ib2xdKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICgha2V5KSByZXR1cm4gdGhpcy5fbWV0YWRhdGFbc3ltYm9sXTtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiBnZXRWYWx1ZUJ5U3BsaXR0ZXIodGhpcy5fbWV0YWRhdGFbc3ltYm9sXSwga2V5LCB0aGlzLnNwbGl0dGVyKTtcbiAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFbc3ltYm9sXVtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgdGhlIGluaGVyaXRhbmNlIGNoYWluIGZvciBhIGNvbnN0cnVjdG9yLCBvcmRlcmVkIGZyb20gYmFzZSB0byBtb3N0LXNwZWNpZmljIGNsYXNzLlxuICAgKiBAc3VtbWFyeSBXYWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIHN0YXJ0aW5nIGZyb20gdGhlIHByb3ZpZGVkIGNvbnN0cnVjdG9yIHVudGlsIHJlYWNoaW5nIEZ1bmN0aW9uL09iamVjdCBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGVkIGNvbnN0cnVjdG9ycy5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcn0gbW9kZWwgQ29uc3RydWN0b3Igd2hvc2UgY2hhaW4gc2hvdWxkIGJlIGNvbGxlY3RlZC5cbiAgICogQHJldHVybiB7Q29uc3RydWN0b3JbXX0gQXJyYXkgb2YgY29uc3RydWN0b3JzIG9yZGVyZWQgZnJvbSBiYXNlIHRvIGxlYWYuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjb2xsZWN0Q29uc3RydWN0b3JDaGFpbihtb2RlbDogQ29uc3RydWN0b3IpOiBDb25zdHJ1Y3RvcltdIHtcbiAgICBjb25zdCBjaGFpbjogQ29uc3RydWN0b3JbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcblxuICAgIHdoaWxlICh0eXBlb2YgY3VycmVudCA9PT0gXCJmdW5jdGlvblwiICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgICBjaGFpbi5wdXNoKGN1cnJlbnQgYXMgQ29uc3RydWN0b3IpO1xuICAgICAgY29uc3QgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50ID09PSBGdW5jdGlvbiB8fCBwYXJlbnQgPT09IE9iamVjdCkgYnJlYWs7XG4gICAgICBjdXJyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIHJldHVybiBjaGFpbi5yZXZlcnNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1lcmdlcyBtZXRhZGF0YSB2YWx1ZXMgY29sbGVjdGVkIGFjcm9zcyB0aGUgaW5oZXJpdGFuY2UgY2hhaW4uXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGEgZGVlcCBtZXJnZSBmb3IgcGxhaW4gb2JqZWN0cyB3aGlsZSBsZXR0aW5nIG5vbi1vYmplY3QgdmFsdWVzIG92ZXJyaWRlIGVhcmxpZXIgb25lcyB0byBwcmVzZXJ2ZSBjaGlsZCBtZXRhZGF0YSBwcmVjZWRlbmNlLlxuICAgKiBAcGFyYW0ge2FueVtdfSB2YWx1ZXMgTWV0YWRhdGEgdmFsdWVzIGdhdGhlcmVkIGZyb20gYmFzZSB0byBjaGlsZC5cbiAgICogQHJldHVybiB7YW55fSBBZ2dyZWdhdGVkIG1ldGFkYXRhIHZhbHVlIHJlc3BlY3RpbmcgaW5oZXJpdGFuY2UgcHJlY2VkZW5jZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIG1lcmdlTWV0YWRhdGFDaGFpbih2YWx1ZXM6IGFueVtdKSB7XG4gICAgbGV0IGFjYzogYW55ID0gdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmIChhY2MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY2MgPSB0aGlzLmNsb25lTWV0YWRhdGFWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc1BsYWluT2JqZWN0KGFjYykgJiYgdGhpcy5pc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICBhY2MgPSB0aGlzLm1lcmdlUGxhaW5PYmplY3RzKFxuICAgICAgICAgIGFjYyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgICAgIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGFjYyA9IHRoaXMuY2xvbmVNZXRhZGF0YVZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9kdWNlcyBhIGRlZXAgY2xvbmUgb2YgYSBtZXRhZGF0YSB2YWx1ZSB3aGVuIG5lY2Vzc2FyeS5cbiAgICogQHN1bW1hcnkgQXJyYXlzIGFyZSBzaGFsbG93LWNsb25lZCwgcGxhaW4gb2JqZWN0cyBhcmUgZGVlcC1jbG9uZWQsIGFuZCBwcmltaXRpdmUvZnVuY3Rpb24gdmFsdWVzIGFyZSByZXR1cm5lZCBhcy1pcy5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIE1ldGFkYXRhIHZhbHVlIHRvIGNsb25lLlxuICAgKiBAcmV0dXJuIHthbnl9IENsb25lZCBtZXRhZGF0YSB2YWx1ZSBwcmV2ZW50aW5nIG11dGF0aW9uIG9mIHRoZSBiYWNraW5nIHN0b3JlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY2xvbmVNZXRhZGF0YVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbLi4udmFsdWVdO1xuICAgIGlmICh0aGlzLmlzUGxhaW5PYmplY3QodmFsdWUpKVxuICAgICAgcmV0dXJuIHRoaXMubWVyZ2VQbGFpbk9iamVjdHMoe30sIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVlcGx5IG1lcmdlcyB0d28gcGxhaW4gbWV0YWRhdGEgb2JqZWN0cy5cbiAgICogQHN1bW1hcnkgUmVjdXJzaXZlbHkgbWVyZ2VzIG5lc3RlZCBwbGFpbiBvYmplY3RzIHdoaWxlIGNsb25pbmcgYXJyYXlzOyB2YWx1ZXMgZnJvbSBgc291cmNlYCBvdmVycmlkZSB0aG9zZSBmcm9tIGB0YXJnZXRgIHdoZW4gY29uZmxpY3RzIG9jY3VyLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRhcmdldCBCYXNlIG9iamVjdCB0byBtZXJnZSBpbnRvLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHNvdXJjZSBPYmplY3QgcHJvdmlkaW5nIG92ZXJyaWRpbmcgbWV0YWRhdGEuXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIGFueT59IE5ld2x5IG1lcmdlZCBtZXRhZGF0YSBvYmplY3QuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBtZXJnZVBsYWluT2JqZWN0cyhcbiAgICB0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgc291cmNlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4udGFyZ2V0IH07XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzb3VyY2UpKSB7XG4gICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSByZXN1bHRba2V5XTtcblxuICAgICAgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChzb3VyY2VWYWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmlzUGxhaW5PYmplY3QodGFyZ2V0VmFsdWUpXG4gICAgICAgICAgPyB0aGlzLm1lcmdlUGxhaW5PYmplY3RzKFxuICAgICAgICAgICAgICB0YXJnZXRWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgICAgICAgICBzb3VyY2VWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgICAgICApXG4gICAgICAgICAgOiB0aGlzLm1lcmdlUGxhaW5PYmplY3RzKHt9LCBzb3VyY2VWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZVZhbHVlKSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IFsuLi5zb3VyY2VWYWx1ZV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRba2V5XSA9IHNvdXJjZVZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0IHN1aXRhYmxlIGZvciBkZWVwIG1lcmdpbmcuXG4gICAqIEBzdW1tYXJ5IEVuc3VyZXMgYXJyYXlzIGFuZCBudWxsIGFyZSBleGNsdWRlZCB3aGlsZSBhY2NlcHRpbmcgb2JqZWN0cyBjcmVhdGVkIHZpYSBsaXRlcmFsL2NsYXNzIHN5bnRheC5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIFZhbHVlIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgd2hlbiB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBpc1BsYWluT2JqZWN0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdyaXRlcyBtZXRhZGF0YSB1bmRlciBhIHN5bWJvbCBrZXkuXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIGhlbHBlciB0aGF0IGVuc3VyZXMgdGhlIG1ldGFkYXRhIGJ1Y2tldCBleGlzdHMgZm9yIHRoZSBwcm92aWRlZCBzeW1ib2wgYW5kIHBlcnNpc3RzIHRoZSBnaXZlbiB2YWx1ZSwgZHJpbGxpbmcgaW50byBuZXN0ZWQgc3RydWN0dXJlcyB3aGVuIHRoZSBrZXkgaXMgYSBzdHJpbmcgcGF0aC5cbiAgICogQHBhcmFtIHtzeW1ib2x9IHN5bWJvbCBTeW1ib2wgcmVwcmVzZW50aW5nIHRoZSBtZXRhZGF0YSBidWNrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0ga2V5IE5lc3RlZCBrZXkgcGF0aCBvciBkaXJlY3Qgc3ltYm9sIHVuZGVyIHdoaWNoIHRvIHN0b3JlIHRoZSBtZXRhZGF0YSB2YWx1ZS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIFZhbHVlIHBlcnNpc3RlZCBpbiB0aGUgbWV0YWRhdGEgc3RvcmUuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBpbm5lclNldChzeW1ib2w6IHN5bWJvbCwga2V5OiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX21ldGFkYXRhW3N5bWJvbF0pIHRoaXMuX21ldGFkYXRhW3N5bWJvbF0gPSB7fSBhcyBhbnk7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gc2V0VmFsdWVCeVNwbGl0dGVyKFxuICAgICAgICB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0aGlzLnNwbGl0dGVyXG4gICAgICApO1xuICAgIHRoaXMuX21ldGFkYXRhW3N5bWJvbF1ba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXcml0ZXMgYSBtZXRhZGF0YSB2YWx1ZSBhdCBhIGdpdmVuIG5lc3RlZCBrZXkgcGF0aC5cbiAgICogQHN1bW1hcnkgRW5zdXJlcyB0aGUgbWV0YWRhdGEgcmVjb3JkIGV4aXN0cyBmb3IgdGhlIGNvbnN0cnVjdG9yLCBtaXJyb3JzIGl0IG9uIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGVuYWJsZWQsIGFuZCBzZXRzIHRoZSBwcm92aWRlZCB2YWx1ZSBvbiB0aGUgbmVzdGVkIGtleSBwYXRoIHVzaW5nIHRoZSBjb25maWd1cmVkIHNwbGl0dGVyLlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fHN0cmluZ30gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIHRvIHdoaWNoIHRoZSBtZXRhZGF0YSBiZWxvbmdzIG9yIGEgZGlyZWN0IGlkZW50aWZpZXIgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IE5lc3RlZCBrZXkgcGF0aCBhdCB3aGljaCB0byBzdG9yZSB0aGUgdmFsdWUuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBWYWx1ZSB0byBzdG9yZSBpbiB0aGUgbWV0YWRhdGEuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0KG1vZGVsOiBDb25zdHJ1Y3RvciB8IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoa2V5ID09PSBEZWNvcmF0aW9uS2V5cy5DT05TVFJVQ1RPUikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCBEZWNvcmF0aW9uS2V5cy5DT05TVFJVQ1RPUiwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBtb2RlbCAhPT0gXCJzdHJpbmdcIikgbW9kZWwgPSB0aGlzLmNvbnN0cihtb2RlbCkgfHwgbW9kZWw7XG4gICAgY29uc3Qgc3ltYm9sID1cbiAgICAgIHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IFN5bWJvbC5mb3IobW9kZWwpIDogdGhpcy5TeW1ib2wobW9kZWwpO1xuICAgIHRoaXMuaW5uZXJTZXQoc3ltYm9sLCBrZXksIHZhbHVlKTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbW9kZWwgIT09IFwic3RyaW5nXCIgJiZcbiAgICAgIE1ldGFkYXRhLm1pcnJvciAmJlxuICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbCwgdGhpcy5iYXNlS2V5KVxuICAgICkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCB0aGlzLmJhc2VLZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIGRlY29yYXRpb24tYXdhcmUgbGlicmFyeSBhbmQgaXRzIHZlcnNpb24uXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgdmVyc2lvbiBzdHJpbmcgZm9yIGFuIGludGVncmF0aW5nIGxpYnJhcnkgdW5kZXIgdGhlIHNoYXJlZCBsaWJyYXJpZXMgbWV0YWRhdGEgc3ltYm9sLCBwcmV2ZW50aW5nIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25zIGZvciB0aGUgc2FtZSBsaWJyYXJ5IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaWJyYXJ5IFBhY2thZ2UgbmFtZSBvciBpZGVudGlmaWVyIHRvIHJlZ2lzdGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiBTZW1hbnRpYyB2ZXJzaW9uIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGxpYnJhcnkuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgbGlicmFyeSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJMaWJyYXJ5KGxpYnJhcnk6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihEZWNvcmF0aW9uS2V5cy5MSUJSQVJJRVMpO1xuICAgIGNvbnN0IGxpYiA9IHRoaXMuaW5uZXJHZXQoc3ltYm9sLCBsaWJyYXJ5KTtcbiAgICBpZiAobGliKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTGlicmFyeSBhbHJlYWR5ICR7bGlicmFyeX0gcmVnaXN0ZXJlZCB3aXRoIHZlcnNpb24gJHt2ZXJzaW9ufWBcbiAgICAgICk7XG4gICAgdGhpcy5pbm5lclNldChzeW1ib2wsIGxpYnJhcnksIHZlcnNpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0cyByZWdpc3RlcmVkIGRlY29yYXRpb24tYXdhcmUgbGlicmFyaWVzLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBpbi1tZW1vcnkgbWFwIG9mIGxpYnJhcnkgaWRlbnRpZmllcnMgdG8gc2VtYW50aWMgdmVyc2lvbnMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBEZWNvcmF0aW9uIG1ldGFkYXRhIHN0b3JlLlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBNYXAgb2YgcmVnaXN0ZXJlZCBsaWJyYXJ5IGlkZW50aWZpZXJzIHRvIHRoZWlyIHZlcnNpb24gc3RyaW5ncy5cbiAgICovXG4gIHN0YXRpYyBsaWJyYXJpZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihEZWNvcmF0aW9uS2V5cy5MSUJSQVJJRVMpO1xuICAgIHJldHVybiB0aGlzLmlubmVyR2V0KHN5bWJvbCkgfHwge307XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEpvaW5zIHBhdGggc2VnbWVudHMgdXNpbmcgdGhlIGN1cnJlbnQgc3BsaXR0ZXIuXG4gICAqIEBzdW1tYXJ5IENvbnN0cnVjdHMgYSBuZXN0ZWQgbWV0YWRhdGEga2V5IGJ5IGNvbmNhdGVuYXRpbmcgc3RyaW5nIHNlZ21lbnRzIHdpdGggdGhlIGNvbmZpZ3VyZWQgc3BsaXR0ZXIgZm9yIHVzZSB3aXRoIHRoZSBtZXRhZGF0YSBzdG9yZS5cbiAgICogQHBhcmFtIHsuLi5zdHJpbmd9IHN0cnMgS2V5IHNlZ21lbnRzIHRvIGpvaW4gaW50byBhIGZ1bGwgbWV0YWRhdGEgcGF0aC5cbiAgICogQHJldHVybiB7c3RyaW5nfSBTcGxpdHRlci1qb2luZWQgbWV0YWRhdGEga2V5LlxuICAgKi9cbiAgc3RhdGljIGtleSguLi5zdHJzOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBzdHJzLmpvaW4odGhpcy5zcGxpdHRlcik7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERlY29yYXRpb25CdWlsZGVyQnVpbGQsXG4gIERlY29yYXRpb25CdWlsZGVyRW5kLFxuICBEZWNvcmF0aW9uQnVpbGRlck1pZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJTdGFydCxcbiAgRmxhdm91clJlc29sdmVyLFxuICBJRGVjb3JhdGlvbkJ1aWxkZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0Rmxhdm91ciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCByZXNvbHZlciB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgZGVmYXVsdCBmbGF2b3VyLlxuICogQHN1bW1hcnkgUmVzb2x2ZXMgdGhlIGZsYXZvdXIgZm9yIGEgZ2l2ZW4gdGFyZ2V0IGJ5IGFsd2F5cyByZXR1cm5pbmcgdGhlIGxpYnJhcnkncyBgRGVmYXVsdEZsYXZvdXJgIHZhbHVlLlxuICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCBUYXJnZXQgb2JqZWN0IGJlaW5nIGRlY29yYXRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gUmVzb2x2ZWQgZmxhdm91ciBpZGVudGlmaWVyLlxuICogQGZ1bmN0aW9uIGRlZmF1bHRGbGF2b3VyUmVzb2x2ZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5mdW5jdGlvbiBkZWZhdWx0Rmxhdm91clJlc29sdmVyKHRhcmdldDogb2JqZWN0KSB7XG4gIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVW5pb24gdHlwZSBjb3ZlcmluZyBzdXBwb3J0ZWQgZGVjb3JhdG9yIGtpbmRzLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbnkgb2YgdGhlIHN0YW5kYXJkIFR5cGVTY3JpcHQgZGVjb3JhdG9yIHNpZ25hdHVyZXMgKGNsYXNzLCBwcm9wZXJ0eSwgb3IgbWV0aG9kKSwgZW5hYmxpbmcgZmxleGlibGUgcmVnaXN0cmF0aW9uIGFuZCBhcHBsaWNhdGlvbiB3aXRoaW4gdGhlIERlY29yYXRpb24gc3lzdGVtLlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlRGVmIERlY29yYXRvclR5cGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgRGVjb3JhdG9yVHlwZXMgPVxuICB8IENsYXNzRGVjb3JhdG9yXG4gIHwgUHJvcGVydHlEZWNvcmF0b3JcbiAgfCBNZXRob2REZWNvcmF0b3I7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgZGVmaW5pdGlvbiBmb3IgYSBkZWNvcmF0b3IgZmFjdG9yeSBmdW5jdGlvbi5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYXJiaXRyYXJ5IGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIGNvbmNyZXRlIGRlY29yYXRvciBmdW5jdGlvbiB0byBiZSBhcHBsaWVkIHRvIGEgdGFyZ2V0LlxuICogQHRlbXBsYXRlIEFcbiAqIEB0eXBlRGVmIERlY29yYXRvckZhY3RvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JGYWN0b3J5ID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBEZWNvcmF0b3JUeXBlcztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQXJndW1lbnQgYnVuZGxlIGZvciBhIGRlY29yYXRvciBmYWN0b3J5LlxuICogQHN1bW1hcnkgT2JqZWN0IGZvcm0gdXNlZCB0byBkZWZlciBkZWNvcmF0b3IgY3JlYXRpb24sIGNhcnJ5aW5nIGJvdGggdGhlIGZhY3RvcnkgZnVuY3Rpb24gYW5kIGl0cyBhcmd1bWVudCBsaXN0IHRvIGJlIGludm9rZWQgbGF0ZXIgZHVyaW5nIGFwcGxpY2F0aW9uLlxuICogQHR5cGVEZWYgRGVjb3JhdG9yRmFjdG9yeUFyZ3NcbiAqIEBwcm9wZXJ0eSB7RGVjb3JhdG9yRmFjdG9yeX0gZGVjb3JhdG9yIEZhY3RvcnkgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhIGRlY29yYXRvciB3aGVuIGludm9rZWQuXG4gKiBAcHJvcGVydHkge2FueVtdfSBhcmdzIExpc3Qgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGRlY29yYXRvciBmYWN0b3J5LlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIERlY29yYXRvckZhY3RvcnlBcmdzID0ge1xuICBkZWNvcmF0b3I6IERlY29yYXRvckZhY3Rvcnk7XG4gIGFyZ3M6IGFueVtdO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVW5pb24gdGhhdCByZXByZXNlbnRzIGVpdGhlciBhIHJlYWR5LXRvLWFwcGx5IGRlY29yYXRvciBvciBhIGZhY3Rvcnkgd2l0aCBhcmd1bWVudHMuXG4gKiBAc3VtbWFyeSBBbGxvd3MgcmVnaXN0ZXJpbmcgZGVjb3JhdG9ycyBpbiB0d28gZm9ybXM6IGFzIGRpcmVjdCBkZWNvcmF0b3IgZnVuY3Rpb25zIG9yIGFzIGRlZmVycmVkIGZhY3RvcmllcyBwYWlyZWQgd2l0aCB0aGVpciBhcmd1bWVudCBsaXN0cyBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvbi5cbiAqIEB0eXBlRGVmIERlY29yYXRvckRhdGFcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JEYXRhID0gRGVjb3JhdG9yVHlwZXMgfCBEZWNvcmF0b3JGYWN0b3J5QXJncztcbmV4cG9ydCB0eXBlIEV4dGVuZERlY29yYXRvckRhdGEgPVxuICB8IERlY29yYXRvclR5cGVzXG4gIHwgT21pdDxEZWNvcmF0b3JGYWN0b3J5QXJncywgXCJhcmdzXCI+O1xudHlwZSBTdG9yZWREZWNvcmF0b3JEYXRhID0gRGVjb3JhdG9yRGF0YSB8IEV4dGVuZERlY29yYXRvckRhdGE7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIGRlY29yYXRvciBtYW5hZ2VtZW50IGNsYXNzIHRoYXQgaGFuZGxlcyBmbGF2b3VyZWQgZGVjb3JhdG9ycy5cbiAqIEBzdW1tYXJ5IFRoZSBEZWNvcmF0aW9uIGNsYXNzIHByb3ZpZGVzIGEgYnVpbGRlciBwYXR0ZXJuIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgZGVjb3JhdG9ycyB3aXRoIGRpZmZlcmVudCBmbGF2b3Vycy4gSXQgc3VwcG9ydHMgcmVnaXN0ZXJpbmcsIGV4dGVuZGluZywgYW5kIGFwcGx5aW5nIGRlY29yYXRvcnMgd2l0aCBjb250ZXh0LWF3YXJlIGZsYXZvdXIgcmVzb2x1dGlvbiwgYWxsb3dpbmcgZnJhbWV3b3JrLXNwZWNpZmljIGltcGxlbWVudGF0aW9ucyB3aGlsZSBtYWludGFpbmluZyBhIGNvbnNpc3RlbnQgQVBJLlxuICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgZGVjb3JhdG9yIChDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cj1EZWZhdWx0Rmxhdm91cl0gT3B0aW9uYWwgZmxhdm91ciBwYXJhbWV0ZXIgZm9yIHRoZSBkZWNvcmF0b3IgY29udGV4dC5cbiAqIEBjbGFzc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBkZWNvcmF0aW9uIGZvciAnY29tcG9uZW50JyB3aXRoIGRlZmF1bHQgZmxhdm91clxuICogY29uc3QgY29tcG9uZW50RGVjb3JhdG9yID0gbmV3IERlY29yYXRpb24oKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKGN1c3RvbUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQ3JlYXRlIGEgZmxhdm91cmVkIGRlY29yYXRpb25cbiAqIGNvbnN0IHZ1ZUNvbXBvbmVudCA9IG5ldyBEZWNvcmF0aW9uKCd2dWUnKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKHZ1ZUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQXBwbHkgdGhlIGRlY29yYXRpb25cbiAqIEBjb21wb25lbnREZWNvcmF0b3JcbiAqIGNsYXNzIE15Q29tcG9uZW50IHt9XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEZWNvcmF0aW9uXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgRmxhdm91clJlc29sdmVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgRGVjb3JhdG9yRmFjdG9yeVxuICpcbiAqICAgQy0+PkQ6IG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpXG4gKiAgIEMtPj5EOiBmb3Ioa2V5KVxuICogICBDLT4+RDogZGVmaW5lKGRlY29yYXRvcnMpXG4gKiAgIEQtPj5EOiByZWdpc3RlcihrZXksIGZsYXZvdXIsIGRlY29yYXRvcnMpXG4gKiAgIEQtPj5GOiBkZWNvcmF0b3JGYWN0b3J5KGtleSwgZmxhdm91cilcbiAqICAgRi0+PlI6IHJlc29sdmUodGFyZ2V0KVxuICogICBSLS0+PkY6IHJlc29sdmVkIGZsYXZvdXJcbiAqICAgRi0+PkY6IGFwcGx5IGRlY29yYXRvcnNcbiAqICAgRi0tPj5DOiBkZWNvcmF0ZWQgdGFyZ2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNvcmF0aW9uIGltcGxlbWVudHMgSURlY29yYXRpb25CdWlsZGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWFwIG9mIHJlZ2lzdGVyZWQgZGVjb3JhdG9ycy5cbiAgICogQHN1bW1hcnkgU3RvcmVzIGFsbCByZWdpc3RlcmVkIGRlY29yYXRvcnMgb3JnYW5pc2VkIGJ5IGtleSBhbmQgZmxhdm91ci5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRlY29yYXRvcnM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAge1xuICAgICAgICBkZWNvcmF0b3JzPzogU2V0PERlY29yYXRvckRhdGE+O1xuICAgICAgICBleHRyYXM/OiBTZXQ8U3RvcmVkRGVjb3JhdG9yRGF0YT47XG4gICAgICB9XG4gICAgPlxuICA+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byByZXNvbHZlIGZsYXZvdXIgZnJvbSBhIHRhcmdldC5cbiAgICogQHN1bW1hcnkgUmVzb2x2ZXIgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHRoZSBhcHByb3ByaWF0ZSBmbGF2b3VyIGZvciBhIGdpdmVuIHRhcmdldC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZsYXZvdXJSZXNvbHZlcjogRmxhdm91clJlc29sdmVyID0gZGVmYXVsdEZsYXZvdXJSZXNvbHZlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldCBvZiBkZWNvcmF0b3JzIGZvciB0aGUgY3VycmVudCBjb250ZXh0LlxuICAgKi9cbiAgcHJpdmF0ZSBkZWNvcmF0b3JzPzogU2V0PERlY29yYXRvckRhdGE+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0IG9mIGFkZGl0aW9uYWwgZGVjb3JhdG9ycy5cbiAgICovXG4gIHByaXZhdGUgZXh0cmFzPzogU2V0PFN0b3JlZERlY29yYXRvckRhdGE+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCBkZWNvcmF0b3Iga2V5LlxuICAgKi9cbiAgcHJpdmF0ZSBrZXk/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmbGF2b3VyOiBzdHJpbmcgPSBEZWZhdWx0Rmxhdm91cikge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGtleSBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlci5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGlzZXMgYSBuZXcgZGVjb3JhdGlvbiBjaGFpbiB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IElkZW50aWZpZXIgZm9yIHRoZSBkZWNvcmF0b3IuXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyTWlkfSBCdWlsZGVyIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBmb3Ioa2V5OiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlck1pZCB7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgZGVjb3JhdG9ycyB0byB0aGUgY3VycmVudCBjb250ZXh0LlxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBtZXRob2QgdG8gYWRkIGRlY29yYXRvcnMgd2l0aCBhZGRvbiBzdXBwb3J0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthZGRvbj1mYWxzZV0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRlY29yYXRvcnMgYXJlIGFkZGl0aXZlIGV4dHJhcy5cbiAgICogQHBhcmFtIHsuLi5EZWNvcmF0b3JEYXRhfSBkZWNvcmF0b3JzIERlY29yYXRvcnMgdG8gcmVnaXN0ZXIgZm9yIHRoZSBjb25maWd1cmVkIGtleS5cbiAgICogQHJldHVybiB7dGhpc30gQ3VycmVudCBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBwcml2YXRlIGRlY29yYXRlKFxuICAgIGFkZG9uOiBib29sZWFuID0gZmFsc2UsXG4gICAgLi4uZGVjb3JhdG9yczogU3RvcmVkRGVjb3JhdG9yRGF0YVtdXG4gICk6IHRoaXMge1xuICAgIGlmICghdGhpcy5rZXkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJrZXkgbXVzdCBiZSBwcm92aWRlZCBiZWZvcmUgZGVjb3JhdG9ycyBjYW4gYmUgYWRkZWRcIik7XG4gICAgaWYgKFxuICAgICAgKCFkZWNvcmF0b3JzIHx8ICFkZWNvcmF0b3JzLmxlbmd0aCkgJiZcbiAgICAgICFhZGRvbiAmJlxuICAgICAgdGhpcy5mbGF2b3VyICE9PSBEZWZhdWx0Rmxhdm91clxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJNdXN0IHByb3ZpZGUgb3ZlcnJpZGVzIG9yIGFkZG9ucyB0byBvdmVycmlkZSBvciBleHRlbmQgZGVjYWYncyBkZWNvcmF0b3JzXCJcbiAgICAgICk7XG4gICAgKHRoaXMgYXMgYW55KVthZGRvbiA/IFwiZXh0cmFzXCIgOiBcImRlY29yYXRvcnNcIl0gPSBuZXcgU2V0KFtcbiAgICAgIC4uLih0aGlzW2FkZG9uID8gXCJleHRyYXNcIiA6IFwiZGVjb3JhdG9yc1wiXSB8fCBuZXcgU2V0KCkpLnZhbHVlcygpLFxuICAgICAgLi4uZGVjb3JhdG9ycyxcbiAgICBdKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIHRoZSBiYXNlIGRlY29yYXRvcnMuXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIHByaW1hcnkgZGVjb3JhdG9ycyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgICogQHBhcmFtIHsuLi5EZWNvcmF0b3JEYXRhfSBkZWNvcmF0b3JzIERlY29yYXRvcnMgdG8gZGVmaW5lLlxuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlckVuZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgZmluaXNoaW5nIHRoZSBjaGFpbiAoYWxzbyBpbXBsZW1lbnRzIERlY29yYXRpb25CdWlsZGVyQnVpbGQpLlxuICAgKi9cbiAgZGVmaW5lKFxuICAgIC4uLmRlY29yYXRvcnM6IERlY29yYXRvckRhdGFbXVxuICApOiBEZWNvcmF0aW9uQnVpbGRlckVuZCAmIERlY29yYXRpb25CdWlsZGVyQnVpbGQge1xuICAgIGlmIChcbiAgICAgIGRlY29yYXRvcnMuZmluZCgoZCkgPT4gdHlwZW9mIGQgPT09IFwib2JqZWN0XCIpICYmXG4gICAgICBkZWNvcmF0b3JzLmxlbmd0aCAhPT0gMVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFdoZW4gdXNpbmcgYW4gb3ZlcnJpZGFibGUgZGVjb3JhdG9yLCBvbmx5IG9uZSBpcyBhbGxvd2VkYFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZShmYWxzZSwgLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4dGVuZHMgZXhpc3RpbmcgZGVjb3JhdG9ycy5cbiAgICogQHN1bW1hcnkgQWRkcyBhZGRpdGlvbmFsIGRlY29yYXRvcnMgdG8gdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgICogQHBhcmFtIHsuLi5EZWNvcmF0b3JEYXRhfSBkZWNvcmF0b3JzIEFkZGl0aW9uYWwgZGVjb3JhdG9ycyB0byByZWdpc3RlciBhcyBhZGRvbnMuXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyQnVpbGR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIGJ1aWxkaW5nIHRoZSBkZWNvcmF0b3IuXG4gICAqL1xuICBleHRlbmQoLi4uZGVjb3JhdG9yczogRXh0ZW5kRGVjb3JhdG9yRGF0YVtdKTogRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCB7XG4gICAgaWYgKFxuICAgICAgZGVjb3JhdG9ycy5maW5kKChkKSA9PiB0eXBlb2YgZCA9PT0gXCJvYmplY3RcIikgJiZcbiAgICAgIGRlY29yYXRvcnMubGVuZ3RoICE9PSAxXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgV2hlbiBleHRlbmRpbmcgdXNpbmcgYW4gb3ZlcnJpZGFibGUgZGVjb3JhdG9yLCBvbmx5IG9uZSBpcyBhbGxvd2VkYFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZSh0cnVlLCAuLi5kZWNvcmF0b3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSBjb250ZXh0LWF3YXJlIGRlY29yYXRvciBmb3IgYSBrZXkvZmxhdm91ci5cbiAgICogQHN1bW1hcnkgUHJvZHVjZXMgYSBkZWNvcmF0b3IgZnVuY3Rpb24gYm91bmQgdG8gdGhlIHByb3ZpZGVkIGtleSBhbmQgZmxhdm91ci4gVGhlIHJlc3VsdGluZyBkZWNvcmF0b3IgcmVzb2x2ZXMgdGhlIGFjdHVhbCBkZWNvcmF0b3JzIHRvIGFwcGx5IGF0IGludm9jYXRpb24gdGltZSBiYXNlZCBvbiB0aGUgdGFyZ2V0J3MgcmVzb2x2ZWQgZmxhdm91ciBhbmQgdGhlIHJlZ2lzdGVyZWQgYmFzZSBhbmQgZXh0cmEgZGVjb3JhdG9ycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBEZWNvcmF0aW9uIGtleSB1c2VkIHRvIGxvb2sgdXAgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Y9RGVmYXVsdEZsYXZvdXJdIEV4cGxpY2l0IGZsYXZvdXIgdG8gYmluZCB0aGUgZmFjdG9yeSB0by5cbiAgICogQHJldHVybiB7Q2xhc3NEZWNvcmF0b3J8TWV0aG9kRGVjb3JhdG9yfFByb3BlcnR5RGVjb3JhdG9yfFBhcmFtZXRlckRlY29yYXRvcn0gRGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgYXBwbGllcyB0aGUgcmVzb2x2ZWQgZGVjb3JhdG9ycy5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyIENvZGVcbiAgICogICBwYXJ0aWNpcGFudCBCIGFzIERlY29yYXRpb24gKGJ1aWxkZXIpXG4gICAqICAgcGFydGljaXBhbnQgRiBhcyBkZWNvcmF0b3JGYWN0b3J5KGtleSwgZilcbiAgICogICBwYXJ0aWNpcGFudCBSIGFzIGZsYXZvdXJSZXNvbHZlclxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQXBwbGllZCBEZWNvcmF0b3JzXG4gICAqICAgVS0+PkI6IGRlZmluZSgpL2V4dGVuZCgpIGFuZCBhcHBseSgpXG4gICAqICAgQi0+PkY6IGNyZWF0ZSBjb250ZXh0IGRlY29yYXRvclxuICAgKiAgIEYtPj5SOiByZXNvbHZlKHRhcmdldClcbiAgICogICBSLS0+PkY6IGZsYXZvdXJcbiAgICogICBGLT4+QTogY29sbGVjdCBiYXNlICsgZXh0cmFzXG4gICAqICAgbG9vcCBlYWNoIGRlY29yYXRvclxuICAgKiAgICAgQS0+PlU6IGludm9rZSBkZWNvcmF0b3IodGFyZ2V0LCBrZXk/LCBkZXNjPylcbiAgICogICBlbmRcbiAgICovXG4gIHByb3RlY3RlZCBkZWNvcmF0b3JGYWN0b3J5KGtleTogc3RyaW5nLCBmOiBzdHJpbmcgPSBEZWZhdWx0Rmxhdm91cikge1xuICAgIGZ1bmN0aW9uIGNvbnRleHREZWNvcmF0b3IoXG4gICAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgICApIHtcbiAgICAgIGNvbnN0IGZsYXZvdXIgPSBEZWNvcmF0aW9uLmZsYXZvdXJSZXNvbHZlcih0YXJnZXQpO1xuICAgICAgY29uc3QgY2FjaGUgPSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XTtcbiAgICAgIGxldCBkZWNvcmF0b3JzO1xuICAgICAgY29uc3QgZXh0cmFzID0gY2FjaGVbZmxhdm91cl1cbiAgICAgICAgPyBjYWNoZVtmbGF2b3VyXS5leHRyYXNcbiAgICAgICAgOiBjYWNoZVtEZWZhdWx0Rmxhdm91cl0uZXh0cmFzO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGNhY2hlICYmXG4gICAgICAgIGNhY2hlW2ZsYXZvdXJdICYmXG4gICAgICAgIGNhY2hlW2ZsYXZvdXJdLmRlY29yYXRvcnMgJiZcbiAgICAgICAgY2FjaGVbZmxhdm91cl0uZGVjb3JhdG9ycy5zaXplXG4gICAgICApIHtcbiAgICAgICAgZGVjb3JhdG9ycyA9IGNhY2hlW2ZsYXZvdXJdLmRlY29yYXRvcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvcmF0b3JzID0gY2FjaGVbRGVmYXVsdEZsYXZvdXJdLmRlY29yYXRvcnM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VEZWNvcmF0b3JzTGlzdCA9IFsuLi4oZGVjb3JhdG9ycyA/IGRlY29yYXRvcnMudmFsdWVzKCkgOiBbXSldO1xuXG4gICAgICBjb25zdCBkZWZhdWx0RGVjb3JhdG9yc0xpc3QgPSBbXG4gICAgICAgIC4uLihjYWNoZVtEZWZhdWx0Rmxhdm91cl0/LmRlY29yYXRvcnMgfHwgbmV3IFNldCgpKS52YWx1ZXMoKSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IGJhc2VBcmdzQnlJbmRleCA9IGJhc2VEZWNvcmF0b3JzTGlzdC5yZWR1Y2UoXG4gICAgICAgIChhY2N1bSwgZW50cnksIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGVudHJ5ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBcImFyZ3NcIiBpbiAoZW50cnkgYXMgYW55KSAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheSgoZW50cnkgYXMgYW55KS5hcmdzKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYWNjdW1baW5kZXhdID0gKGVudHJ5IGFzIGFueSkuYXJncztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9LFxuICAgICAgICB7fSBhcyBSZWNvcmQ8bnVtYmVyLCBhbnlbXT5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRlZmF1bHRBcmdzQnlJbmRleCA9IGRlZmF1bHREZWNvcmF0b3JzTGlzdC5yZWR1Y2UoXG4gICAgICAgIChhY2N1bSwgZW50cnksIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGVudHJ5ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBcImFyZ3NcIiBpbiAoZW50cnkgYXMgYW55KSAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheSgoZW50cnkgYXMgYW55KS5hcmdzKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYWNjdW1baW5kZXhdID0gKGVudHJ5IGFzIGFueSkuYXJncztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9LFxuICAgICAgICB7fSBhcyBSZWNvcmQ8bnVtYmVyLCBhbnlbXT5cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHRvQXBwbHkgPSBbXG4gICAgICAgIC4uLmJhc2VEZWNvcmF0b3JzTGlzdCxcbiAgICAgICAgLi4uKGV4dHJhcyA/IGV4dHJhcy52YWx1ZXMoKSA6IFtdKSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IGJhc2VMZW5ndGggPSBiYXNlRGVjb3JhdG9yc0xpc3QubGVuZ3RoO1xuXG4gICAgICByZXR1cm4gdG9BcHBseS5yZWR1Y2UoXG4gICAgICAgIChfLCBkLCBpbmRleCkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGQgYXMgYW55O1xuICAgICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVJbmRleCA9IGluZGV4IDwgYmFzZUxlbmd0aCA/IGluZGV4IDogMDtcbiAgICAgICAgICAgICAgY29uc3QgYXJncyA9XG4gICAgICAgICAgICAgICAgXCJhcmdzXCIgaW4gZW50cnkgJiYgQXJyYXkuaXNBcnJheShlbnRyeS5hcmdzKVxuICAgICAgICAgICAgICAgICAgPyBlbnRyeS5hcmdzXG4gICAgICAgICAgICAgICAgICA6IChiYXNlQXJnc0J5SW5kZXhbY2FuZGlkYXRlSW5kZXhdID8/XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRBcmdzQnlJbmRleFtjYW5kaWRhdGVJbmRleF0gPz9cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEFyZ3NCeUluZGV4WzBdID8/XG4gICAgICAgICAgICAgICAgICAgIFtdKTtcblxuICAgICAgICAgICAgICByZXR1cm4gKGVudHJ5LmRlY29yYXRvciguLi5hcmdzKSBhcyBhbnkpKFxuICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgcmV0dXJuIChkIGFzIGFueSkodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZGVjb3JhdG9yIHR5cGU6ICR7dHlwZW9mIGR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7IHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IgfVxuICAgICAgKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRleHREZWNvcmF0b3IsIFwibmFtZVwiLCB7XG4gICAgICB2YWx1ZTogW2YsIGtleV0uam9pbihcIl9kZWNvcmF0b3JfZm9yX1wiKSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gY29udGV4dERlY29yYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgZmluYWwgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICAgKiBAc3VtbWFyeSBCdWlsZHMgYW5kIHJldHVybnMgdGhlIGRlY29yYXRvciBmYWN0b3J5IGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJuIHtDbGFzc0RlY29yYXRvcnxNZXRob2REZWNvcmF0b3J8UHJvcGVydHlEZWNvcmF0b3J8UGFyYW1ldGVyRGVjb3JhdG9yfSBHZW5lcmF0ZWQgZGVjb3JhdG9yIGZ1bmN0aW9uIHJlYWR5IGZvciBhcHBsaWNhdGlvbi5cbiAgICovXG4gIGFwcGx5KCk6IChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApID0+IGFueSB7XG4gICAgaWYgKCF0aGlzLmtleSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGtleSBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICBjb25zdCBleGlzdGluZ0RlY29yYXRvcnMgPVxuICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW3RoaXMua2V5XT8uW3RoaXMuZmxhdm91cl0/LmRlY29yYXRvcnM7XG4gICAgY29uc3QgZGVjb3JhdG9yc1RvUmVnaXN0ZXIgPVxuICAgICAgdGhpcy5kZWNvcmF0b3JzIHx8IGV4aXN0aW5nRGVjb3JhdG9ycyB8fCBuZXcgU2V0PERlY29yYXRvckRhdGE+KCk7XG5cbiAgICBEZWNvcmF0aW9uLnJlZ2lzdGVyKFxuICAgICAgdGhpcy5rZXksXG4gICAgICB0aGlzLmZsYXZvdXIsXG4gICAgICBkZWNvcmF0b3JzVG9SZWdpc3RlcixcbiAgICAgIHRoaXMuZXh0cmFzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0b3JGYWN0b3J5KHRoaXMua2V5LCB0aGlzLmZsYXZvdXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgZGVjb3JhdG9ycyBmb3IgYSBzcGVjaWZpYyBrZXkgYW5kIGZsYXZvdXIuXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIG1ldGhvZCB0byBzdG9yZSBkZWNvcmF0b3JzIGluIHRoZSBzdGF0aWMgcmVnaXN0cnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgRGVjb3JhdG9yIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgRGVjb3JhdG9yIGZsYXZvdXIuXG4gICAqIEBwYXJhbSB7U2V0PERlY29yYXRvckRhdGE+fSBbZGVjb3JhdG9yc10gUHJpbWFyeSBkZWNvcmF0b3JzIHJlZ2lzdGVyZWQgZm9yIHRoZSBrZXkuXG4gICAqIEBwYXJhbSB7U2V0PERlY29yYXRvckRhdGE+fSBbZXh0cmFzXSBBZGRpdGlvbmFsIGRlY29yYXRvcnMgcmVnaXN0ZXJlZCBhcyBmbGF2b3VyLXNwZWNpZmljIGFkZG9ucy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZsYXZvdXI6IHN0cmluZyxcbiAgICBkZWNvcmF0b3JzPzogU2V0PERlY29yYXRvckRhdGE+LFxuICAgIGV4dHJhcz86IFNldDxTdG9yZWREZWNvcmF0b3JEYXRhPlxuICApIHtcbiAgICBpZiAoIWtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8ga2V5IHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIH1cbiAgICBpZiAoIWRlY29yYXRvcnMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBkZWNvcmF0b3JzIHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIGlmICghZmxhdm91cilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGZsYXZvdXIgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG5cbiAgICBpZiAoIURlY29yYXRpb24uZGVjb3JhdG9yc1trZXldKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XSA9IHt9O1xuICAgIGlmICghRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0pXG4gICAgICBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXSA9IHt9O1xuICAgIGlmIChkZWNvcmF0b3JzKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycztcbiAgICBpZiAoZXh0cmFzKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5leHRyYXMgPSBleHRyYXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGdsb2JhbCBmbGF2b3VyIHJlc29sdmVyLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBkZWNvcmF0b3IgZmxhdm91cnMuXG4gICAqIEBwYXJhbSB7Rmxhdm91clJlc29sdmVyfSByZXNvbHZlciBGdW5jdGlvbiB0byByZXNvbHZlIGZsYXZvdXJzLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldEZsYXZvdXJSZXNvbHZlcihyZXNvbHZlcjogRmxhdm91clJlc29sdmVyKSB7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVuaWVuY2Ugc3RhdGljIGVudHJ5IHRvIHN0YXJ0IGEgZGVjb3JhdGlvbiBidWlsZGVyLlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IERlY29yYXRpb24gaW5zdGFuY2UgYW5kIGluaXRpYXRlcyB0aGUgYnVpbGRlciBjaGFpbiB3aXRoIHRoZSBwcm92aWRlZCBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgRGVjb3JhdGlvbiBrZXkgdG8gY29uZmlndXJlLlxuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlck1pZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgZm9yKGtleTogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJNaWQge1xuICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbigpLmZvcihrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgYSBidWlsZGVyIGZvciBhIHNwZWNpZmljIGZsYXZvdXIuXG4gICAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIG1ldGhvZCB0byBiZWdpbiBhIERlY29yYXRpb24gYnVpbGRlciBjaGFpbiBib3VuZCB0byB0aGUgZ2l2ZW4gZmxhdm91ciBpZGVudGlmaWVyLCBhbGxvd2luZyByZWdpc3RyYXRpb24gb2YgZmxhdm91ci1zcGVjaWZpYyBkZWNvcmF0b3JzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciBGbGF2b3VyIG5hbWUgdG8gYmluZCB0byB0aGUgYnVpbGRlci5cbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJTdGFydH0gQnVpbGRlciBzdGFydCBpbnRlcmZhY2UgdG8gY29udGludWUgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyBmbGF2b3VyZWRBcyhmbGF2b3VyOiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlclN0YXJ0IHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZmxhdm91cik7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIi4vbWV0YWRhdGEvTWV0YWRhdGFcIjtcbmltcG9ydCB7IERlY29yYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uIH0gZnJvbSBcIi4vZGVjb3JhdGlvbi9EZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFzc2lnbnMgYXJiaXRyYXJ5IG1ldGFkYXRhIHRvIGEgdGFyZ2V0IHVzaW5nIGEgc3RyaW5nIGtleS5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciBmYWN0b3J5IHRoYXQgc3RvcmVzIGEga2V5L3ZhbHVlIHBhaXIgaW4gdGhlIGNlbnRyYWwgbWV0YWRhdGEgc3RvcmUgZm9yIHRoZSBwcm92aWRlZCBjbGFzcyBvciBtZW1iZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IE1ldGFkYXRhIGtleSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdGFyZ2V0LlxuICogQHBhcmFtIHthbnl9IHZhbHVlIE1ldGFkYXRhIHZhbHVlIHRvIHN0b3JlIHVuZGVyIHRoZSBnaXZlbiBrZXkuXG4gKiBAcmV0dXJuIHtDbGFzc0RlY29yYXRvcnxNZXRob2REZWNvcmF0b3J8UHJvcGVydHlEZWNvcmF0b3J8UGFyYW1ldGVyRGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCB3cml0ZXMgdGhlIG1ldGFkYXRhIHdoZW4gYXBwbGllZC5cbiAqIEBmdW5jdGlvbiBtZXRhZGF0YVxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldGFkYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHJldHVybiBmdW5jdGlvbiBtZXRhZGF0YShcbiAgICBtb2RlbDogYW55LFxuXG4gICAgcHJvcD86IGFueSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvciB8IG51bWJlclxuICApIHtcbiAgICBNZXRhZGF0YS5zZXQocHJvcCA/IG1vZGVsLmNvbnN0cnVjdG9yIDogbW9kZWwsIGtleSwgdmFsdWUpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDYXB0dXJlcyBhbmQgc3RvcmVzIGEgcHJvcGVydHkncyBkZXNpZ24gdHlwZS5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciBmYWN0b3J5IHRoYXQgcmVhZHMgdGhlIHJlZmxlY3RlZCBgZGVzaWduOnR5cGVgIGZvciBhIHByb3BlcnR5IGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIG1ldGFkYXRhIHN0b3JlIHVuZGVyIHRoZSBwcm9wZXJ0aWVzIG1hcC5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCByZWNvcmRzIHRoZSBwcm9wZXJ0eSdzIHR5cGUgbWV0YWRhdGEgd2hlbiBhcHBsaWVkLlxuICogQGZ1bmN0aW9uIHByb3BcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wKCkge1xuICBmdW5jdGlvbiBpbm5lclByb3AoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyUHJvcChtb2RlbDogb2JqZWN0LCBwcm9wPzogYW55KSB7XG4gICAgICBjb25zdCBkZXNpZ25UeXBlID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcbiAgICAgICAgRGVjb3JhdGlvbktleXMuREVTSUdOX1RZUEUsXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBwcm9wXG4gICAgICApO1xuICAgICAgcmV0dXJuIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoRGVjb3JhdGlvbktleXMuUFJPUEVSVElFUywgcHJvcCksXG4gICAgICAgIGRlc2lnblR5cGVcbiAgICAgICkobW9kZWwsIHByb3ApO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRGVjb3JhdGlvbktleXMuUFJPUEVSVElFUylcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogaW5uZXJQcm9wLFxuICAgICAgYXJnczogW10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2FwdHVyZXMgYSBzaW5nbGUgcGFyYW1ldGVyIHR5cGUgZm9yIHRoZSBkZWNvcmF0ZWQgbWV0aG9kLlxuICogQHN1bW1hcnkgRGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBlbnN1cmVzIHRoZSBtZXRob2QgbWV0YWRhdGEgaXMgaW5pdGlhbGlzZWQgYW5kIHN0b3JlcyB0aGUgcmVmbGVjdGVkIHBhcmFtZXRlciBjb25zdHJ1Y3RvciBhdCB0aGUgcHJvdmlkZWQgaW5kZXguXG4gKiBAcmV0dXJuIHtQYXJhbWV0ZXJEZWNvcmF0b3J9IERlY29yYXRvciB0aGF0IHJlY29yZHMgdGhlIHBhcmFtZXRlciB0eXBlIHdoZW4gYXBwbGllZC5cbiAqIEBmdW5jdGlvbiBwYXJhbVxuICogQGNhdGVnb3J5IFBhcmFtZXRlciBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlciBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IFAgYXMgcGFyYW0oKVxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1ldGFkYXRhXG4gKiAgIFUtPj5QOiBwYXJhbSgpKHRhcmdldCwga2V5LCBpbmRleClcbiAqICAgUC0+PlU6IG1ldGhvZCgpKHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKVxuICogICBQLT4+TTogcGFyYW1zKGNvbnN0cnVjdG9yLCBrZXkpXG4gKiAgIE0tLT4+UDogcGFyYW1ldGVyIGNvbnN0cnVjdG9yc1tdXG4gKiAgIFAtPj5NOiBzZXQobWV0aG9kcy5rZXkuaW5kZXgsIGNvbnN0cnVjdG9yKVxuICogICBQLS0+PlU6IHBhcmFtZXRlciByZWNvcmRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyYW0oKSB7XG4gIHJldHVybiBmdW5jdGlvbiBwYXJhbShcbiAgICBtb2RlbDogb2JqZWN0LFxuICAgIHByb3A6IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZCxcbiAgICBpbmRleDogbnVtYmVyXG4gICkge1xuICAgIGlmICghcHJvcClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEBwYXJhbSBkZWNvcmF0b3IgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBtZXRob2RzYCk7XG4gICAgbWV0aG9kKCkobW9kZWwsIHByb3AsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobW9kZWwsIHByb3ApKTtcbiAgICBjb25zdCBwYXJhbVRwZXMgPSBNZXRhZGF0YS5wYXJhbXMobW9kZWwuY29uc3RydWN0b3IgYXMgYW55LCBwcm9wIGFzIHN0cmluZyk7XG4gICAgaWYgKCFwYXJhbVRwZXMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcGFyYW1ldGVyIHR5cGVzIGZvciAke1N0cmluZyhwcm9wKX1gKTtcbiAgICBpZiAoaW5kZXggPj0gcGFyYW1UcGVzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFBhcmFtZXRlciBpbmRleCAke2luZGV4fSBvdXQgb2YgcmFuZ2UgZm9yICR7U3RyaW5nKHByb3ApfWBcbiAgICAgICk7XG4gICAgbWV0YWRhdGEoXG4gICAgICBNZXRhZGF0YS5rZXkoRGVjb3JhdGlvbktleXMuTUVUSE9EUywgcHJvcCBhcyBzdHJpbmcsIGluZGV4LnRvU3RyaW5nKCkpLFxuICAgICAgcGFyYW1UcGVzW2luZGV4XVxuICAgICkobW9kZWwsIHByb3ApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeHRlbmRzIGEgcGFyYW1ldGVyIGRlY29yYXRvciB3aXRoIGFkZGl0aW9uYWwgbWV0YWRhdGEuXG4gKiBAc3VtbWFyeSBBcHBsaWVzIHRoZSBkZWZhdWx0IGBwYXJhbSgpYCBkZWNvcmF0b3IgYW5kIGF1Z21lbnRzIHRoZSBzdG9yZWQgbWV0YWRhdGEgd2l0aCBhbiBhcmJpdHJhcnkga2V5L3ZhbHVlIHBhaXIuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IE1ldGFkYXRhIGtleSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcGFyYW1ldGVyLlxuICogQHBhcmFtIHthbnl9IHZhbHVlIE1ldGFkYXRhIHZhbHVlIHBlcnNpc3RlZCB1bmRlciB0aGUgZ2l2ZW4ga2V5LlxuICogQHJldHVybiB7UGFyYW1ldGVyRGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCByZWNvcmRzIGJvdGggdGhlIHBhcmFtZXRlciBkZXNpZ24gdHlwZSBhbmQgYWRkaXRpb25hbCBtZXRhZGF0YS5cbiAqIEBmdW5jdGlvbiBwYXJhbU1ldGFkYXRhXG4gKiBAY2F0ZWdvcnkgUGFyYW1ldGVyIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcmFtTWV0YWRhdGEoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHBhcmFtTWV0YWRhdGEodGFyZ2V0OiBhbnksIHByb3A6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHBhcmFtKCksXG4gICAgICBtZXRhZGF0YShNZXRhZGF0YS5rZXkoRGVjb3JhdGlvbktleXMuTUVUSE9EUywgcHJvcCwga2V5KSwgdmFsdWUpXG4gICAgKSh0YXJnZXQsIHByb3AsIGluZGV4KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVjb3JkcyBtZXRob2QgZGVzaWduLXRpbWUgbWV0YWRhdGEuXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGNhcHR1cmVzIGEgbWV0aG9kJ3MgcmVmbGVjdGVkIHBhcmFtZXRlciBhbmQgcmV0dXJuIHR5cGVzLCBzdG9yaW5nIHRoZW0gdW5kZXIgdGhlIGFwcHJvcHJpYXRlIG1ldGFkYXRhIGtleXMgc28gdGhleSBjYW4gYmUgaW5zcGVjdGVkIGF0IHJ1bnRpbWUuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IERlY29yYXRvciB0aGF0IHBlcnNpc3RzIHRoZSBtZXRob2QncyBzaWduYXR1cmUgaW5mb3JtYXRpb24gaW50byB0aGUgbWV0YWRhdGEgc3RvcmUgd2hlbiBhcHBsaWVkLlxuICogQGZ1bmN0aW9uIG1ldGhvZFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXIgQ29kZVxuICogICBwYXJ0aWNpcGFudCBGIGFzIG1ldGhvZCgpXG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTWV0YWRhdGFcbiAqICAgVS0+PkY6IG1ldGhvZCgpKHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKVxuICogICBGLT4+VTogUmVmbGVjdC5nZXRPd25NZXRhZGF0YShkZXNpZ246cGFyYW10eXBlcylcbiAqICAgRi0+PlU6IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoZGVzaWduOnJldHVybnR5cGUpXG4gKiAgIEYtPj5NOiBzZXQobWV0aG9kcy5rZXkuZGVzaWduOnBhcmFtdHlwZXMsIHBhcmFtcylcbiAqICAgRi0+Pk06IHNldChtZXRob2RzLmtleS5kZXNpZ246cmV0dXJudHlwZSwgcmV0dXJuVHlwZSlcbiAqICAgRi0tPj5VOiBkZWNvcmF0ZWQgZnVuY3Rpb25cbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWV0aG9kKCkge1xuICByZXR1cm4gZnVuY3Rpb24gbWV0aG9kKG9iajogYW55LCBwcm9wPzogYW55LCBkZXNjcmlwdG9yPzogYW55KSB7XG4gICAgY29uc3QgZGVzaWduUGFyYW1zID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcbiAgICAgIERlY29yYXRpb25LZXlzLkRFU0lHTl9QQVJBTVMsXG4gICAgICBvYmosXG4gICAgICBwcm9wXG4gICAgKTtcbiAgICBjb25zdCBkZXNpZ25SZXR1cm4gPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFxuICAgICAgRGVjb3JhdGlvbktleXMuREVTSUdOX1JFVFVSTixcbiAgICAgIG9iaixcbiAgICAgIHByb3BcbiAgICApO1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoXG4gICAgICAgICAgRGVjb3JhdGlvbktleXMuTUVUSE9EUyxcbiAgICAgICAgICBwcm9wLFxuICAgICAgICAgIERlY29yYXRpb25LZXlzLkRFU0lHTl9QQVJBTVNcbiAgICAgICAgKSxcbiAgICAgICAgZGVzaWduUGFyYW1zXG4gICAgICApLFxuICAgICAgbWV0YWRhdGEoXG4gICAgICAgIE1ldGFkYXRhLmtleShcbiAgICAgICAgICBEZWNvcmF0aW9uS2V5cy5NRVRIT0RTLFxuICAgICAgICAgIHByb3AsXG4gICAgICAgICAgRGVjb3JhdGlvbktleXMuREVTSUdOX1JFVFVSTlxuICAgICAgICApLFxuICAgICAgICBkZXNpZ25SZXR1cm5cbiAgICAgIClcbiAgICApKG9iaiwgcHJvcCwgZGVzY3JpcHRvcik7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmYWN0b3J5IHRoYXQgYXBwbGllcyBtdWx0aXBsZSBkZWNvcmF0b3JzIHRvIGEgc2luZ2xlIHRhcmdldC5cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBjb21wb3NpdGUgZGVjb3JhdG9yIHRoYXQgYXBwbGllcyBtdWx0aXBsZSBkZWNvcmF0b3JzIGluIHNlcXVlbmNlLCBjb3JyZWN0bHkgaGFuZGxpbmcgY2xhc3MsIG1ldGhvZCwgcHJvcGVydHksIGFuZCBwYXJhbWV0ZXIgZGVjb3JhdG9ycy5cbiAqIEBwYXJhbSB7QXJyYXk8Q2xhc3NEZWNvcmF0b3J8TWV0aG9kRGVjb3JhdG9yfFByb3BlcnR5RGVjb3JhdG9yfFBhcmFtZXRlckRlY29yYXRvcj59IGRlY29yYXRvcnMgQ29sbGVjdGlvbiBvZiBkZWNvcmF0b3JzIHRvIGFwcGx5LlxuICogQHJldHVybiB7Q2xhc3NEZWNvcmF0b3J8TWV0aG9kRGVjb3JhdG9yfFByb3BlcnR5RGVjb3JhdG9yfFBhcmFtZXRlckRlY29yYXRvcn0gRGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgYXBwbGllcyBhbGwgcHJvdmlkZWQgZGVjb3JhdG9ycyB0byB0aGUgdGFyZ2V0LlxuICogQGZ1bmN0aW9uIGFwcGx5XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlciBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IEEgYXMgYXBwbHkoLi4uZGVjb3JhdG9ycylcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEZWNvcmF0b3JcbiAqICAgVS0+PkE6IGdldCBkZWNvcmF0b3IoLi4uZGVjb3JhdG9ycylcbiAqICAgQS0+PlU6IHJldHVybnMgKHRhcmdldCwga2V5PywgZGVzYz8pID0+IHZvaWRcbiAqICAgVS0+PkE6IGludm9rZSBvbiB0YXJnZXRcbiAqICAgbG9vcCBmb3IgZWFjaCBkZWNvcmF0b3JcbiAqICAgICBBLT4+RDogaW52b2tlIGFwcHJvcHJpYXRlIGRlY29yYXRvciB0eXBlXG4gKiAgIGVuZFxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5KFxuICAuLi5kZWNvcmF0b3JzOiBBcnJheTxcbiAgICBDbGFzc0RlY29yYXRvciB8IE1ldGhvZERlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgUGFyYW1ldGVyRGVjb3JhdG9yXG4gID5cbikge1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5Pzogc3RyaW5nIHwgc3ltYm9sIHwgdW5rbm93bixcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yIHwgbnVtYmVyXG4gICkgPT4ge1xuICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnMpIHtcbiAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiAhZGVzY3JpcHRvcikge1xuICAgICAgICAoZGVjb3JhdG9yIGFzIENsYXNzRGVjb3JhdG9yKSh0YXJnZXQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIChkZWNvcmF0b3IgYXMgTWV0aG9kRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IpKFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5IGFzIHN0cmluZyB8IHN5bWJvbCxcbiAgICAgICAgZGVzY3JpcHRvciBhcyBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPlxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBwcm9wZXJ0eSBtZXRhZGF0YSBkZWNvcmF0b3IuXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSBmYWN0b3J5IHRoYXQgY29tYmluZXMgYG1ldGFkYXRhKGtleSwgdmFsdWUpYCBhbmQgYHByb3AoKWAgdG8gYm90aCBzZXQgYW4gYXJiaXRyYXJ5IG1ldGFkYXRhIGtleSBhbmQgcmVjb3JkIHRoZSBwcm9wZXJ0eSdzIGRlc2lnbiB0eXBlLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBNZXRhZGF0YSBrZXkgdG8gc2V0IGZvciB0aGUgcHJvcGVydHkuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgTWV0YWRhdGEgdmFsdWUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGtleS5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCBzZXRzIHRoZSBtZXRhZGF0YSBhbmQgY2FwdHVyZXMgdGhlIHByb3BlcnR5J3MgdHlwZS5cbiAqIEBmdW5jdGlvbiBwcm9wTWV0YWRhdGFcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTWV0YWRhdGEoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIGFwcGx5KG1ldGFkYXRhKGtleSwgdmFsdWUpLCBwcm9wKCkpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbWV0aG9kIG1ldGFkYXRhIGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIGZhY3RvcnkgdGhhdCBjb21iaW5lcyBgbWV0YWRhdGEoa2V5LCB2YWx1ZSlgIGFuZCBgbWV0aG9kKClgIHRvIGJvdGggc2V0IGFuIGFyYml0cmFyeSBtZXRhZGF0YSBrZXkgYW5kIHJlY29yZCB0aGUgbWV0aG9kJ3MgZGVzaWduIHJldHVybiBhbmQgcGFyYW0gdHlwZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IE1ldGFkYXRhIGtleSB0byBzZXQgZm9yIHRoZSBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSBNZXRhZGF0YSB2YWx1ZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUga2V5LlxuICogQHJldHVybiB7TWV0aG9kRGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCBzZXRzIHRoZSBtZXRhZGF0YSBhbmQgY2FwdHVyZXMgdGhlIG1ldGhvZCdzIHNpZ25hdHVyZSBtZXRhZGF0YS5cbiAqIEBmdW5jdGlvbiBtZXRob2RNZXRhZGF0YVxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRob2RNZXRhZGF0YShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICByZXR1cm4gYXBwbHkobWV0YWRhdGEoa2V5LCB2YWx1ZSksIG1ldGhvZCgpKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQXR0YWNoZXMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiB0byBhIGNsYXNzIG9yIG1lbWJlci5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciBmYWN0b3J5IHRoYXQgc3RvcmVzIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBpbiB0aGUgbWV0YWRhdGEgc3RvcmUgdW5kZXIgdGhlIGFwcHJvcHJpYXRlIGRlc2NyaXB0aW9uIGtleSBmb3IgYSBjbGFzcyBvciBpdHMgcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzYyBEZXNjcmlwdGl2ZSB0ZXh0IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBjbGFzcyBvciBwcm9wZXJ0eS5cbiAqIEByZXR1cm4ge0NsYXNzRGVjb3JhdG9yfE1ldGhvZERlY29yYXRvcnxQcm9wZXJ0eURlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgcmVjb3JkcyB0aGUgZGVzY3JpcHRpb24gd2hlbiBhcHBsaWVkLlxuICogQGZ1bmN0aW9uIGRlc2NyaXB0aW9uXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmlwdGlvbihkZXNjOiBzdHJpbmcpIHtcbiAgZnVuY3Rpb24gaW5uZXJEZXNjcmlwdGlvbihkZXNjOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaW5uZXJEZXNjcmlwdGlvbihcbiAgICAgIG9yaWdpbmFsOiBhbnksXG4gICAgICBwcm9wPzogYW55LFxuICAgICAgZGVzY3JpcHRvcj86IGFueVxuICAgICkge1xuICAgICAgcmV0dXJuIG1ldGFkYXRhKFxuICAgICAgICBbXG4gICAgICAgICAgRGVjb3JhdGlvbktleXMuREVTQ1JJUFRJT04sXG4gICAgICAgICAgcHJvcCA/IHByb3AudG9TdHJpbmcoKSA6IERlY29yYXRpb25LZXlzLkNMQVNTLFxuICAgICAgICBdLmpvaW4oTWV0YWRhdGEuc3BsaXR0ZXIpLFxuICAgICAgICBkZXNjXG4gICAgICApKG9yaWdpbmFsLCBwcm9wLCBkZXNjcmlwdG9yKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKERlY29yYXRpb25LZXlzLkRFU0NSSVBUSU9OKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBpbm5lckRlc2NyaXB0aW9uLFxuICAgICAgYXJnczogW2Rlc2NdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBSb290IGVudHJ5IHBvaW50IGZvciB0aGUgZGVjb3JhdGlvbiBwYWNrYWdlLlxuICogQHN1bW1hcnkgUmUtZXhwb3J0cyB0aGUgYnVpbGRlciBBUEksIGRlY29yYXRvciBoZWxwZXJzLCBtZXRhZGF0YSB1dGlsaXRpZXMsIGFuZCBzaGFyZWQgY29uc3RhbnRzIHNvIGNvbnN1bWVycyBjYW4gaW1wb3J0IHtAbGluayBEZWNvcmF0aW9ufSwge0BsaW5rIE1ldGFkYXRhfSwge0BsaW5rIERlY29yYXRpb25LZXlzfSwgYW5kIHtAbGluayBEZWZhdWx0Rmxhdm91cn0gZnJvbSBhIHNpbmdsZSBzdXJmYWNlLlxuICogQG1vZHVsZSBkZWNvcmF0aW9uXG4gKi9cblxuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiLi9tZXRhZGF0YS9pbmRleFwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tZXRhZGF0YVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgZGVjb3JhdGlvbiBwYWNrYWdlLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBzZW1hbnRpYyB2ZXJzaW9uIHN0cmluZyByZWdpc3RlcmVkIHRocm91Z2gge0BsaW5rIE1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeX0uXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcblxuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIiwgVkVSU0lPTik7XG4iXSwibmFtZXMiOlsiRGVjb3JhdGlvbktleXMiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUVBOzs7Ozs7SUFNRztBQUNJLFVBQU0sY0FBYyxHQUFHO0lBRTlCOzs7Ozs7SUFNRztBQUNJLFVBQU0saUJBQWlCLEdBQUc7SUFFakM7Ozs7Ozs7SUFPRztBQUNTQTtJQUFaLENBQUEsVUFBWSxjQUFjLEVBQUE7O0lBRXhCLElBQUEsY0FBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLFdBQXVCOztJQUV2QixJQUFBLGNBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxTQUErQjs7SUFFL0IsSUFBQSxjQUFBLENBQUEsWUFBQSxDQUFBLEdBQUEsWUFBeUI7O0lBRXpCLElBQUEsY0FBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLFNBQW1COztJQUVuQixJQUFBLGNBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlOztJQUVmLElBQUEsY0FBQSxDQUFBLGFBQUEsQ0FBQSxHQUFBLGFBQTJCOztJQUUzQixJQUFBLGNBQUEsQ0FBQSxhQUFBLENBQUEsR0FBQSxZQUEwQjs7SUFFMUIsSUFBQSxjQUFBLENBQUEsWUFBQSxDQUFBLEdBQUEsWUFBeUI7O0lBRXpCLElBQUEsY0FBQSxDQUFBLGFBQUEsQ0FBQSxHQUFBLGFBQTJCOztJQUUzQixJQUFBLGNBQUEsQ0FBQSxlQUFBLENBQUEsR0FBQSxtQkFBbUM7O0lBRW5DLElBQUEsY0FBQSxDQUFBLGVBQUEsQ0FBQSxHQUFBLG1CQUFtQztJQUNyQyxDQUFDLEVBdkJXQSxzQkFBYyxLQUFkQSxzQkFBYyxHQXVCekIsRUFBQSxDQUFBLENBQUE7SUFFRDs7Ozs7O0lBTUc7QUFDVSxVQUFBLGVBQWUsR0FBdUI7SUFDakQsSUFBQSxD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
|