@workflow/web-shared 5.0.0-beta.36 → 5.0.0-beta.38
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/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +2 -1
- package/dist/components/new-trace-viewer/trace-viewer.js +11 -12
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +7 -1
- package/dist/components/stream-viewer-skeleton.d.ts +2 -0
- package/dist/components/stream-viewer-skeleton.d.ts.map +1 -0
- package/dist/components/stream-viewer-skeleton.js +12 -0
- package/dist/components/stream-viewer.d.ts +1 -1
- package/dist/components/stream-viewer.d.ts.map +1 -1
- package/dist/components/stream-viewer.js +9 -26
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/hydration.d.ts.map +1 -1
- package/dist/lib/hydration.js +13 -5
- package/package.json +5 -5
- package/src/components/index.ts +1 -0
- package/src/components/new-trace-viewer/trace-viewer.tsx +10 -12
- package/src/components/sidebar/attribute-panel.tsx +6 -0
- package/src/components/stream-viewer-skeleton.tsx +34 -0
- package/src/components/stream-viewer.tsx +34 -106
- package/src/index.ts +1 -4
- package/src/lib/hydration.ts +12 -6
package/dist/lib/hydration.js
CHANGED
|
@@ -401,15 +401,23 @@ export async function hydrateResourceIOWithKey(resource, key) {
|
|
|
401
401
|
* first and then inflated/hydrated.
|
|
402
402
|
*/
|
|
403
403
|
export async function hydrateResourceIOAsync(resource, key) {
|
|
404
|
-
const { hydrateDataWithKey } = await import('@workflow/core/serialization-format');
|
|
404
|
+
const { hydrateDataWithKey, deriveRunPayloadKeys } = await import('@workflow/core/serialization-format');
|
|
405
405
|
// Payloads may be zstd-compressed (the Web DecompressionStream has no zstd);
|
|
406
406
|
// register the WASM-backed browser decoder before hydrating. Idempotent and
|
|
407
407
|
// lazy — the WASM is only compiled when a zstd payload is actually decoded.
|
|
408
408
|
const { ensureZstdDecoderRegistered } = await import('./zstd-browser-decoder.js');
|
|
409
409
|
ensureZstdDecoderRegistered();
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
410
|
+
// Resolve the *full* key capability, not just the symmetric key: a run's
|
|
411
|
+
// event log can contain sealed ('encp') payloads that another run wrote to
|
|
412
|
+
// it (a cross-deployment hook resumption, say), and opening those needs the
|
|
413
|
+
// run's X25519 scalar in addition to its AES key. Both are derived from the
|
|
414
|
+
// same 32 bytes the key-retrieval endpoint returns.
|
|
415
|
+
// Resolve the *full* key capability, not just the symmetric key: a run's
|
|
416
|
+
// event log can contain sealed ('encp') payloads that another run wrote to
|
|
417
|
+
// it (a cross-deployment hook resumption, say), and opening those needs the
|
|
418
|
+
// run's X25519 scalar in addition to its AES key. Both derive from the same
|
|
419
|
+
// 32 bytes the key-retrieval endpoint returns.
|
|
420
|
+
const cryptoKey = key ? await deriveRunPayloadKeys(key) : undefined;
|
|
413
421
|
const revivers = getRevivers();
|
|
414
422
|
async function hydrateField(value) {
|
|
415
423
|
// Already-hydrated: encrypted marker with stored bytes
|
|
@@ -471,4 +479,4 @@ export function hasEncryptedFields(resource) {
|
|
|
471
479
|
}
|
|
472
480
|
return false;
|
|
473
481
|
}
|
|
474
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHlkcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9oeWRyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixpQkFBaUIsSUFBSSx3QkFBd0IsRUFDN0MsZUFBZSxFQUNmLGFBQWEsRUFDYixRQUFRLEVBQ1IscUJBQXFCLEVBRXJCLHVCQUF1QixHQUN4QixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhELG9EQUFvRDtBQUNwRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsUUFBUSxFQUNSLFVBQVUsRUFDVixXQUFXLEVBRVgsWUFBWSxFQUVaLGVBQWUsRUFFZix1QkFBdUIsRUFDdkIsVUFBVSxHQUNYLE1BQU0scUNBQXFDLENBQUM7QUFFN0MsOEVBQThFO0FBQzlFLDZCQUE2QjtBQUM3Qiw4RUFBOEU7QUFFOUUsU0FBUyxtQkFBbUIsQ0FBQyxNQUFjO0lBQ3pDLElBQUksTUFBTSxLQUFLLEVBQUUsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDcEMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENB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LENBQUM7WUFDMUIsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztRQUMzRCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2ViLXNwZWNpZmljIGh5ZHJhdGlvbiBmb3IgbzExeSBkaXNwbGF5LlxuICpcbiAqIEJyb3dzZXItc2FmZSByZXZpdmVycyB0aGF0IHVzZSBgYXRvYigpYCBmb3IgYmFzZTY0IGRlY29kaW5nIChubyBOb2RlLmpzXG4gKiBgQnVmZmVyYCBkZXBlbmRlbmN5KS4gUHJvZHVjZXMgYENsYXNzSW5zdGFuY2VSZWZgIG9iamVjdHMgYW5kIGBTdHJlYW1SZWZgXG4gKiBvYmplY3RzIGZvciBVSSByZW5kZXJpbmcuXG4gKi9cblxuaW1wb3J0IHtcbiAgZXh0cmFjdENsYXNzTmFtZSxcbiAgaHlkcmF0ZVJlc291cmNlSU8gYXMgaHlkcmF0ZVJlc291cmNlSU9HZW5lcmljLFxuICBpc0VuY3J5cHRlZERhdGEsXG4gIGlzRXhwaXJlZFN0dWIsXG4gIGlzUnVuUmVmLFxuICBvYnNlcnZhYmlsaXR5UmV2aXZlcnMsXG4gIHR5cGUgUmV2aXZlcnMsXG4gIHNlcmlhbGl6ZWRJbnN0YW5jZVRvUmVmLFxufSBmcm9tICdAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uLWZvcm1hdCc7XG5pbXBvcnQgeyBnZXRFdmVudERhdGFSZWZGaWVsZHMgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgYW5kIHV0aWxpdGllcyB0aGF0IGNvbnN1bWVycyBuZWVkXG5leHBvcnQge1xuICBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSxcbiAgQ2xhc3NJbnN0YW5jZVJlZixcbiAgRU5DUllQVEVEX1BMQUNFSE9MREVSLFxuICBleHRyYWN0U3RyZWFtSWRzLFxuICBpc0NsYXNzSW5zdGFuY2VSZWYsXG4gIGlzRW5jcnlwdGVkRGF0YSxcbiAgaXNSdW5SZWYsXG4gIGlzU3RyZWFtSWQsXG4gIGlzU3RyZWFtUmVmLFxuICB0eXBlIFJldml2ZXJzLFxuICBSVU5fUkVGX1RZUEUsXG4gIHR5cGUgUnVuUmVmLFxuICBTVFJFQU1fUkVGX1RZUEUsXG4gIHR5cGUgU3RyZWFtUmVmLFxuICBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZixcbiAgdHJ1bmNhdGVJZCxcbn0gZnJvbSAnQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbi1mb3JtYXQnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJyb3dzZXItc2FmZSBiYXNlNjQgZGVjb2RlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gYmFzZTY0VG9BcnJheUJ1ZmZlcihiYXNlNjQ6IHN0cmluZyk6IEFycmF5QnVmZmVyIHtcbiAgaWYgKGJhc2U2NCA9PT0gJycgfHwgYmFzZTY0ID09PSAnLicpIHtcbiAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApO1xuICB9XG4gIGNvbnN0IGJpbmFyeVN0cmluZyA9IGF0b2IoYmFzZTY0KTtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnlTdHJpbmcubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5hcnlTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICBieXRlc1tpXSA9IGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBieXRlcy5idWZmZXI7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV2ViIHJldml2ZXJzIChicm93c2VyLXNhZmUsIG5vIEJ1ZmZlciBkZXBlbmRlbmN5KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQnVpbGQgYSByZXZpdmVyIGZvciBvbmUgb2YgdGhlIGJ1aWx0LWluIGBFcnJvcmAgc3ViY2xhc3NlcyAoZS5nLlxuICogYFR5cGVFcnJvcmAsIGBSYW5nZUVycm9yYCkuIFRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIG5hbWVkIHN1YmNsYXNzIGlzXG4gKiByZXNvbHZlZCBvZmYgYGdsb2JhbFRoaXNgIGF0IGNhbGwgdGltZSBzbyB0aGUgcHJvZHVjZWQgaW5zdGFuY2UgaGFzIHRoZVxuICogY29ycmVjdCBwcm90b3R5cGUgY2hhaW4gaW4gdGhlIGNvbnN1bWVyIHJlYWxtLiBGYWxscyBiYWNrIHRvIGEgZ2VuZXJpY1xuICogYEVycm9yYCAod2l0aCBgbmFtZWAgc2V0KSBpZiB0aGUgZ2xvYmFsIGlzbid0IGF2YWlsYWJsZSwgd2hpY2gga2VlcHMgdGhlXG4gKiBvMTF5IFVJIHJlbmRlcmluZyBldmVuIG9uIGV4b3RpYyBicm93c2Vycy5cbiAqXG4gKiBgY2F1c2VgIGlzIHBhc3NlZCB0aHJvdWdoIGBFcnJvck9wdGlvbnNgIHRvIHRoZSBjb25zdHJ1Y3RvciB3aGVuIHByZXNlbnQsXG4gKiBtYXRjaGluZyBgZ2V0Q29tbW9uUmV2aXZlcnNgIGluIGBAd29ya2Zsb3cvY29yZWAgc28gdGhlIHJlc3VsdGluZyBgY2F1c2VgXG4gKiBwcm9wZXJ0eSBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIChub24tZW51bWVyYWJsZSwgc2V0IGJ5IHRoZSBlbmdpbmUpIGFzIGFcbiAqIGZyZXNobHkgdGhyb3duIEVycm9yIGluIHRoZSBjb25zdW1lciByZWFsbS4gVGhlIGAnY2F1c2UnIGluIHZhbHVlYCBjaGVja1xuICogcHJlc2VydmVzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIFwibm8gY2F1c2VcIiBhbmQgXCJjYXVzZSBpcyB1bmRlZmluZWRcIi5cbiAqL1xuZnVuY3Rpb24gbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKFxuICBuYW1lOlxuICAgIHwgJ0V2YWxFcnJvcidcbiAgICB8ICdSYW5nZUVycm9yJ1xuICAgIHwgJ1JlZmVyZW5jZUVycm9yJ1xuICAgIHwgJ1N5bnRheEVycm9yJ1xuICAgIHwgJ1R5cGVFcnJvcidcbiAgICB8ICdVUklFcnJvcidcbikge1xuICByZXR1cm4gKHZhbHVlOiB7IG1lc3NhZ2U6IHN0cmluZzsgc3RhY2s/OiBzdHJpbmc7IGNhdXNlPzogdW5rbm93biB9KSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IEN0b3IgPSAoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtuYW1lXSBhc1xuICAgICAgfCBFcnJvckNvbnN0cnVjdG9yXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZXJyb3I6IEVycm9yO1xuICAgIGlmICh0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IgPSBuZXcgQ3Rvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbGJhY2sgcGF0aDogbm8gYnVpbHQtaW4gc3ViY2xhc3MgYXZhaWxhYmxlIChleG90aWMgZW52KS4gQ29uc3RydWN0XG4gICAgICAvLyBhIHBsYWluIEVycm9yIHdpdGggdGhlIHJpZ2h0IGBuYW1lYCBhbmQgY29weSBgY2F1c2VgIG1hbnVhbGx5IHNpbmNlXG4gICAgICAvLyB0aGUgYmFzZSBFcnJvciBjb25zdHJ1Y3RvciBpcyB3aGF0IHdlIGFjdHVhbGx5IGNhbGxlZC5cbiAgICAgIGVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cyksIHsgbmFtZSB9KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgd2ViLXNwZWNpZmljIHJldml2ZXJzIGZvciBoeWRyYXRpbmcgc2VyaWFsaXplZCBkYXRhLlxuICpcbiAqIFVzZXMgYGF0b2IoKWAgZm9yIGJhc2U2NCBkZWNvZGluZyAobm8gTm9kZS5qcyBCdWZmZXIgZGVwZW5kZW5jeSkuXG4gKiBBbGwgdHlwZXMgYXJlIHJldml2ZWQgYXMgcmVhbCBpbnN0YW5jZXMgKERhdGUsIE1hcCwgU2V0LCBVUkwsXG4gKiBVUkxTZWFyY2hQYXJhbXMsIEhlYWRlcnMsIEVycm9yLCBldGMuKS5cbiAqXG4gKiBOT1RFOiB0aGlzIHNldCBtdXN0IG1pcnJvciB0aGUga2V5cyBpbiBgU2VyaWFsaXphYmxlU3BlY2lhbGAgKHNlZVxuICogYEB3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24vdHlwZXNgKS4gQW55IHJlZHVjZXIga2V5IGFkZGVkIG9uIHRoZVxuICogc2VyaWFsaXphdGlvbiBzaWRlIHRoYXQgaXNuJ3QgY292ZXJlZCBoZXJlIHdpbGwgY2F1c2UgYGRldmFsdWUudW5mbGF0dGVuYFxuICogdG8gdGhyb3cgYFVua25vd24gdHlwZSBYYCwgd2hpY2ggYGh5ZHJhdGVSZXNvdXJjZUlPYCBzd2FsbG93cyBhbmRcbiAqIHN1cmZhY2VzIGFzIGEgXCJGYWlsZWQgdG8gbG9hZCByZXNvdXJjZSBkZXRhaWxzXCIgYmFubmVyIGluIHRoZSBvMTF5IFVJLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2ViUmV2aXZlcnMoKTogUmV2aXZlcnMge1xuICBmdW5jdGlvbiByZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZTogc3RyaW5nKTogQXJyYXlCdWZmZXIge1xuICAgIHJldHVybiBiYXNlNjRUb0FycmF5QnVmZmVyKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gTzExeS1zcGVjaWZpYyByZXZpdmVycyAoc3RyZWFtcywgc3RlcCBmdW5jdGlvbnMg4oaSIGRpc3BsYXkgb2JqZWN0cykuXG4gICAgLy8gU3ByZWFkIEZJUlNUIHNvIHdlYi1zcGVjaWZpYyBvdmVycmlkZXMgYmVsb3cgdGFrZSBwcmVjZWRlbmNlLlxuICAgIC4uLm9ic2VydmFiaWxpdHlSZXZpdmVycyxcblxuICAgIC8vIEJpbmFyeSB0eXBlc1xuICAgIEFycmF5QnVmZmVyOiByZXZpdmVBcnJheUJ1ZmZlcixcbiAgICBCaWdJbnQ6ICh2YWx1ZTogc3RyaW5nKSA9PiBCaWdJbnQodmFsdWUpLFxuICAgIEJpZ0ludDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IEJpZ0ludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBCaWdVaW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgQmlnVWludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBEYXRlOiAodmFsdWUpID0+IG5ldyBEYXRlKHZhbHVlKSxcblxuICAgIC8vIEVycm9yIGZhbWlseS4gVGhlIHJlZHVjZXIgc2lkZSAoc2VlXG4gICAgLy8gYHBhY2thZ2VzL2NvcmUvc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLnRzYCkgZW1pdHMgYSB0YWdnZWRcbiAgICAvLyBlbnRyeSBmb3IgZWFjaCBidWlsdC1pbiBFcnJvciBzdWJjbGFzcyBwbHVzIHRoZSB3b3JrZmxvdy1zcGVjaWZpY1xuICAgIC8vIGBGYXRhbEVycm9yYCAvIGBSZXRyeWFibGVFcnJvcmAgLyBgSG9va0NvbmZsaWN0RXJyb3JgIC9cbiAgICAvLyBgUnVudGltZURlY3J5cHRpb25FcnJvcmAgYW5kIGBBZ2dyZWdhdGVFcnJvcmAuIFdpdGhvdXRcbiAgICAvLyBtYXRjaGluZyByZXZpdmVycyBoZXJlLCBgZGV2YWx1ZS51bmZsYXR0ZW5gIHRocm93cyBcIlVua25vd24gdHlwZSBYXCJcbiAgICAvLyDigJQgd2hpY2ggc3VyZmFjZXMgaW4gdGhlIHdlYiBvMTF5IFVJIGFzIFwiRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2VcbiAgICAvLyBkZXRhaWxzOiBVbmtub3duIHR5cGUgRmF0YWxFcnJvclwiLlxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpO1xuICAgICAgZXJyb3IubmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIEV2YWxFcnJvcjogbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKCdFdmFsRXJyb3InKSxcbiAgICBSYW5nZUVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKCdSZWZlcmVuY2VFcnJvcicpLFxuICAgIFN5bnRheEVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1N5bnRheEVycm9yJyksXG4gICAgVHlwZUVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1R5cGVFcnJvcicpLFxuICAgIFVSSUVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1VSSUVycm9yJyksXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgQ3RvciA9IChcbiAgICAgICAgZ2xvYmFsVGhpcyBhcyB7IEFnZ3JlZ2F0ZUVycm9yPzogQWdncmVnYXRlRXJyb3JDb25zdHJ1Y3RvciB9XG4gICAgICApLkFnZ3JlZ2F0ZUVycm9yO1xuICAgICAgY29uc3QgZXJyb3IgPVxuICAgICAgICB0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gbmV3IEN0b3IodmFsdWUuZXJyb3JzLCB2YWx1ZS5tZXNzYWdlLCBvcHRzKVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cyksIHtcbiAgICAgICAgICAgICAgbmFtZTogJ0FnZ3JlZ2F0ZUVycm9yJyxcbiAgICAgICAgICAgICAgZXJyb3JzOiB2YWx1ZS5lcnJvcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgLy8gYEZhdGFsRXJyb3JgIGFuZCBgUmV0cnlhYmxlRXJyb3JgIGFyZSBub3QgYnVpbHQtaW4gYnJvd3NlciBnbG9iYWxzLFxuICAgIC8vIHNvIHdlIGNhbid0IHJlc29sdmUgYSBjb25zdHJ1Y3RvciBmcm9tIGdsb2JhbFRoaXMuIFRoZSB3ZWIgbzExeSBVSVxuICAgIC8vIGRvZXNuJ3QgbmVlZCBgaW5zdGFuY2VvZiBGYXRhbEVycm9yYCB0byBwYXNzIChubyB1c2VyIGNvZGUgcnVuc1xuICAgIC8vIGhlcmUpIOKAlCBpdCBqdXN0IG5lZWRzIGBuYW1lYCwgYG1lc3NhZ2VgLCBgc3RhY2tgLCBhbmQgYW55IGV4dHJhXG4gICAgLy8gZW51bWVyYWJsZSBmaWVsZHMgdG8gcmVuZGVyLiBDb25zdHJ1Y3QgYSBwbGFpbiBgRXJyb3JgIHdpdGggYG5hbWVgXG4gICAgLy8gc2V0OyBPYmplY3RJbnNwZWN0b3IgcmVhZHMgYGNvbnN0cnVjdG9yLm5hbWVgIGZvciB0aGUgZGlzcGxheWVkXG4gICAgLy8gY2xhc3MgbGFiZWwsIGJ1dCB3ZSBkb24ndCBoYXZlIHRoZSByZWFsIGNsYXNzLCBzbyB3ZSBlbWl0IGEgdGFnZ2VkXG4gICAgLy8gRXJyb3Igd2hvc2UgYG5hbWVgIGZpZWxkIGNhcnJpZXMgdGhlIGNsYXNzIGlkZW50aXR5LiBUaGlzIG1hdGNoZXNcbiAgICAvLyBob3cgdGhlIGV4aXN0aW5nIGJhc2UgYEVycm9yYCByZXZpdmVyIHByZXNlbnRzIHVua25vd24gc3ViY2xhc3Nlcy5cbiAgICBGYXRhbEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpO1xuICAgICAgZXJyb3IubmFtZSA9ICdGYXRhbEVycm9yJztcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cykgYXMgRXJyb3IgJiB7XG4gICAgICAgIHRva2VuPzogc3RyaW5nO1xuICAgICAgICBjb25mbGljdGluZ1J1bklkPzogc3RyaW5nO1xuICAgICAgfTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSG9va0NvbmZsaWN0RXJyb3InO1xuICAgICAgZXJyb3IudG9rZW4gPSB2YWx1ZS50b2tlbjtcbiAgICAgIGlmICh2YWx1ZS5jb25mbGljdGluZ1J1bklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IuY29uZmxpY3RpbmdSdW5JZCA9IHZhbHVlLmNvbmZsaWN0aW5nUnVuSWQ7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIFJldHJ5YWJsZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpIGFzIEVycm9yICYge1xuICAgICAgICByZXRyeUFmdGVyPzogRGF0ZTtcbiAgICAgIH07XG4gICAgICBlcnJvci5uYW1lID0gJ1JldHJ5YWJsZUVycm9yJztcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgLy8gYHJldHJ5QWZ0ZXJgIGlzIHNlcmlhbGl6ZWQgYXMgYW4gZXBvY2ggbXMgbnVtYmVyIChzZWUgdGhlIHJ1bnRpbWVcbiAgICAgIC8vIFJldHJ5YWJsZUVycm9yIHJlZHVjZXIgZm9yIHRoZSByYXRpb25hbGUgYXJvdW5kIHJlYWxtLXNhZmV0eSkuXG4gICAgICAvLyBSZWh5ZHJhdGUgYXMgYSBEYXRlIHNvIG8xMXkgY29uc3VtZXJzIGNhbiByZW5kZXIgaXQgZGlyZWN0bHkuXG4gICAgICAvLyBHdWFyZCBhZ2FpbnN0IHBheWxvYWRzIGZyb20gb2xkZXIgcnVudGltZSB2ZXJzaW9ucyB0aGF0IHByZWRhdGVcbiAgICAgIC8vIHRoZSBmaWVsZCDigJQgd2l0aG91dCB0aGlzIGNoZWNrLCBgbmV3IERhdGUodW5kZWZpbmVkKWAgd291bGRcbiAgICAgIC8vIHByb2R1Y2UgYW4gSW52YWxpZCBEYXRlIHJhdGhlciB0aGFuIG9taXR0aW5nIHRoZSBwcm9wZXJ0eS5cbiAgICAgIGlmICh2YWx1ZS5yZXRyeUFmdGVyICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IucmV0cnlBZnRlciA9IG5ldyBEYXRlKHZhbHVlLnJldHJ5QWZ0ZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUnVudGltZURlY3J5cHRpb25FcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0gJ2NhdXNlJyBpbiB2YWx1ZSA/IHsgY2F1c2U6IHZhbHVlLmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29udGV4dD86IHVua25vd247XG4gICAgICB9O1xuICAgICAgZXJyb3IubmFtZSA9ICdSdW50aW1lRGVjcnlwdGlvbkVycm9yJztcbiAgICAgIGlmICh2YWx1ZS5jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IuY29udGV4dCA9IHZhbHVlLmNvbnRleHQ7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIERPTUV4Y2VwdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBNb2Rlcm4gYnJvd3NlcnMgYW5kIE5vZGUgMTgrIGV4cG9zZSBgRE9NRXhjZXB0aW9uYCBvbiBnbG9iYWxUaGlzLlxuICAgICAgLy8gYEFib3J0Q29udHJvbGxlci5hYm9ydCgpYCB3aXRoIG5vIGFyZ3VtZW50IHN5bnRoZXNpemVzIG9uZSBhcyB0aGVcbiAgICAgIC8vIHNpZ25hbCdzIHJlYXNvbiwgc28gdGhpcyBpcyBhIGNvbW1vbiBwYXlsb2FkIGZvciBhbnkgYWJvcnRlZCBzdGVwLlxuICAgICAgY29uc3QgRyA9IGdsb2JhbFRoaXMgYXMgeyBET01FeGNlcHRpb24/OiB0eXBlb2YgRE9NRXhjZXB0aW9uIH07XG4gICAgICBpZiAodHlwZW9mIEcuRE9NRXhjZXB0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgRy5ET01FeGNlcHRpb24odmFsdWUubWVzc2FnZSwgdmFsdWUubmFtZSk7XG4gICAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZSBhcyB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgZXJyb3IubmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSB7XG4gICAgICAgIChlcnJvciBhcyBFcnJvciAmIHsgY2F1c2U/OiB1bmtub3duIH0pLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBGbG9hdDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgRmxvYXQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgRmxvYXQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEZsb2F0NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIEludDhBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBJbnQ4QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBJbnQxNkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEludDE2QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBJbnQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEludDMyQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBNYXA6ICh2YWx1ZSkgPT4gbmV3IE1hcCh2YWx1ZSksXG4gICAgUmVnRXhwOiAodmFsdWUpID0+IG5ldyBSZWdFeHAodmFsdWUuc291cmNlLCB2YWx1ZS5mbGFncyksXG4gICAgU2V0OiAodmFsdWUpID0+IG5ldyBTZXQodmFsdWUpLFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgVWludDhBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIFVpbnQ4Q2xhbXBlZEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBVaW50OENsYW1wZWRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIFVpbnQxNkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IFVpbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgVWludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgVWludDMyQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcblxuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4gbmV3IEhlYWRlcnModmFsdWUpLFxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gICAgICBjb25zdCBjdG9yID0geyBSZXF1ZXN0OiBmdW5jdGlvbiAoKSB7fSB9LlJlcXVlc3QhO1xuICAgICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShjdG9yLnByb3RvdHlwZSk7XG4gICAgICBPYmplY3QuYXNzaWduKG9iaiwge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgdXJsOiB2YWx1ZS51cmwsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgICBib2R5OiB2YWx1ZS5ib2R5LFxuICAgICAgICBkdXBsZXg6IHZhbHVlLmR1cGxleCxcbiAgICAgICAgLi4uKHZhbHVlLnJlc3BvbnNlV3JpdGFibGVcbiAgICAgICAgICA/IHsgcmVzcG9uc2VXcml0YWJsZTogdmFsdWUucmVzcG9uc2VXcml0YWJsZSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L3VzZUFycm93RnVuY3Rpb246IGFycm93IGZ1bmN0aW9ucyBoYXZlIG5vIC5wcm90b3R5cGVcbiAgICAgIGNvbnN0IGN0b3IgPSB7IFJlc3BvbnNlOiBmdW5jdGlvbiAoKSB7fSB9LlJlc3BvbnNlITtcbiAgICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUoY3Rvci5wcm90b3R5cGUpO1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHtcbiAgICAgICAgc3RhdHVzOiB2YWx1ZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHZhbHVlLnN0YXR1c1RleHQsXG4gICAgICAgIHVybDogdmFsdWUudXJsLFxuICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgcmVkaXJlY3RlZDogdmFsdWUucmVkaXJlY3RlZCxcbiAgICAgICAgdHlwZTogdmFsdWUudHlwZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuICAgIFVSTDogKHZhbHVlKSA9PiBuZXcgVVJMKHZhbHVlKSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT4gbmV3IFVSTFNlYXJjaFBhcmFtcyh2YWx1ZSA9PT0gJy4nID8gJycgOiB2YWx1ZSksXG5cbiAgICAvLyBXZWItc3BlY2lmaWMgb3ZlcnJpZGVzIGZvciBjbGFzcyBpbnN0YW5jZXMuXG4gICAgLy8gQ3JlYXRlIG9iamVjdHMgd2l0aCBhIGR5bmFtaWNhbGx5LW5hbWVkIGNvbnN0cnVjdG9yIHNvIHRoYXRcbiAgICAvLyB0aGUgZGF0YSBpbnNwZWN0b3Igc2hvd3MgdGhlIGNsYXNzIG5hbWUgKGl0IHJlYWRzIGNvbnN0cnVjdG9yLm5hbWUpLlxuICAgIENsYXNzOiAodmFsdWUpID0+IGA8Y2xhc3M6JHtleHRyYWN0Q2xhc3NOYW1lKHZhbHVlLmNsYXNzSWQpfT5gLFxuICAgIEluc3RhbmNlOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFJ1biBpbnN0YW5jZXMgYXJlIHJlbmRlcmVkIGFzIGNsaWNrYWJsZSBSdW5SZWYgYmFkZ2VzXG4gICAgICBjb25zdCBydW5SZWYgPSBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZih2YWx1ZSk7XG4gICAgICBpZiAoaXNSdW5SZWYocnVuUmVmKSkge1xuICAgICAgICByZXR1cm4gcnVuUmVmO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xhc3NOYW1lID0gZXh0cmFjdENsYXNzTmFtZSh2YWx1ZS5jbGFzc0lkKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB2YWx1ZS5kYXRhO1xuICAgICAgY29uc3QgcHJvcHMgPVxuICAgICAgICBkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IHsgLi4uZGF0YSB9IDogeyB2YWx1ZTogZGF0YSB9O1xuICAgICAgLy8gQ3JlYXRlIGEgY29uc3RydWN0b3Igd2l0aCB0aGUgcmlnaHQgbmFtZSB1c2luZyBjb21wdXRlZCBwcm9wZXJ0eVxuICAgICAgLy8gc28gdGhlIGRhdGEgaW5zcGVjdG9yJ3MgYG9iamVjdC5jb25zdHJ1Y3Rvci5uYW1lYCBzaG93cyB0aGUgY2xhc3MgbmFtZS5cbiAgICAgIC8vIE11c3QgdXNlIGBmdW5jdGlvbmAgKG5vdCBhcnJvdykgYmVjYXVzZSBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlLlxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gICAgICBjb25zdCBjdG9yID0geyBbY2xhc3NOYW1lXTogZnVuY3Rpb24gKCkge30gfVtjbGFzc05hbWVdITtcbiAgICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUoY3Rvci5wcm90b3R5cGUpO1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHByb3BzKTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQcmUtYnVpbHQgd2ViIHJldml2ZXJzIChjYWNoZWQgZm9yIHBlcmZvcm1hbmNlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmxldCBjYWNoZWRSZXZpdmVyczogUmV2aXZlcnMgfCBudWxsID0gbnVsbDtcblxuZnVuY3Rpb24gZ2V0UmV2aXZlcnMoKTogUmV2aXZlcnMge1xuICBpZiAoIWNhY2hlZFJldml2ZXJzKSB7XG4gICAgY2FjaGVkUmV2aXZlcnMgPSBnZXRXZWJSZXZpdmVycygpO1xuICB9XG4gIHJldHVybiBjYWNoZWRSZXZpdmVycztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgQVBJXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBIeWRyYXRlIHRoZSBzZXJpYWxpemVkIGRhdGEgZmllbGRzIG9mIGEgcmVzb3VyY2UgZm9yIHdlYiBkaXNwbGF5LlxuICpcbiAqIFVzZXMgYnJvd3Nlci1zYWZlIHJldml2ZXJzIChhdG9iIGZvciBiYXNlNjQsIENsYXNzSW5zdGFuY2VSZWYgZm9yXG4gKiBjdXN0b20gY2xhc3NlcywgU3RyZWFtUmVmIGZvciBzdHJlYW1zKS4gQ2FsbCB0aGlzIG9uIGRhdGEgcmVjZWl2ZWRcbiAqIGZyb20gdGhlIHNlcnZlciBiZWZvcmUgcGFzc2luZyBpdCB0byBVSSBjb21wb25lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZVJlc291cmNlSU88VD4ocmVzb3VyY2U6IFQpOiBUIHtcbiAgY29uc3QgaHlkcmF0ZWQgPSBoeWRyYXRlUmVzb3VyY2VJT0dlbmVyaWMoXG4gICAgcmVzb3VyY2UgYXMgYW55LFxuICAgIGdldFJldml2ZXJzKClcbiAgKSBhcyBUO1xuICByZXR1cm4gcmVwbGFjZUVuY3J5cHRlZEFuZEV4cGlyZWRXaXRoTWFya2VycyhoeWRyYXRlZCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRW5jcnlwdGVkIGRhdGEgZGlzcGxheSBtYXJrZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGNvbnN0IEVOQ1JZUFRFRF9ESVNQTEFZX05BTUUgPSAnRW5jcnlwdGVkJztcblxuLyoqXG4gKiBDcmVhdGUgYSBkaXNwbGF5LWZyaWVuZGx5IG9iamVjdCBmb3IgZW5jcnlwdGVkIGRhdGEuXG4gKlxuICogVXNlcyB0aGUgc2FtZSBuYW1lZC1jb25zdHJ1Y3RvciB0cmljayBhcyB0aGUgSW5zdGFuY2UgcmV2aXZlciBzbyB0aGF0XG4gKiBPYmplY3RJbnNwZWN0b3IgcmVuZGVycyB0aGUgY29uc3RydWN0b3IgbmFtZSAoXCLwn5SSIEVuY3J5cHRlZFwiKSB3aXRoIG5vXG4gKiBleHBhbmRhYmxlIGNoaWxkcmVuLiBUaGUgb3JpZ2luYWwgZW5jcnlwdGVkIGJ5dGVzIGFyZSBzdG9yZWQgaW4gYVxuICogbm9uLWVudW1lcmFibGUgcHJvcGVydHkgZm9yIGxhdGVyIGRlY3J5cHRpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVuY3J5cHRlZE1hcmtlcihkYXRhOiBVaW50OEFycmF5KTogb2JqZWN0IHtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gIGNvbnN0IGN0b3IgPSB7IFtFTkNSWVBURURfRElTUExBWV9OQU1FXTogZnVuY3Rpb24gKCkge30gfVtcbiAgICBFTkNSWVBURURfRElTUExBWV9OQU1FXG4gIF0hO1xuICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKGN0b3IucHJvdG90eXBlKTtcbiAgLy8gU3RvcmUgb3JpZ2luYWwgYnl0ZXMgZm9yIGRlY3J5cHRpb24sIGJ1dCBub24tZW51bWVyYWJsZSBzb1xuICAvLyBPYmplY3RJbnNwZWN0b3IgZG9lc24ndCBzaG93IHRoZW0gYXMgY2hpbGRyZW5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgJ19fZW5jcnlwdGVkRGF0YScsIHtcbiAgICB2YWx1ZTogZGF0YSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICB9KTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYW4gZW5jcnlwdGVkIGRpc3BsYXkgbWFya2VyICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbmNyeXB0ZWRNYXJrZXIodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZS5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gRU5DUllQVEVEX0RJU1BMQVlfTkFNRVxuICApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4cGlyZWQgZGF0YSBkaXNwbGF5IG1hcmtlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgRVhQSVJFRF9ESVNQTEFZX05BTUUgPSAnRXhwaXJlZCBEYXRhJztcblxuLyoqXG4gKiBDcmVhdGUgYSBkaXNwbGF5LWZyaWVuZGx5IG9iamVjdCBmb3IgZXhwaXJlZCBkYXRhLlxuICpcbiAqIFVzZXMgdGhlIHNhbWUgbmFtZWQtY29uc3RydWN0b3IgdHJpY2sgYXMgdGhlIGVuY3J5cHRlZCBtYXJrZXIgc28gdGhhdFxuICogT2JqZWN0SW5zcGVjdG9yIHJlbmRlcnMgdGhlIGNvbnN0cnVjdG9yIG5hbWUgKFwiRXhwaXJlZCBEYXRhXCIpIHdpdGggbm9cbiAqIGV4cGFuZGFibGUgY2hpbGRyZW4uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUV4cGlyZWRNYXJrZXIoKTogb2JqZWN0IHtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gIGNvbnN0IGN0b3IgPSB7IFtFWFBJUkVEX0RJU1BMQVlfTkFNRV06IGZ1bmN0aW9uICgpIHt9IH1bXG4gICAgRVhQSVJFRF9ESVNQTEFZX05BTUVcbiAgXSE7XG4gIHJldHVybiBPYmplY3QuY3JlYXRlKGN0b3IucHJvdG90eXBlKTtcbn1cblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYW4gZXhwaXJlZCBkYXRhIGRpc3BsYXkgbWFya2VyICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeHBpcmVkTWFya2VyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUuY29uc3RydWN0b3I/Lm5hbWUgPT09IEVYUElSRURfRElTUExBWV9OQU1FXG4gICk7XG59XG5cbi8qKiBSZXBsYWNlIGEgc2luZ2xlIGZpZWxkIHZhbHVlIHdpdGggYSBkaXNwbGF5IG1hcmtlciBpZiBpdCdzIGVuY3J5cHRlZCBvciBleHBpcmVkLiAqL1xuZnVuY3Rpb24gdG9EaXNwbGF5TWFya2VyKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmIChpc0VuY3J5cHRlZERhdGEodmFsdWUpKSByZXR1cm4gY3JlYXRlRW5jcnlwdGVkTWFya2VyKHZhbHVlIGFzIFVpbnQ4QXJyYXkpO1xuICBpZiAoaXNFeHBpcmVkU3R1Yih2YWx1ZSkpIHJldHVybiBjcmVhdGVFeHBpcmVkTWFya2VyKCk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBQb3N0LXByb2Nlc3MgaHlkcmF0ZWQgcmVzb3VyY2UgZGF0YTogcmVwbGFjZSBlbmNyeXB0ZWQgVWludDhBcnJheSB2YWx1ZXNcbiAqIGFuZCBleHBpcmVkIHN0dWJzIHdpdGggZGlzcGxheS1mcmllbmRseSBtYXJrZXIgb2JqZWN0cyBpbiBrbm93biBkYXRhIGZpZWxkcy5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUVuY3J5cHRlZEFuZEV4cGlyZWRXaXRoTWFya2VyczxUPihyZXNvdXJjZTogVCk6IFQge1xuICBpZiAoIXJlc291cmNlIHx8IHR5cGVvZiByZXNvdXJjZSAhPT0gJ29iamVjdCcpIHJldHVybiByZXNvdXJjZTtcbiAgY29uc3QgciA9IHJlc291cmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCByZXN1bHQgPSB7IC4uLnIgfTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2lucHV0JywgJ291dHB1dCcsICdtZXRhZGF0YScsICdlcnJvciddKSB7XG4gICAgcmVzdWx0W2tleV0gPSB0b0Rpc3BsYXlNYXJrZXIocmVzdWx0W2tleV0pO1xuICB9XG5cbiAgaWYgKHJlc3VsdC5ldmVudERhdGEgJiYgdHlwZW9mIHJlc3VsdC5ldmVudERhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXZlbnRUeXBlID1cbiAgICAgIHR5cGVvZiByZXN1bHQuZXZlbnRUeXBlID09PSAnc3RyaW5nJyA/IHJlc3VsdC5ldmVudFR5cGUgOiAnJztcbiAgICBjb25zdCByZWZLZXlzID0gZ2V0RXZlbnREYXRhUmVmRmllbGRzKGV2ZW50VHlwZSk7XG4gICAgY29uc3QgZWQgPSB7IC4uLihyZXN1bHQuZXZlbnREYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlZktleXMpIHtcbiAgICAgIGlmIChrZXkgaW4gZWQpIHtcbiAgICAgICAgZWRba2V5XSA9IHRvRGlzcGxheU1hcmtlcihlZFtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LmV2ZW50RGF0YSA9IGVkO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdCBhcyBUO1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgcmVzb3VyY2UgZGF0YSB3aXRoIGRlY3J5cHRpb24gc3VwcG9ydC5cbiAqXG4gKiBXaGVuIGEga2V5IGlzIHByb3ZpZGVkLCBlbmNyeXB0ZWQgZmllbGRzIGFyZSBkZWNyeXB0ZWQgYmVmb3JlIGh5ZHJhdGlvbi5cbiAqIFRoaXMgaXMgdGhlIGFzeW5jIHZlcnNpb24gdXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBcIkRlY3J5cHRcIiBpbiB0aGUgd2ViIFVJLlxuICpcbiAqIEhhbmRsZXMgYm90aCB0b3AtbGV2ZWwgZmllbGRzIChpbnB1dCwgb3V0cHV0LCBtZXRhZGF0YSkgYW5kIG5lc3RlZCBldmVudERhdGFcbiAqIHBheWxvYWQgZmllbGRzIGZvciB0aGF0IGV2ZW50IHR5cGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlUmVzb3VyY2VJT1dpdGhLZXk8VD4oXG4gIHJlc291cmNlOiBULFxuICBrZXk6IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gaHlkcmF0ZVJlc291cmNlSU9Bc3luYyhyZXNvdXJjZSwga2V5KTtcbn1cblxuLyoqXG4gKiBBc3luYyBoeWRyYXRpb24gZm9yIHdlYiBkaXNwbGF5LlxuICpcbiAqIFRoaXMgZm9sbG93cyB0aGUgc2FtZSByZXNvdXJjZS1maWVsZCBtYXBwaW5nIGFzIHtAbGluayBoeWRyYXRlUmVzb3VyY2VJT30sXG4gKiBidXQgY2FuIGFsc28gaW5mbGF0ZSBjb21wcmVzc2VkIGJyb3dzZXIgcGF5bG9hZHMgdGhyb3VnaCB0aGUgcmVnaXN0ZXJlZFxuICogenN0ZCBXQVNNIGRlY29kZXIuIFdoZW4gYSBrZXkgaXMgcHJvdmlkZWQsIGVuY3J5cHRlZCBmaWVsZHMgYXJlIGRlY3J5cHRlZFxuICogZmlyc3QgYW5kIHRoZW4gaW5mbGF0ZWQvaHlkcmF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlUmVzb3VyY2VJT0FzeW5jPFQ+KFxuICByZXNvdXJjZTogVCxcbiAga2V5PzogVWludDhBcnJheVxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHsgaHlkcmF0ZURhdGFXaXRoS2V5IH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgJ0B3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24tZm9ybWF0J1xuICApO1xuICAvLyBQYXlsb2FkcyBtYXkgYmUgenN0ZC1jb21wcmVzc2VkICh0aGUgV2ViIERlY29tcHJlc3Npb25TdHJlYW0gaGFzIG5vIHpzdGQpO1xuICAvLyByZWdpc3RlciB0aGUgV0FTTS1iYWNrZWQgYnJvd3NlciBkZWNvZGVyIGJlZm9yZSBoeWRyYXRpbmcuIElkZW1wb3RlbnQgYW5kXG4gIC8vIGxhenkg4oCUIHRoZSBXQVNNIGlzIG9ubHkgY29tcGlsZWQgd2hlbiBhIHpzdGQgcGF5bG9hZCBpcyBhY3R1YWxseSBkZWNvZGVkLlxuICBjb25zdCB7IGVuc3VyZVpzdGREZWNvZGVyUmVnaXN0ZXJlZCB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICcuL3pzdGQtYnJvd3Nlci1kZWNvZGVyLmpzJ1xuICApO1xuICBlbnN1cmVac3RkRGVjb2RlclJlZ2lzdGVyZWQoKTtcbiAgY29uc3QgY3J5cHRvS2V5ID0ga2V5XG4gICAgPyBhd2FpdCBpbXBvcnQoJ0B3b3JrZmxvdy9jb3JlL2VuY3J5cHRpb24nKS50aGVuKCh7IGltcG9ydEtleSB9KSA9PlxuICAgICAgICBpbXBvcnRLZXkoa2V5KVxuICAgICAgKVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXZpdmVycyA9IGdldFJldml2ZXJzKCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZUZpZWxkKHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgLy8gQWxyZWFkeS1oeWRyYXRlZDogZW5jcnlwdGVkIG1hcmtlciB3aXRoIHN0b3JlZCBieXRlc1xuICAgIGlmIChpc0VuY3J5cHRlZE1hcmtlcih2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHJhdyA9ICh2YWx1ZSBhcyBhbnkpLl9fZW5jcnlwdGVkRGF0YSBhcyBVaW50OEFycmF5O1xuICAgICAgcmV0dXJuIGNyeXB0b0tleSA/IGh5ZHJhdGVEYXRhV2l0aEtleShyYXcsIHJldml2ZXJzLCBjcnlwdG9LZXkpIDogdmFsdWU7XG4gICAgfVxuICAgIC8vIFJhdyBVaW50OEFycmF5OiBtYXkgYmUgZW5jcnlwdGVkLCBjb21wcmVzc2VkLCBvciBwbGFpbiBkZXZhbHVlLlxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgIHJldHVybiBoeWRyYXRlRGF0YVdpdGhLZXkodmFsdWUsIHJldml2ZXJzLCBjcnlwdG9LZXkpO1xuICAgIH1cbiAgICAvLyBOb3Qgc2VyaWFsaXplZCDigJQgcmV0dXJuIGFzLWlzLlxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHIgPSByZXNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5yIH07XG5cbiAgLy8gRGVjcnlwdCArIGh5ZHJhdGUgdG9wLWxldmVsIHNlcmlhbGl6ZWQgZmllbGRzIChydW5zLCBzdGVwcywgaG9va3MpXG4gIGZvciAoY29uc3QgZmllbGQgb2YgWydpbnB1dCcsICdvdXRwdXQnLCAnbWV0YWRhdGEnLCAnZXJyb3InXSkge1xuICAgIGlmIChmaWVsZCBpbiByZXN1bHQpIHtcbiAgICAgIHJlc3VsdFtmaWVsZF0gPSBhd2FpdCBoeWRyYXRlRmllbGQocmVzdWx0W2ZpZWxkXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSHlkcmF0ZSBldmVudERhdGEgc3ViZmllbGRzIChldmVudHMpXG4gIGlmIChyZXN1bHQuZXZlbnREYXRhICYmIHR5cGVvZiByZXN1bHQuZXZlbnREYXRhID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IGV2ZW50VHlwZSA9XG4gICAgICB0eXBlb2YgcmVzdWx0LmV2ZW50VHlwZSA9PT0gJ3N0cmluZycgPyByZXN1bHQuZXZlbnRUeXBlIDogJyc7XG4gICAgY29uc3QgcmVmS2V5cyA9IGdldEV2ZW50RGF0YVJlZkZpZWxkcyhldmVudFR5cGUpO1xuICAgIGNvbnN0IGV2ZW50RGF0YSA9IHsgLi4uKHJlc3VsdC5ldmVudERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiByZWZLZXlzKSB7XG4gICAgICBpZiAoZmllbGQgaW4gZXZlbnREYXRhKSB7XG4gICAgICAgIGV2ZW50RGF0YVtmaWVsZF0gPSBhd2FpdCBoeWRyYXRlRmllbGQoZXZlbnREYXRhW2ZpZWxkXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5ldmVudERhdGEgPSBldmVudERhdGE7XG4gIH1cblxuICByZXR1cm4gcmVwbGFjZUVuY3J5cHRlZEFuZEV4cGlyZWRXaXRoTWFya2VycyhyZXN1bHQgYXMgVCk7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhIGh5ZHJhdGVkIHJlc291cmNlIChldmVudCwgc3RlcCwgcnVuLCBldGMuKSBjb250YWlucyBhbnlcbiAqIGVuY3J5cHRlZCBkaXNwbGF5IG1hcmtlcnMuIEluc3BlY3RzIHRoZSBzdGFuZGFyZCB0b3AtbGV2ZWwgZmllbGRzXG4gKiAoYGlucHV0YCwgYG91dHB1dGAsIGBlcnJvcmAsIGBtZXRhZGF0YWApIGFzIHdlbGwgYXMgdGhlIGV2ZW50LXR5cGUtc3BlY2lmaWNcbiAqIGBldmVudERhdGFgIHJlZiBmaWVsZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbmNyeXB0ZWRGaWVsZHMocmVzb3VyY2U6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFyZXNvdXJjZSB8fCB0eXBlb2YgcmVzb3VyY2UgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHIgPSByZXNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2lucHV0JywgJ291dHB1dCcsICdtZXRhZGF0YScsICdlcnJvciddKSB7XG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHJba2V5XSkpIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHIuZXZlbnREYXRhICYmIHR5cGVvZiByLmV2ZW50RGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBldmVudFR5cGUgPSB0eXBlb2Ygci5ldmVudFR5cGUgPT09ICdzdHJpbmcnID8gci5ldmVudFR5cGUgOiAnJztcbiAgICBjb25zdCByZWZLZXlzID0gZ2V0RXZlbnREYXRhUmVmRmllbGRzKGV2ZW50VHlwZSk7XG4gICAgY29uc3QgZWQgPSByLmV2ZW50RGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZWZLZXlzKSB7XG4gICAgICBpZiAoa2V5IGluIGVkICYmIGlzRW5jcnlwdGVkTWFya2VyKGVkW2tleV0pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
|
|
482
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHlkcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9oeWRyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixpQkFBaUIsSUFBSSx3QkFBd0IsRUFDN0MsZUFBZSxFQUNmLGFBQWEsRUFDYixRQUFRLEVBQ1IscUJBQXFCLEVBRXJCLHVCQUF1QixHQUN4QixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhELG9EQUFvRDtBQUNwRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsUUFBUSxFQUNSLFVBQVUsRUFDVixXQUFXLEVBRVgsWUFBWSxFQUVaLGVBQWUsRUFFZix1QkFBdUIsRUFDdkIsVUFBVSxHQUNYLE1BQU0scUNBQXFDLENBQUM7QUFFN0MsOEVBQThFO0FBQzlFLDZCQUE2QjtBQUM3Qiw4RUFBOEU7QUFFOUUsU0FBUyxtQkFBbUIsQ0FBQyxNQUFjO0lBQ3pDLElBQUksTUFBTSxLQUFLLEVBQUUsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDcEMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENB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RUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFvQyxDQUFDO1FBQ2xELEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7WUFDMUIsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztRQUMzRCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2ViLXNwZWNpZmljIGh5ZHJhdGlvbiBmb3IgbzExeSBkaXNwbGF5LlxuICpcbiAqIEJyb3dzZXItc2FmZSByZXZpdmVycyB0aGF0IHVzZSBgYXRvYigpYCBmb3IgYmFzZTY0IGRlY29kaW5nIChubyBOb2RlLmpzXG4gKiBgQnVmZmVyYCBkZXBlbmRlbmN5KS4gUHJvZHVjZXMgYENsYXNzSW5zdGFuY2VSZWZgIG9iamVjdHMgYW5kIGBTdHJlYW1SZWZgXG4gKiBvYmplY3RzIGZvciBVSSByZW5kZXJpbmcuXG4gKi9cblxuaW1wb3J0IHtcbiAgZXh0cmFjdENsYXNzTmFtZSxcbiAgaHlkcmF0ZVJlc291cmNlSU8gYXMgaHlkcmF0ZVJlc291cmNlSU9HZW5lcmljLFxuICBpc0VuY3J5cHRlZERhdGEsXG4gIGlzRXhwaXJlZFN0dWIsXG4gIGlzUnVuUmVmLFxuICBvYnNlcnZhYmlsaXR5UmV2aXZlcnMsXG4gIHR5cGUgUmV2aXZlcnMsXG4gIHNlcmlhbGl6ZWRJbnN0YW5jZVRvUmVmLFxufSBmcm9tICdAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uLWZvcm1hdCc7XG5pbXBvcnQgeyBnZXRFdmVudERhdGFSZWZGaWVsZHMgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgYW5kIHV0aWxpdGllcyB0aGF0IGNvbnN1bWVycyBuZWVkXG5leHBvcnQge1xuICBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSxcbiAgQ2xhc3NJbnN0YW5jZVJlZixcbiAgRU5DUllQVEVEX1BMQUNFSE9MREVSLFxuICBleHRyYWN0U3RyZWFtSWRzLFxuICBpc0NsYXNzSW5zdGFuY2VSZWYsXG4gIGlzRW5jcnlwdGVkRGF0YSxcbiAgaXNSdW5SZWYsXG4gIGlzU3RyZWFtSWQsXG4gIGlzU3RyZWFtUmVmLFxuICB0eXBlIFJldml2ZXJzLFxuICBSVU5fUkVGX1RZUEUsXG4gIHR5cGUgUnVuUmVmLFxuICBTVFJFQU1fUkVGX1RZUEUsXG4gIHR5cGUgU3RyZWFtUmVmLFxuICBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZixcbiAgdHJ1bmNhdGVJZCxcbn0gZnJvbSAnQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbi1mb3JtYXQnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJyb3dzZXItc2FmZSBiYXNlNjQgZGVjb2RlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gYmFzZTY0VG9BcnJheUJ1ZmZlcihiYXNlNjQ6IHN0cmluZyk6IEFycmF5QnVmZmVyIHtcbiAgaWYgKGJhc2U2NCA9PT0gJycgfHwgYmFzZTY0ID09PSAnLicpIHtcbiAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApO1xuICB9XG4gIGNvbnN0IGJpbmFyeVN0cmluZyA9IGF0b2IoYmFzZTY0KTtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnlTdHJpbmcubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5hcnlTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICBieXRlc1tpXSA9IGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBieXRlcy5idWZmZXI7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV2ViIHJldml2ZXJzIChicm93c2VyLXNhZmUsIG5vIEJ1ZmZlciBkZXBlbmRlbmN5KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQnVpbGQgYSByZXZpdmVyIGZvciBvbmUgb2YgdGhlIGJ1aWx0LWluIGBFcnJvcmAgc3ViY2xhc3NlcyAoZS5nLlxuICogYFR5cGVFcnJvcmAsIGBSYW5nZUVycm9yYCkuIFRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIG5hbWVkIHN1YmNsYXNzIGlzXG4gKiByZXNvbHZlZCBvZmYgYGdsb2JhbFRoaXNgIGF0IGNhbGwgdGltZSBzbyB0aGUgcHJvZHVjZWQgaW5zdGFuY2UgaGFzIHRoZVxuICogY29ycmVjdCBwcm90b3R5cGUgY2hhaW4gaW4gdGhlIGNvbnN1bWVyIHJlYWxtLiBGYWxscyBiYWNrIHRvIGEgZ2VuZXJpY1xuICogYEVycm9yYCAod2l0aCBgbmFtZWAgc2V0KSBpZiB0aGUgZ2xvYmFsIGlzbid0IGF2YWlsYWJsZSwgd2hpY2gga2VlcHMgdGhlXG4gKiBvMTF5IFVJIHJlbmRlcmluZyBldmVuIG9uIGV4b3RpYyBicm93c2Vycy5cbiAqXG4gKiBgY2F1c2VgIGlzIHBhc3NlZCB0aHJvdWdoIGBFcnJvck9wdGlvbnNgIHRvIHRoZSBjb25zdHJ1Y3RvciB3aGVuIHByZXNlbnQsXG4gKiBtYXRjaGluZyBgZ2V0Q29tbW9uUmV2aXZlcnNgIGluIGBAd29ya2Zsb3cvY29yZWAgc28gdGhlIHJlc3VsdGluZyBgY2F1c2VgXG4gKiBwcm9wZXJ0eSBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIChub24tZW51bWVyYWJsZSwgc2V0IGJ5IHRoZSBlbmdpbmUpIGFzIGFcbiAqIGZyZXNobHkgdGhyb3duIEVycm9yIGluIHRoZSBjb25zdW1lciByZWFsbS4gVGhlIGAnY2F1c2UnIGluIHZhbHVlYCBjaGVja1xuICogcHJlc2VydmVzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIFwibm8gY2F1c2VcIiBhbmQgXCJjYXVzZSBpcyB1bmRlZmluZWRcIi5cbiAqL1xuZnVuY3Rpb24gbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKFxuICBuYW1lOlxuICAgIHwgJ0V2YWxFcnJvcidcbiAgICB8ICdSYW5nZUVycm9yJ1xuICAgIHwgJ1JlZmVyZW5jZUVycm9yJ1xuICAgIHwgJ1N5bnRheEVycm9yJ1xuICAgIHwgJ1R5cGVFcnJvcidcbiAgICB8ICdVUklFcnJvcidcbikge1xuICByZXR1cm4gKHZhbHVlOiB7IG1lc3NhZ2U6IHN0cmluZzsgc3RhY2s/OiBzdHJpbmc7IGNhdXNlPzogdW5rbm93biB9KSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IEN0b3IgPSAoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtuYW1lXSBhc1xuICAgICAgfCBFcnJvckNvbnN0cnVjdG9yXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZXJyb3I6IEVycm9yO1xuICAgIGlmICh0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IgPSBuZXcgQ3Rvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbGJhY2sgcGF0aDogbm8gYnVpbHQtaW4gc3ViY2xhc3MgYXZhaWxhYmxlIChleG90aWMgZW52KS4gQ29uc3RydWN0XG4gICAgICAvLyBhIHBsYWluIEVycm9yIHdpdGggdGhlIHJpZ2h0IGBuYW1lYCBhbmQgY29weSBgY2F1c2VgIG1hbnVhbGx5IHNpbmNlXG4gICAgICAvLyB0aGUgYmFzZSBFcnJvciBjb25zdHJ1Y3RvciBpcyB3aGF0IHdlIGFjdHVhbGx5IGNhbGxlZC5cbiAgICAgIGVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cyksIHsgbmFtZSB9KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgd2ViLXNwZWNpZmljIHJldml2ZXJzIGZvciBoeWRyYXRpbmcgc2VyaWFsaXplZCBkYXRhLlxuICpcbiAqIFVzZXMgYGF0b2IoKWAgZm9yIGJhc2U2NCBkZWNvZGluZyAobm8gTm9kZS5qcyBCdWZmZXIgZGVwZW5kZW5jeSkuXG4gKiBBbGwgdHlwZXMgYXJlIHJldml2ZWQgYXMgcmVhbCBpbnN0YW5jZXMgKERhdGUsIE1hcCwgU2V0LCBVUkwsXG4gKiBVUkxTZWFyY2hQYXJhbXMsIEhlYWRlcnMsIEVycm9yLCBldGMuKS5cbiAqXG4gKiBOT1RFOiB0aGlzIHNldCBtdXN0IG1pcnJvciB0aGUga2V5cyBpbiBgU2VyaWFsaXphYmxlU3BlY2lhbGAgKHNlZVxuICogYEB3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24vdHlwZXNgKS4gQW55IHJlZHVjZXIga2V5IGFkZGVkIG9uIHRoZVxuICogc2VyaWFsaXphdGlvbiBzaWRlIHRoYXQgaXNuJ3QgY292ZXJlZCBoZXJlIHdpbGwgY2F1c2UgYGRldmFsdWUudW5mbGF0dGVuYFxuICogdG8gdGhyb3cgYFVua25vd24gdHlwZSBYYCwgd2hpY2ggYGh5ZHJhdGVSZXNvdXJjZUlPYCBzd2FsbG93cyBhbmRcbiAqIHN1cmZhY2VzIGFzIGEgXCJGYWlsZWQgdG8gbG9hZCByZXNvdXJjZSBkZXRhaWxzXCIgYmFubmVyIGluIHRoZSBvMTF5IFVJLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2ViUmV2aXZlcnMoKTogUmV2aXZlcnMge1xuICBmdW5jdGlvbiByZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZTogc3RyaW5nKTogQXJyYXlCdWZmZXIge1xuICAgIHJldHVybiBiYXNlNjRUb0FycmF5QnVmZmVyKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gTzExeS1zcGVjaWZpYyByZXZpdmVycyAoc3RyZWFtcywgc3RlcCBmdW5jdGlvbnMg4oaSIGRpc3BsYXkgb2JqZWN0cykuXG4gICAgLy8gU3ByZWFkIEZJUlNUIHNvIHdlYi1zcGVjaWZpYyBvdmVycmlkZXMgYmVsb3cgdGFrZSBwcmVjZWRlbmNlLlxuICAgIC4uLm9ic2VydmFiaWxpdHlSZXZpdmVycyxcblxuICAgIC8vIEJpbmFyeSB0eXBlc1xuICAgIEFycmF5QnVmZmVyOiByZXZpdmVBcnJheUJ1ZmZlcixcbiAgICBCaWdJbnQ6ICh2YWx1ZTogc3RyaW5nKSA9PiBCaWdJbnQodmFsdWUpLFxuICAgIEJpZ0ludDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IEJpZ0ludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBCaWdVaW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgQmlnVWludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBEYXRlOiAodmFsdWUpID0+IG5ldyBEYXRlKHZhbHVlKSxcblxuICAgIC8vIEVycm9yIGZhbWlseS4gVGhlIHJlZHVjZXIgc2lkZSAoc2VlXG4gICAgLy8gYHBhY2thZ2VzL2NvcmUvc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLnRzYCkgZW1pdHMgYSB0YWdnZWRcbiAgICAvLyBlbnRyeSBmb3IgZWFjaCBidWlsdC1pbiBFcnJvciBzdWJjbGFzcyBwbHVzIHRoZSB3b3JrZmxvdy1zcGVjaWZpY1xuICAgIC8vIGBGYXRhbEVycm9yYCAvIGBSZXRyeWFibGVFcnJvcmAgLyBgSG9va0NvbmZsaWN0RXJyb3JgIC9cbiAgICAvLyBgUnVudGltZURlY3J5cHRpb25FcnJvcmAgYW5kIGBBZ2dyZWdhdGVFcnJvcmAuIFdpdGhvdXRcbiAgICAvLyBtYXRjaGluZyByZXZpdmVycyBoZXJlLCBgZGV2YWx1ZS51bmZsYXR0ZW5gIHRocm93cyBcIlVua25vd24gdHlwZSBYXCJcbiAgICAvLyDigJQgd2hpY2ggc3VyZmFjZXMgaW4gdGhlIHdlYiBvMTF5IFVJIGFzIFwiRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2VcbiAgICAvLyBkZXRhaWxzOiBVbmtub3duIHR5cGUgRmF0YWxFcnJvclwiLlxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpO1xuICAgICAgZXJyb3IubmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIEV2YWxFcnJvcjogbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKCdFdmFsRXJyb3InKSxcbiAgICBSYW5nZUVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKCdSZWZlcmVuY2VFcnJvcicpLFxuICAgIFN5bnRheEVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1N5bnRheEVycm9yJyksXG4gICAgVHlwZUVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1R5cGVFcnJvcicpLFxuICAgIFVSSUVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1VSSUVycm9yJyksXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgQ3RvciA9IChcbiAgICAgICAgZ2xvYmFsVGhpcyBhcyB7IEFnZ3JlZ2F0ZUVycm9yPzogQWdncmVnYXRlRXJyb3JDb25zdHJ1Y3RvciB9XG4gICAgICApLkFnZ3JlZ2F0ZUVycm9yO1xuICAgICAgY29uc3QgZXJyb3IgPVxuICAgICAgICB0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gbmV3IEN0b3IodmFsdWUuZXJyb3JzLCB2YWx1ZS5tZXNzYWdlLCBvcHRzKVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cyksIHtcbiAgICAgICAgICAgICAgbmFtZTogJ0FnZ3JlZ2F0ZUVycm9yJyxcbiAgICAgICAgICAgICAgZXJyb3JzOiB2YWx1ZS5lcnJvcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgLy8gYEZhdGFsRXJyb3JgIGFuZCBgUmV0cnlhYmxlRXJyb3JgIGFyZSBub3QgYnVpbHQtaW4gYnJvd3NlciBnbG9iYWxzLFxuICAgIC8vIHNvIHdlIGNhbid0IHJlc29sdmUgYSBjb25zdHJ1Y3RvciBmcm9tIGdsb2JhbFRoaXMuIFRoZSB3ZWIgbzExeSBVSVxuICAgIC8vIGRvZXNuJ3QgbmVlZCBgaW5zdGFuY2VvZiBGYXRhbEVycm9yYCB0byBwYXNzIChubyB1c2VyIGNvZGUgcnVuc1xuICAgIC8vIGhlcmUpIOKAlCBpdCBqdXN0IG5lZWRzIGBuYW1lYCwgYG1lc3NhZ2VgLCBgc3RhY2tgLCBhbmQgYW55IGV4dHJhXG4gICAgLy8gZW51bWVyYWJsZSBmaWVsZHMgdG8gcmVuZGVyLiBDb25zdHJ1Y3QgYSBwbGFpbiBgRXJyb3JgIHdpdGggYG5hbWVgXG4gICAgLy8gc2V0OyBPYmplY3RJbnNwZWN0b3IgcmVhZHMgYGNvbnN0cnVjdG9yLm5hbWVgIGZvciB0aGUgZGlzcGxheWVkXG4gICAgLy8gY2xhc3MgbGFiZWwsIGJ1dCB3ZSBkb24ndCBoYXZlIHRoZSByZWFsIGNsYXNzLCBzbyB3ZSBlbWl0IGEgdGFnZ2VkXG4gICAgLy8gRXJyb3Igd2hvc2UgYG5hbWVgIGZpZWxkIGNhcnJpZXMgdGhlIGNsYXNzIGlkZW50aXR5LiBUaGlzIG1hdGNoZXNcbiAgICAvLyBob3cgdGhlIGV4aXN0aW5nIGJhc2UgYEVycm9yYCByZXZpdmVyIHByZXNlbnRzIHVua25vd24gc3ViY2xhc3Nlcy5cbiAgICBGYXRhbEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpO1xuICAgICAgZXJyb3IubmFtZSA9ICdGYXRhbEVycm9yJztcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cykgYXMgRXJyb3IgJiB7XG4gICAgICAgIHRva2VuPzogc3RyaW5nO1xuICAgICAgICBjb25mbGljdGluZ1J1bklkPzogc3RyaW5nO1xuICAgICAgfTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSG9va0NvbmZsaWN0RXJyb3InO1xuICAgICAgZXJyb3IudG9rZW4gPSB2YWx1ZS50b2tlbjtcbiAgICAgIGlmICh2YWx1ZS5jb25mbGljdGluZ1J1bklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IuY29uZmxpY3RpbmdSdW5JZCA9IHZhbHVlLmNvbmZsaWN0aW5nUnVuSWQ7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIFJldHJ5YWJsZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpIGFzIEVycm9yICYge1xuICAgICAgICByZXRyeUFmdGVyPzogRGF0ZTtcbiAgICAgIH07XG4gICAgICBlcnJvci5uYW1lID0gJ1JldHJ5YWJsZUVycm9yJztcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgLy8gYHJldHJ5QWZ0ZXJgIGlzIHNlcmlhbGl6ZWQgYXMgYW4gZXBvY2ggbXMgbnVtYmVyIChzZWUgdGhlIHJ1bnRpbWVcbiAgICAgIC8vIFJldHJ5YWJsZUVycm9yIHJlZHVjZXIgZm9yIHRoZSByYXRpb25hbGUgYXJvdW5kIHJlYWxtLXNhZmV0eSkuXG4gICAgICAvLyBSZWh5ZHJhdGUgYXMgYSBEYXRlIHNvIG8xMXkgY29uc3VtZXJzIGNhbiByZW5kZXIgaXQgZGlyZWN0bHkuXG4gICAgICAvLyBHdWFyZCBhZ2FpbnN0IHBheWxvYWRzIGZyb20gb2xkZXIgcnVudGltZSB2ZXJzaW9ucyB0aGF0IHByZWRhdGVcbiAgICAgIC8vIHRoZSBmaWVsZCDigJQgd2l0aG91dCB0aGlzIGNoZWNrLCBgbmV3IERhdGUodW5kZWZpbmVkKWAgd291bGRcbiAgICAgIC8vIHByb2R1Y2UgYW4gSW52YWxpZCBEYXRlIHJhdGhlciB0aGFuIG9taXR0aW5nIHRoZSBwcm9wZXJ0eS5cbiAgICAgIGlmICh2YWx1ZS5yZXRyeUFmdGVyICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IucmV0cnlBZnRlciA9IG5ldyBEYXRlKHZhbHVlLnJldHJ5QWZ0ZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUnVudGltZURlY3J5cHRpb25FcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0gJ2NhdXNlJyBpbiB2YWx1ZSA/IHsgY2F1c2U6IHZhbHVlLmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29udGV4dD86IHVua25vd247XG4gICAgICB9O1xuICAgICAgZXJyb3IubmFtZSA9ICdSdW50aW1lRGVjcnlwdGlvbkVycm9yJztcbiAgICAgIGlmICh2YWx1ZS5jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IuY29udGV4dCA9IHZhbHVlLmNvbnRleHQ7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIERPTUV4Y2VwdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBNb2Rlcm4gYnJvd3NlcnMgYW5kIE5vZGUgMTgrIGV4cG9zZSBgRE9NRXhjZXB0aW9uYCBvbiBnbG9iYWxUaGlzLlxuICAgICAgLy8gYEFib3J0Q29udHJvbGxlci5hYm9ydCgpYCB3aXRoIG5vIGFyZ3VtZW50IHN5bnRoZXNpemVzIG9uZSBhcyB0aGVcbiAgICAgIC8vIHNpZ25hbCdzIHJlYXNvbiwgc28gdGhpcyBpcyBhIGNvbW1vbiBwYXlsb2FkIGZvciBhbnkgYWJvcnRlZCBzdGVwLlxuICAgICAgY29uc3QgRyA9IGdsb2JhbFRoaXMgYXMgeyBET01FeGNlcHRpb24/OiB0eXBlb2YgRE9NRXhjZXB0aW9uIH07XG4gICAgICBpZiAodHlwZW9mIEcuRE9NRXhjZXB0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgRy5ET01FeGNlcHRpb24odmFsdWUubWVzc2FnZSwgdmFsdWUubmFtZSk7XG4gICAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZSBhcyB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgZXJyb3IubmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSB7XG4gICAgICAgIChlcnJvciBhcyBFcnJvciAmIHsgY2F1c2U/OiB1bmtub3duIH0pLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBGbG9hdDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgRmxvYXQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgRmxvYXQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEZsb2F0NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIEludDhBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBJbnQ4QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBJbnQxNkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEludDE2QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBJbnQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEludDMyQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBNYXA6ICh2YWx1ZSkgPT4gbmV3IE1hcCh2YWx1ZSksXG4gICAgUmVnRXhwOiAodmFsdWUpID0+IG5ldyBSZWdFeHAodmFsdWUuc291cmNlLCB2YWx1ZS5mbGFncyksXG4gICAgU2V0OiAodmFsdWUpID0+IG5ldyBTZXQodmFsdWUpLFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgVWludDhBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIFVpbnQ4Q2xhbXBlZEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBVaW50OENsYW1wZWRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIFVpbnQxNkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IFVpbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgVWludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgVWludDMyQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcblxuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4gbmV3IEhlYWRlcnModmFsdWUpLFxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gICAgICBjb25zdCBjdG9yID0geyBSZXF1ZXN0OiBmdW5jdGlvbiAoKSB7fSB9LlJlcXVlc3QhO1xuICAgICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShjdG9yLnByb3RvdHlwZSk7XG4gICAgICBPYmplY3QuYXNzaWduKG9iaiwge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgdXJsOiB2YWx1ZS51cmwsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgICBib2R5OiB2YWx1ZS5ib2R5LFxuICAgICAgICBkdXBsZXg6IHZhbHVlLmR1cGxleCxcbiAgICAgICAgLi4uKHZhbHVlLnJlc3BvbnNlV3JpdGFibGVcbiAgICAgICAgICA/IHsgcmVzcG9uc2VXcml0YWJsZTogdmFsdWUucmVzcG9uc2VXcml0YWJsZSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L3VzZUFycm93RnVuY3Rpb246IGFycm93IGZ1bmN0aW9ucyBoYXZlIG5vIC5wcm90b3R5cGVcbiAgICAgIGNvbnN0IGN0b3IgPSB7IFJlc3BvbnNlOiBmdW5jdGlvbiAoKSB7fSB9LlJlc3BvbnNlITtcbiAgICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUoY3Rvci5wcm90b3R5cGUpO1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHtcbiAgICAgICAgc3RhdHVzOiB2YWx1ZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHZhbHVlLnN0YXR1c1RleHQsXG4gICAgICAgIHVybDogdmFsdWUudXJsLFxuICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgcmVkaXJlY3RlZDogdmFsdWUucmVkaXJlY3RlZCxcbiAgICAgICAgdHlwZTogdmFsdWUudHlwZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuICAgIFVSTDogKHZhbHVlKSA9PiBuZXcgVVJMKHZhbHVlKSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT4gbmV3IFVSTFNlYXJjaFBhcmFtcyh2YWx1ZSA9PT0gJy4nID8gJycgOiB2YWx1ZSksXG5cbiAgICAvLyBXZWItc3BlY2lmaWMgb3ZlcnJpZGVzIGZvciBjbGFzcyBpbnN0YW5jZXMuXG4gICAgLy8gQ3JlYXRlIG9iamVjdHMgd2l0aCBhIGR5bmFtaWNhbGx5LW5hbWVkIGNvbnN0cnVjdG9yIHNvIHRoYXRcbiAgICAvLyB0aGUgZGF0YSBpbnNwZWN0b3Igc2hvd3MgdGhlIGNsYXNzIG5hbWUgKGl0IHJlYWRzIGNvbnN0cnVjdG9yLm5hbWUpLlxuICAgIENsYXNzOiAodmFsdWUpID0+IGA8Y2xhc3M6JHtleHRyYWN0Q2xhc3NOYW1lKHZhbHVlLmNsYXNzSWQpfT5gLFxuICAgIEluc3RhbmNlOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFJ1biBpbnN0YW5jZXMgYXJlIHJlbmRlcmVkIGFzIGNsaWNrYWJsZSBSdW5SZWYgYmFkZ2VzXG4gICAgICBjb25zdCBydW5SZWYgPSBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZih2YWx1ZSk7XG4gICAgICBpZiAoaXNSdW5SZWYocnVuUmVmKSkge1xuICAgICAgICByZXR1cm4gcnVuUmVmO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xhc3NOYW1lID0gZXh0cmFjdENsYXNzTmFtZSh2YWx1ZS5jbGFzc0lkKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB2YWx1ZS5kYXRhO1xuICAgICAgY29uc3QgcHJvcHMgPVxuICAgICAgICBkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IHsgLi4uZGF0YSB9IDogeyB2YWx1ZTogZGF0YSB9O1xuICAgICAgLy8gQ3JlYXRlIGEgY29uc3RydWN0b3Igd2l0aCB0aGUgcmlnaHQgbmFtZSB1c2luZyBjb21wdXRlZCBwcm9wZXJ0eVxuICAgICAgLy8gc28gdGhlIGRhdGEgaW5zcGVjdG9yJ3MgYG9iamVjdC5jb25zdHJ1Y3Rvci5uYW1lYCBzaG93cyB0aGUgY2xhc3MgbmFtZS5cbiAgICAgIC8vIE11c3QgdXNlIGBmdW5jdGlvbmAgKG5vdCBhcnJvdykgYmVjYXVzZSBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlLlxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gICAgICBjb25zdCBjdG9yID0geyBbY2xhc3NOYW1lXTogZnVuY3Rpb24gKCkge30gfVtjbGFzc05hbWVdITtcbiAgICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUoY3Rvci5wcm90b3R5cGUpO1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHByb3BzKTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQcmUtYnVpbHQgd2ViIHJldml2ZXJzIChjYWNoZWQgZm9yIHBlcmZvcm1hbmNlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmxldCBjYWNoZWRSZXZpdmVyczogUmV2aXZlcnMgfCBudWxsID0gbnVsbDtcblxuZnVuY3Rpb24gZ2V0UmV2aXZlcnMoKTogUmV2aXZlcnMge1xuICBpZiAoIWNhY2hlZFJldml2ZXJzKSB7XG4gICAgY2FjaGVkUmV2aXZlcnMgPSBnZXRXZWJSZXZpdmVycygpO1xuICB9XG4gIHJldHVybiBjYWNoZWRSZXZpdmVycztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgQVBJXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBIeWRyYXRlIHRoZSBzZXJpYWxpemVkIGRhdGEgZmllbGRzIG9mIGEgcmVzb3VyY2UgZm9yIHdlYiBkaXNwbGF5LlxuICpcbiAqIFVzZXMgYnJvd3Nlci1zYWZlIHJldml2ZXJzIChhdG9iIGZvciBiYXNlNjQsIENsYXNzSW5zdGFuY2VSZWYgZm9yXG4gKiBjdXN0b20gY2xhc3NlcywgU3RyZWFtUmVmIGZvciBzdHJlYW1zKS4gQ2FsbCB0aGlzIG9uIGRhdGEgcmVjZWl2ZWRcbiAqIGZyb20gdGhlIHNlcnZlciBiZWZvcmUgcGFzc2luZyBpdCB0byBVSSBjb21wb25lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZVJlc291cmNlSU88VD4ocmVzb3VyY2U6IFQpOiBUIHtcbiAgY29uc3QgaHlkcmF0ZWQgPSBoeWRyYXRlUmVzb3VyY2VJT0dlbmVyaWMoXG4gICAgcmVzb3VyY2UgYXMgYW55LFxuICAgIGdldFJldml2ZXJzKClcbiAgKSBhcyBUO1xuICByZXR1cm4gcmVwbGFjZUVuY3J5cHRlZEFuZEV4cGlyZWRXaXRoTWFya2VycyhoeWRyYXRlZCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRW5jcnlwdGVkIGRhdGEgZGlzcGxheSBtYXJrZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGNvbnN0IEVOQ1JZUFRFRF9ESVNQTEFZX05BTUUgPSAnRW5jcnlwdGVkJztcblxuLyoqXG4gKiBDcmVhdGUgYSBkaXNwbGF5LWZyaWVuZGx5IG9iamVjdCBmb3IgZW5jcnlwdGVkIGRhdGEuXG4gKlxuICogVXNlcyB0aGUgc2FtZSBuYW1lZC1jb25zdHJ1Y3RvciB0cmljayBhcyB0aGUgSW5zdGFuY2UgcmV2aXZlciBzbyB0aGF0XG4gKiBPYmplY3RJbnNwZWN0b3IgcmVuZGVycyB0aGUgY29uc3RydWN0b3IgbmFtZSAoXCLwn5SSIEVuY3J5cHRlZFwiKSB3aXRoIG5vXG4gKiBleHBhbmRhYmxlIGNoaWxkcmVuLiBUaGUgb3JpZ2luYWwgZW5jcnlwdGVkIGJ5dGVzIGFyZSBzdG9yZWQgaW4gYVxuICogbm9uLWVudW1lcmFibGUgcHJvcGVydHkgZm9yIGxhdGVyIGRlY3J5cHRpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVuY3J5cHRlZE1hcmtlcihkYXRhOiBVaW50OEFycmF5KTogb2JqZWN0IHtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gIGNvbnN0IGN0b3IgPSB7IFtFTkNSWVBURURfRElTUExBWV9OQU1FXTogZnVuY3Rpb24gKCkge30gfVtcbiAgICBFTkNSWVBURURfRElTUExBWV9OQU1FXG4gIF0hO1xuICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKGN0b3IucHJvdG90eXBlKTtcbiAgLy8gU3RvcmUgb3JpZ2luYWwgYnl0ZXMgZm9yIGRlY3J5cHRpb24sIGJ1dCBub24tZW51bWVyYWJsZSBzb1xuICAvLyBPYmplY3RJbnNwZWN0b3IgZG9lc24ndCBzaG93IHRoZW0gYXMgY2hpbGRyZW5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgJ19fZW5jcnlwdGVkRGF0YScsIHtcbiAgICB2YWx1ZTogZGF0YSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICB9KTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYW4gZW5jcnlwdGVkIGRpc3BsYXkgbWFya2VyICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbmNyeXB0ZWRNYXJrZXIodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZS5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gRU5DUllQVEVEX0RJU1BMQVlfTkFNRVxuICApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4cGlyZWQgZGF0YSBkaXNwbGF5IG1hcmtlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgRVhQSVJFRF9ESVNQTEFZX05BTUUgPSAnRXhwaXJlZCBEYXRhJztcblxuLyoqXG4gKiBDcmVhdGUgYSBkaXNwbGF5LWZyaWVuZGx5IG9iamVjdCBmb3IgZXhwaXJlZCBkYXRhLlxuICpcbiAqIFVzZXMgdGhlIHNhbWUgbmFtZWQtY29uc3RydWN0b3IgdHJpY2sgYXMgdGhlIGVuY3J5cHRlZCBtYXJrZXIgc28gdGhhdFxuICogT2JqZWN0SW5zcGVjdG9yIHJlbmRlcnMgdGhlIGNvbnN0cnVjdG9yIG5hbWUgKFwiRXhwaXJlZCBEYXRhXCIpIHdpdGggbm9cbiAqIGV4cGFuZGFibGUgY2hpbGRyZW4uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUV4cGlyZWRNYXJrZXIoKTogb2JqZWN0IHtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gIGNvbnN0IGN0b3IgPSB7IFtFWFBJUkVEX0RJU1BMQVlfTkFNRV06IGZ1bmN0aW9uICgpIHt9IH1bXG4gICAgRVhQSVJFRF9ESVNQTEFZX05BTUVcbiAgXSE7XG4gIHJldHVybiBPYmplY3QuY3JlYXRlKGN0b3IucHJvdG90eXBlKTtcbn1cblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYW4gZXhwaXJlZCBkYXRhIGRpc3BsYXkgbWFya2VyICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeHBpcmVkTWFya2VyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUuY29uc3RydWN0b3I/Lm5hbWUgPT09IEVYUElSRURfRElTUExBWV9OQU1FXG4gICk7XG59XG5cbi8qKiBSZXBsYWNlIGEgc2luZ2xlIGZpZWxkIHZhbHVlIHdpdGggYSBkaXNwbGF5IG1hcmtlciBpZiBpdCdzIGVuY3J5cHRlZCBvciBleHBpcmVkLiAqL1xuZnVuY3Rpb24gdG9EaXNwbGF5TWFya2VyKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmIChpc0VuY3J5cHRlZERhdGEodmFsdWUpKSByZXR1cm4gY3JlYXRlRW5jcnlwdGVkTWFya2VyKHZhbHVlIGFzIFVpbnQ4QXJyYXkpO1xuICBpZiAoaXNFeHBpcmVkU3R1Yih2YWx1ZSkpIHJldHVybiBjcmVhdGVFeHBpcmVkTWFya2VyKCk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBQb3N0LXByb2Nlc3MgaHlkcmF0ZWQgcmVzb3VyY2UgZGF0YTogcmVwbGFjZSBlbmNyeXB0ZWQgVWludDhBcnJheSB2YWx1ZXNcbiAqIGFuZCBleHBpcmVkIHN0dWJzIHdpdGggZGlzcGxheS1mcmllbmRseSBtYXJrZXIgb2JqZWN0cyBpbiBrbm93biBkYXRhIGZpZWxkcy5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUVuY3J5cHRlZEFuZEV4cGlyZWRXaXRoTWFya2VyczxUPihyZXNvdXJjZTogVCk6IFQge1xuICBpZiAoIXJlc291cmNlIHx8IHR5cGVvZiByZXNvdXJjZSAhPT0gJ29iamVjdCcpIHJldHVybiByZXNvdXJjZTtcbiAgY29uc3QgciA9IHJlc291cmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCByZXN1bHQgPSB7IC4uLnIgfTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2lucHV0JywgJ291dHB1dCcsICdtZXRhZGF0YScsICdlcnJvciddKSB7XG4gICAgcmVzdWx0W2tleV0gPSB0b0Rpc3BsYXlNYXJrZXIocmVzdWx0W2tleV0pO1xuICB9XG5cbiAgaWYgKHJlc3VsdC5ldmVudERhdGEgJiYgdHlwZW9mIHJlc3VsdC5ldmVudERhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXZlbnRUeXBlID1cbiAgICAgIHR5cGVvZiByZXN1bHQuZXZlbnRUeXBlID09PSAnc3RyaW5nJyA/IHJlc3VsdC5ldmVudFR5cGUgOiAnJztcbiAgICBjb25zdCByZWZLZXlzID0gZ2V0RXZlbnREYXRhUmVmRmllbGRzKGV2ZW50VHlwZSk7XG4gICAgY29uc3QgZWQgPSB7IC4uLihyZXN1bHQuZXZlbnREYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlZktleXMpIHtcbiAgICAgIGlmIChrZXkgaW4gZWQpIHtcbiAgICAgICAgZWRba2V5XSA9IHRvRGlzcGxheU1hcmtlcihlZFtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LmV2ZW50RGF0YSA9IGVkO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdCBhcyBUO1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgcmVzb3VyY2UgZGF0YSB3aXRoIGRlY3J5cHRpb24gc3VwcG9ydC5cbiAqXG4gKiBXaGVuIGEga2V5IGlzIHByb3ZpZGVkLCBlbmNyeXB0ZWQgZmllbGRzIGFyZSBkZWNyeXB0ZWQgYmVmb3JlIGh5ZHJhdGlvbi5cbiAqIFRoaXMgaXMgdGhlIGFzeW5jIHZlcnNpb24gdXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBcIkRlY3J5cHRcIiBpbiB0aGUgd2ViIFVJLlxuICpcbiAqIEhhbmRsZXMgYm90aCB0b3AtbGV2ZWwgZmllbGRzIChpbnB1dCwgb3V0cHV0LCBtZXRhZGF0YSkgYW5kIG5lc3RlZCBldmVudERhdGFcbiAqIHBheWxvYWQgZmllbGRzIGZvciB0aGF0IGV2ZW50IHR5cGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlUmVzb3VyY2VJT1dpdGhLZXk8VD4oXG4gIHJlc291cmNlOiBULFxuICBrZXk6IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gaHlkcmF0ZVJlc291cmNlSU9Bc3luYyhyZXNvdXJjZSwga2V5KTtcbn1cblxuLyoqXG4gKiBBc3luYyBoeWRyYXRpb24gZm9yIHdlYiBkaXNwbGF5LlxuICpcbiAqIFRoaXMgZm9sbG93cyB0aGUgc2FtZSByZXNvdXJjZS1maWVsZCBtYXBwaW5nIGFzIHtAbGluayBoeWRyYXRlUmVzb3VyY2VJT30sXG4gKiBidXQgY2FuIGFsc28gaW5mbGF0ZSBjb21wcmVzc2VkIGJyb3dzZXIgcGF5bG9hZHMgdGhyb3VnaCB0aGUgcmVnaXN0ZXJlZFxuICogenN0ZCBXQVNNIGRlY29kZXIuIFdoZW4gYSBrZXkgaXMgcHJvdmlkZWQsIGVuY3J5cHRlZCBmaWVsZHMgYXJlIGRlY3J5cHRlZFxuICogZmlyc3QgYW5kIHRoZW4gaW5mbGF0ZWQvaHlkcmF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlUmVzb3VyY2VJT0FzeW5jPFQ+KFxuICByZXNvdXJjZTogVCxcbiAga2V5PzogVWludDhBcnJheVxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHsgaHlkcmF0ZURhdGFXaXRoS2V5LCBkZXJpdmVSdW5QYXlsb2FkS2V5cyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICdAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uLWZvcm1hdCdcbiAgKTtcbiAgLy8gUGF5bG9hZHMgbWF5IGJlIHpzdGQtY29tcHJlc3NlZCAodGhlIFdlYiBEZWNvbXByZXNzaW9uU3RyZWFtIGhhcyBubyB6c3RkKTtcbiAgLy8gcmVnaXN0ZXIgdGhlIFdBU00tYmFja2VkIGJyb3dzZXIgZGVjb2RlciBiZWZvcmUgaHlkcmF0aW5nLiBJZGVtcG90ZW50IGFuZFxuICAvLyBsYXp5IOKAlCB0aGUgV0FTTSBpcyBvbmx5IGNvbXBpbGVkIHdoZW4gYSB6c3RkIHBheWxvYWQgaXMgYWN0dWFsbHkgZGVjb2RlZC5cbiAgY29uc3QgeyBlbnN1cmVac3RkRGVjb2RlclJlZ2lzdGVyZWQgfSA9IGF3YWl0IGltcG9ydChcbiAgICAnLi96c3RkLWJyb3dzZXItZGVjb2Rlci5qcydcbiAgKTtcbiAgZW5zdXJlWnN0ZERlY29kZXJSZWdpc3RlcmVkKCk7XG4gIC8vIFJlc29sdmUgdGhlICpmdWxsKiBrZXkgY2FwYWJpbGl0eSwgbm90IGp1c3QgdGhlIHN5bW1ldHJpYyBrZXk6IGEgcnVuJ3NcbiAgLy8gZXZlbnQgbG9nIGNhbiBjb250YWluIHNlYWxlZCAoJ2VuY3AnKSBwYXlsb2FkcyB0aGF0IGFub3RoZXIgcnVuIHdyb3RlIHRvXG4gIC8vIGl0IChhIGNyb3NzLWRlcGxveW1lbnQgaG9vayByZXN1bXB0aW9uLCBzYXkpLCBhbmQgb3BlbmluZyB0aG9zZSBuZWVkcyB0aGVcbiAgLy8gcnVuJ3MgWDI1NTE5IHNjYWxhciBpbiBhZGRpdGlvbiB0byBpdHMgQUVTIGtleS4gQm90aCBhcmUgZGVyaXZlZCBmcm9tIHRoZVxuICAvLyBzYW1lIDMyIGJ5dGVzIHRoZSBrZXktcmV0cmlldmFsIGVuZHBvaW50IHJldHVybnMuXG4gIC8vIFJlc29sdmUgdGhlICpmdWxsKiBrZXkgY2FwYWJpbGl0eSwgbm90IGp1c3QgdGhlIHN5bW1ldHJpYyBrZXk6IGEgcnVuJ3NcbiAgLy8gZXZlbnQgbG9nIGNhbiBjb250YWluIHNlYWxlZCAoJ2VuY3AnKSBwYXlsb2FkcyB0aGF0IGFub3RoZXIgcnVuIHdyb3RlIHRvXG4gIC8vIGl0IChhIGNyb3NzLWRlcGxveW1lbnQgaG9vayByZXN1bXB0aW9uLCBzYXkpLCBhbmQgb3BlbmluZyB0aG9zZSBuZWVkcyB0aGVcbiAgLy8gcnVuJ3MgWDI1NTE5IHNjYWxhciBpbiBhZGRpdGlvbiB0byBpdHMgQUVTIGtleS4gQm90aCBkZXJpdmUgZnJvbSB0aGUgc2FtZVxuICAvLyAzMiBieXRlcyB0aGUga2V5LXJldHJpZXZhbCBlbmRwb2ludCByZXR1cm5zLlxuICBjb25zdCBjcnlwdG9LZXkgPSBrZXkgPyBhd2FpdCBkZXJpdmVSdW5QYXlsb2FkS2V5cyhrZXkpIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXZpdmVycyA9IGdldFJldml2ZXJzKCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZUZpZWxkKHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgLy8gQWxyZWFkeS1oeWRyYXRlZDogZW5jcnlwdGVkIG1hcmtlciB3aXRoIHN0b3JlZCBieXRlc1xuICAgIGlmIChpc0VuY3J5cHRlZE1hcmtlcih2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHJhdyA9ICh2YWx1ZSBhcyBhbnkpLl9fZW5jcnlwdGVkRGF0YSBhcyBVaW50OEFycmF5O1xuICAgICAgcmV0dXJuIGNyeXB0b0tleSA/IGh5ZHJhdGVEYXRhV2l0aEtleShyYXcsIHJldml2ZXJzLCBjcnlwdG9LZXkpIDogdmFsdWU7XG4gICAgfVxuICAgIC8vIFJhdyBVaW50OEFycmF5OiBtYXkgYmUgZW5jcnlwdGVkLCBjb21wcmVzc2VkLCBvciBwbGFpbiBkZXZhbHVlLlxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgIHJldHVybiBoeWRyYXRlRGF0YVdpdGhLZXkodmFsdWUsIHJldml2ZXJzLCBjcnlwdG9LZXkpO1xuICAgIH1cbiAgICAvLyBOb3Qgc2VyaWFsaXplZCDigJQgcmV0dXJuIGFzLWlzLlxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHIgPSByZXNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5yIH07XG5cbiAgLy8gRGVjcnlwdCArIGh5ZHJhdGUgdG9wLWxldmVsIHNlcmlhbGl6ZWQgZmllbGRzIChydW5zLCBzdGVwcywgaG9va3MpXG4gIGZvciAoY29uc3QgZmllbGQgb2YgWydpbnB1dCcsICdvdXRwdXQnLCAnbWV0YWRhdGEnLCAnZXJyb3InXSkge1xuICAgIGlmIChmaWVsZCBpbiByZXN1bHQpIHtcbiAgICAgIHJlc3VsdFtmaWVsZF0gPSBhd2FpdCBoeWRyYXRlRmllbGQocmVzdWx0W2ZpZWxkXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSHlkcmF0ZSBldmVudERhdGEgc3ViZmllbGRzIChldmVudHMpXG4gIGlmIChyZXN1bHQuZXZlbnREYXRhICYmIHR5cGVvZiByZXN1bHQuZXZlbnREYXRhID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IGV2ZW50VHlwZSA9XG4gICAgICB0eXBlb2YgcmVzdWx0LmV2ZW50VHlwZSA9PT0gJ3N0cmluZycgPyByZXN1bHQuZXZlbnRUeXBlIDogJyc7XG4gICAgY29uc3QgcmVmS2V5cyA9IGdldEV2ZW50RGF0YVJlZkZpZWxkcyhldmVudFR5cGUpO1xuICAgIGNvbnN0IGV2ZW50RGF0YSA9IHsgLi4uKHJlc3VsdC5ldmVudERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiByZWZLZXlzKSB7XG4gICAgICBpZiAoZmllbGQgaW4gZXZlbnREYXRhKSB7XG4gICAgICAgIGV2ZW50RGF0YVtmaWVsZF0gPSBhd2FpdCBoeWRyYXRlRmllbGQoZXZlbnREYXRhW2ZpZWxkXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5ldmVudERhdGEgPSBldmVudERhdGE7XG4gIH1cblxuICByZXR1cm4gcmVwbGFjZUVuY3J5cHRlZEFuZEV4cGlyZWRXaXRoTWFya2VycyhyZXN1bHQgYXMgVCk7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhIGh5ZHJhdGVkIHJlc291cmNlIChldmVudCwgc3RlcCwgcnVuLCBldGMuKSBjb250YWlucyBhbnlcbiAqIGVuY3J5cHRlZCBkaXNwbGF5IG1hcmtlcnMuIEluc3BlY3RzIHRoZSBzdGFuZGFyZCB0b3AtbGV2ZWwgZmllbGRzXG4gKiAoYGlucHV0YCwgYG91dHB1dGAsIGBlcnJvcmAsIGBtZXRhZGF0YWApIGFzIHdlbGwgYXMgdGhlIGV2ZW50LXR5cGUtc3BlY2lmaWNcbiAqIGBldmVudERhdGFgIHJlZiBmaWVsZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbmNyeXB0ZWRGaWVsZHMocmVzb3VyY2U6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFyZXNvdXJjZSB8fCB0eXBlb2YgcmVzb3VyY2UgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHIgPSByZXNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2lucHV0JywgJ291dHB1dCcsICdtZXRhZGF0YScsICdlcnJvciddKSB7XG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHJba2V5XSkpIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHIuZXZlbnREYXRhICYmIHR5cGVvZiByLmV2ZW50RGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBldmVudFR5cGUgPSB0eXBlb2Ygci5ldmVudFR5cGUgPT09ICdzdHJpbmcnID8gci5ldmVudFR5cGUgOiAnJztcbiAgICBjb25zdCByZWZLZXlzID0gZ2V0RXZlbnREYXRhUmVmRmllbGRzKGV2ZW50VHlwZSk7XG4gICAgY29uc3QgZWQgPSByLmV2ZW50RGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZWZLZXlzKSB7XG4gICAgICBpZiAoa2V5IGluIGVkICYmIGlzRW5jcnlwdGVkTWFya2VyKGVkW2tleV0pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workflow/web-shared",
|
|
3
3
|
"description": "Shared components for Workflow Observability UI",
|
|
4
|
-
"version": "5.0.0-beta.
|
|
4
|
+
"version": "5.0.0-beta.38",
|
|
5
5
|
"private": false,
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
@@ -55,9 +55,9 @@
|
|
|
55
55
|
"streamdown": "2.3.0",
|
|
56
56
|
"tailwind-merge": "3.5.0",
|
|
57
57
|
"tailwindcss": "4",
|
|
58
|
-
"@workflow/core": "5.0.0-beta.
|
|
59
|
-
"@workflow/utils": "5.0.0-beta.
|
|
60
|
-
"@workflow/world": "5.0.0-beta.
|
|
58
|
+
"@workflow/core": "5.0.0-beta.38",
|
|
59
|
+
"@workflow/utils": "5.0.0-beta.8",
|
|
60
|
+
"@workflow/world": "5.0.0-beta.23"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"@biomejs/biome": "^2.4.4",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"ai": "6.0.116",
|
|
68
68
|
"typescript": "^6.0.3",
|
|
69
69
|
"vitest": "^4.1.10",
|
|
70
|
-
"@workflow/errors": "5.0.0-beta.
|
|
70
|
+
"@workflow/errors": "5.0.0-beta.14",
|
|
71
71
|
"@workflow/tsconfig": "5.0.0-beta.0"
|
|
72
72
|
},
|
|
73
73
|
"scripts": {
|
package/src/components/index.ts
CHANGED
|
@@ -29,6 +29,7 @@ export type {
|
|
|
29
29
|
FetchSpanDetail,
|
|
30
30
|
} from './sidebar/use-selected-span-detail';
|
|
31
31
|
export { type StreamChunk, StreamViewer } from './stream-viewer';
|
|
32
|
+
export { StreamViewerSkeleton } from './stream-viewer-skeleton';
|
|
32
33
|
export type { Span, SpanEvent } from './trace-viewer/types';
|
|
33
34
|
export { NewTraceViewer } from './trace-viewer-new';
|
|
34
35
|
export {
|
|
@@ -213,8 +213,8 @@ function NewTraceViewerContent({
|
|
|
213
213
|
|
|
214
214
|
const viewDuration = viewport.end - viewport.start;
|
|
215
215
|
|
|
216
|
-
// Keep a ref to the live viewport so
|
|
217
|
-
//
|
|
216
|
+
// Keep a ref to the live viewport so zoom callbacks can read the current
|
|
217
|
+
// range without being recreated on every pan (which would bust TimelineBar's
|
|
218
218
|
// memo and re-render every row each animation frame).
|
|
219
219
|
const viewportRef = useRef(viewport);
|
|
220
220
|
viewportRef.current = viewport;
|
|
@@ -254,19 +254,17 @@ function NewTraceViewerContent({
|
|
|
254
254
|
|
|
255
255
|
const zoomBy = useCallback(
|
|
256
256
|
(factor: number) => {
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
);
|
|
263
|
-
return clampToRoot({
|
|
257
|
+
const { start, end } = viewportRef.current;
|
|
258
|
+
const center = (start + end) / 2;
|
|
259
|
+
const newDuration = Math.max(MIN_VIEWPORT_MS, (end - start) * factor);
|
|
260
|
+
animateTo(
|
|
261
|
+
clampToRoot({
|
|
264
262
|
start: center - newDuration / 2,
|
|
265
263
|
end: center + newDuration / 2,
|
|
266
|
-
})
|
|
267
|
-
|
|
264
|
+
})
|
|
265
|
+
);
|
|
268
266
|
},
|
|
269
|
-
[
|
|
267
|
+
[animateTo, clampToRoot]
|
|
270
268
|
);
|
|
271
269
|
|
|
272
270
|
const zoomIn = useCallback(() => zoomBy(ZOOM_FACTOR), [zoomBy]);
|
|
@@ -417,6 +417,8 @@ const attributeToDisplayFn: Record<
|
|
|
417
417
|
receivedCount: (value: unknown) => String(value),
|
|
418
418
|
lastReceivedAt: localMillisecondTimeOrNull,
|
|
419
419
|
disposedAt: localMillisecondTimeOrNull,
|
|
420
|
+
// Internal resume plumbing — not surfaced in the UI
|
|
421
|
+
resumeContext: (_value: unknown) => null,
|
|
420
422
|
// Event details
|
|
421
423
|
eventType: (value: unknown) => String(value),
|
|
422
424
|
correlationId: (value: unknown) => String(value),
|
|
@@ -638,6 +640,10 @@ const attributeToDisplayFn: Record<
|
|
|
638
640
|
if (typeof value !== 'string' || value.length === 0) return null;
|
|
639
641
|
return String(value);
|
|
640
642
|
},
|
|
643
|
+
// Internal encryption plumbing: the run's X25519 public key, used by
|
|
644
|
+
// cross-run writers to seal payloads to this run. Not actionable for users
|
|
645
|
+
// and not secret — hidden rather than rendered as 44 opaque base64 chars.
|
|
646
|
+
encryptionPublicKey: (_value: unknown) => null,
|
|
641
647
|
};
|
|
642
648
|
|
|
643
649
|
const resolvableAttributes = [
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Skeleton } from './ui/skeleton';
|
|
2
|
+
|
|
3
|
+
const STREAM_SKELETON_ROWS = [
|
|
4
|
+
{ id: 'stream-skeleton-row-1', width: '72%' },
|
|
5
|
+
{ id: 'stream-skeleton-row-2', width: '58%' },
|
|
6
|
+
{ id: 'stream-skeleton-row-3', width: '80%' },
|
|
7
|
+
{ id: 'stream-skeleton-row-4', width: '64%' },
|
|
8
|
+
];
|
|
9
|
+
|
|
10
|
+
export function StreamViewerSkeleton() {
|
|
11
|
+
return (
|
|
12
|
+
<output
|
|
13
|
+
aria-busy="true"
|
|
14
|
+
aria-label="Loading stream"
|
|
15
|
+
className="flex h-full min-h-0 w-full flex-col overflow-hidden bg-background-100"
|
|
16
|
+
>
|
|
17
|
+
<span className="sr-only">Loading stream…</span>
|
|
18
|
+
<div className="flex h-10 min-h-10 items-center border-b border-gray-alpha-400 px-3">
|
|
19
|
+
<Skeleton className="h-3 w-10" />
|
|
20
|
+
</div>
|
|
21
|
+
<div className="flex flex-col">
|
|
22
|
+
{STREAM_SKELETON_ROWS.map((row) => (
|
|
23
|
+
<div
|
|
24
|
+
key={row.id}
|
|
25
|
+
className="flex h-10 items-center gap-2 border-b border-gray-alpha-400 px-3"
|
|
26
|
+
>
|
|
27
|
+
<Skeleton className="h-3" style={{ width: row.width }} />
|
|
28
|
+
<Skeleton className="h-4 w-4 shrink-0 rounded-sm" />
|
|
29
|
+
</div>
|
|
30
|
+
))}
|
|
31
|
+
</div>
|
|
32
|
+
</output>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
import React, { useEffect, useRef } from 'react';
|
|
4
4
|
import { Virtuoso, type VirtuosoHandle } from 'react-virtuoso';
|
|
5
|
+
import { CopyButton } from './new-trace-viewer/components/copy-button';
|
|
6
|
+
import { serializeForClipboard } from './sidebar/copyable-data-block';
|
|
7
|
+
import { StreamViewerSkeleton } from './stream-viewer-skeleton';
|
|
5
8
|
import { DataInspector } from './ui/data-inspector';
|
|
6
|
-
import { Skeleton } from './ui/skeleton';
|
|
7
9
|
|
|
8
10
|
// ──────────────────────────────────────────────────────────────────────────
|
|
9
11
|
// Types
|
|
@@ -23,7 +25,7 @@ interface StreamViewerProps {
|
|
|
23
25
|
error?: string | null;
|
|
24
26
|
/** True while the initial stream connection is being established */
|
|
25
27
|
isLoading?: boolean;
|
|
26
|
-
/** Called when the user scrolls near the
|
|
28
|
+
/** Called when the user scrolls near the rendered end. */
|
|
27
29
|
onScrollEnd?: () => void;
|
|
28
30
|
}
|
|
29
31
|
|
|
@@ -31,60 +33,27 @@ interface StreamViewerProps {
|
|
|
31
33
|
// Chunk row — memoized to prevent remounts during polling
|
|
32
34
|
// ──────────────────────────────────────────────────────────────────────────
|
|
33
35
|
|
|
34
|
-
const ChunkRow = React.memo(function ChunkRow({
|
|
35
|
-
chunk,
|
|
36
|
-
index,
|
|
37
|
-
}: {
|
|
38
|
-
chunk: Chunk;
|
|
39
|
-
index: number;
|
|
40
|
-
}) {
|
|
36
|
+
const ChunkRow = React.memo(function ChunkRow({ chunk }: { chunk: Chunk }) {
|
|
41
37
|
return (
|
|
42
|
-
<div
|
|
43
|
-
className="
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
className="select-none pt-px"
|
|
52
|
-
style={{ color: 'var(--ds-gray-500)' }}
|
|
53
|
-
>
|
|
54
|
-
[{index}]
|
|
55
|
-
</span>
|
|
56
|
-
<div className="min-w-0 flex-1">
|
|
57
|
-
{typeof chunk.value === 'string' ? (
|
|
58
|
-
<span
|
|
59
|
-
className="whitespace-pre-wrap break-words"
|
|
60
|
-
style={{ color: 'var(--ds-gray-1000)' }}
|
|
61
|
-
>
|
|
62
|
-
{chunk.value}
|
|
63
|
-
</span>
|
|
64
|
-
) : (
|
|
65
|
-
<DataInspector data={chunk.value} expandLevel={1} />
|
|
66
|
-
)}
|
|
67
|
-
</div>
|
|
38
|
+
<div className="flex w-full items-start gap-1 border-b border-gray-alpha-400 px-3 py-2">
|
|
39
|
+
<div className="min-w-0 flex-1">
|
|
40
|
+
{typeof chunk.value === 'string' ? (
|
|
41
|
+
<span className="whitespace-pre-wrap break-words text-label-12 font-mono text-gray-1000">
|
|
42
|
+
{chunk.value}
|
|
43
|
+
</span>
|
|
44
|
+
) : (
|
|
45
|
+
<DataInspector data={chunk.value} expandLevel={1} />
|
|
46
|
+
)}
|
|
68
47
|
</div>
|
|
48
|
+
<CopyButton
|
|
49
|
+
copyText={serializeForClipboard(chunk.value)}
|
|
50
|
+
ariaLabel="Copy chunk"
|
|
51
|
+
className="shrink-0 -mr-1 [&>div]:h-4 [&>div]:w-4 [&_svg]:h-4 [&_svg]:w-4"
|
|
52
|
+
/>
|
|
69
53
|
</div>
|
|
70
54
|
);
|
|
71
55
|
});
|
|
72
56
|
|
|
73
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
74
|
-
// Skeleton loading
|
|
75
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
76
|
-
|
|
77
|
-
function StreamSkeleton() {
|
|
78
|
-
return (
|
|
79
|
-
<div className="flex flex-col gap-3 animate-in fade-in">
|
|
80
|
-
<Skeleton style={{ width: 120, height: 16, borderRadius: 4 }} />
|
|
81
|
-
{[1, 2, 3, 4].map((i) => (
|
|
82
|
-
<Skeleton key={i} style={{ height: 56, borderRadius: 6 }} />
|
|
83
|
-
))}
|
|
84
|
-
</div>
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
57
|
// ──────────────────────────────────────────────────────────────────────────
|
|
89
58
|
// Main component
|
|
90
59
|
// ──────────────────────────────────────────────────────────────────────────
|
|
@@ -105,7 +74,6 @@ export function StreamViewer({
|
|
|
105
74
|
const virtuosoRef = useRef<VirtuosoHandle>(null);
|
|
106
75
|
const prevChunkCountRef = useRef(0);
|
|
107
76
|
|
|
108
|
-
// Auto-scroll to bottom when new chunks arrive (live streaming)
|
|
109
77
|
useEffect(() => {
|
|
110
78
|
if (chunks.length > prevChunkCountRef.current && chunks.length > 0) {
|
|
111
79
|
virtuosoRef.current?.scrollToIndex({
|
|
@@ -116,71 +84,31 @@ export function StreamViewer({
|
|
|
116
84
|
prevChunkCountRef.current = chunks.length;
|
|
117
85
|
}, [chunks.length]);
|
|
118
86
|
|
|
119
|
-
// Show skeleton when loading and no chunks have arrived yet
|
|
120
87
|
if (isLoading && chunks.length === 0) {
|
|
121
|
-
return
|
|
122
|
-
<div className="flex flex-col h-full">
|
|
123
|
-
<StreamSkeleton />
|
|
124
|
-
</div>
|
|
125
|
-
);
|
|
88
|
+
return <StreamViewerSkeleton />;
|
|
126
89
|
}
|
|
127
90
|
|
|
128
91
|
return (
|
|
129
|
-
<div className="flex flex-col
|
|
130
|
-
{/*
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
className="inline-block
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
</span>
|
|
140
|
-
</div>
|
|
141
|
-
)}
|
|
142
|
-
|
|
143
|
-
{/* Header */}
|
|
144
|
-
{chunks.length > 0 && (
|
|
145
|
-
<div className="flex items-center gap-2 mb-2 px-1">
|
|
146
|
-
<span
|
|
147
|
-
className="text-[13px] font-medium"
|
|
148
|
-
style={{ color: 'var(--ds-gray-900)' }}
|
|
149
|
-
>
|
|
150
|
-
Stream Chunks
|
|
151
|
-
</span>
|
|
152
|
-
<span
|
|
153
|
-
className="text-xs tabular-nums"
|
|
154
|
-
style={{ color: 'var(--ds-gray-600)' }}
|
|
155
|
-
>
|
|
156
|
-
({chunks.length})
|
|
157
|
-
</span>
|
|
158
|
-
</div>
|
|
159
|
-
)}
|
|
92
|
+
<div className="flex h-full w-full flex-col overflow-hidden bg-background-100">
|
|
93
|
+
{/* Status header */}
|
|
94
|
+
<div className="flex h-10 min-h-10 items-center gap-1.5 border-b border-gray-alpha-400 px-3">
|
|
95
|
+
{isLive && (
|
|
96
|
+
<>
|
|
97
|
+
<span className="inline-block h-2 w-2 rounded-full bg-green-600" />
|
|
98
|
+
<span className="text-label-12 text-green-700">Live</span>
|
|
99
|
+
</>
|
|
100
|
+
)}
|
|
101
|
+
</div>
|
|
160
102
|
|
|
161
103
|
{/* Content */}
|
|
162
104
|
<div className="flex-1 min-h-0">
|
|
163
105
|
{error ? (
|
|
164
|
-
<div
|
|
165
|
-
className="text-[11px] rounded-md border p-3"
|
|
166
|
-
style={{
|
|
167
|
-
borderColor: 'var(--ds-red-300)',
|
|
168
|
-
backgroundColor: 'var(--ds-red-100)',
|
|
169
|
-
color: 'var(--ds-red-700)',
|
|
170
|
-
}}
|
|
171
|
-
>
|
|
106
|
+
<div className="border-b border-red-400 bg-red-100 px-3 py-2 text-label-12 text-red-900">
|
|
172
107
|
<div>Error reading stream:</div>
|
|
173
108
|
<div>{error}</div>
|
|
174
109
|
</div>
|
|
175
110
|
) : chunks.length === 0 ? (
|
|
176
|
-
<div
|
|
177
|
-
className="text-[11px] rounded-md border p-3"
|
|
178
|
-
style={{
|
|
179
|
-
borderColor: 'var(--ds-gray-300)',
|
|
180
|
-
backgroundColor: 'var(--ds-gray-100)',
|
|
181
|
-
color: 'var(--ds-gray-600)',
|
|
182
|
-
}}
|
|
183
|
-
>
|
|
111
|
+
<div className="flex h-10 items-center border-b border-gray-alpha-400 bg-background-200 px-3 text-label-12 text-gray-900">
|
|
184
112
|
{isLive ? 'Waiting for stream data...' : 'Stream is empty'}
|
|
185
113
|
</div>
|
|
186
114
|
) : (
|
|
@@ -190,8 +118,8 @@ export function StreamViewer({
|
|
|
190
118
|
overscan={10}
|
|
191
119
|
endReached={() => onScrollEnd?.()}
|
|
192
120
|
itemContent={(index) => (
|
|
193
|
-
<div
|
|
194
|
-
<ChunkRow chunk={chunks[index]}
|
|
121
|
+
<div className="w-full">
|
|
122
|
+
<ChunkRow chunk={chunks[index]} />
|
|
195
123
|
</div>
|
|
196
124
|
)}
|
|
197
125
|
style={{ flex: 1, minHeight: 0 }}
|