@pipeline-builder/api-core 4.1.2 → 4.1.3
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/lib/services/audit-spool.d.ts +2 -3
- package/lib/services/audit-spool.js +3 -4
- package/lib/services/cache-service.d.ts +59 -0
- package/lib/services/cache-service.js +165 -16
- package/lib/services/durable-event-bus.js +15 -5
- package/lib/services/env-redis.d.ts +85 -33
- package/lib/services/env-redis.js +154 -74
- package/lib/services/leader-lock.d.ts +6 -3
- package/lib/services/leader-lock.js +20 -5
- package/lib/services/quota.d.ts +44 -10
- package/lib/services/quota.js +85 -49
- package/lib/services/sse-ticket-store.d.ts +1 -1
- package/lib/services/sse-ticket-store.js +2 -2
- package/lib/services/token-revocation.d.ts +1 -1
- package/lib/services/token-revocation.js +5 -5
- package/package.json +1 -1
|
@@ -67,10 +67,9 @@ export declare function createRedisAuditSpool(redis: RedisListClient, opts?: {
|
|
|
67
67
|
key?: string;
|
|
68
68
|
}): AuditSpool;
|
|
69
69
|
/**
|
|
70
|
-
* Build a Redis-backed audit spool from the ambient `REDIS_URL` / `
|
|
70
|
+
* Build a Redis-backed audit spool from the ambient `REDIS_URL` / `REDIS_SENTINELS`
|
|
71
71
|
* env via the shared `createEnvRedisClient`. Returns `null` when Redis is not
|
|
72
|
-
* configured
|
|
73
|
-
* spool (pre-spool best-effort behavior), never crashing. The shared helper loads
|
|
72
|
+
* configured — the caller then runs without a spool (best-effort behavior). The shared helper loads
|
|
74
73
|
* ioredis via `createRequire`, so this stays importable where Redis isn't present.
|
|
75
74
|
*/
|
|
76
75
|
export declare function createEnvRedisAuditSpool(opts?: {
|
|
@@ -156,10 +156,9 @@ export function createRedisAuditSpool(redis, opts = {}) {
|
|
|
156
156
|
};
|
|
157
157
|
}
|
|
158
158
|
/**
|
|
159
|
-
* Build a Redis-backed audit spool from the ambient `REDIS_URL` / `
|
|
159
|
+
* Build a Redis-backed audit spool from the ambient `REDIS_URL` / `REDIS_SENTINELS`
|
|
160
160
|
* env via the shared `createEnvRedisClient`. Returns `null` when Redis is not
|
|
161
|
-
* configured
|
|
162
|
-
* spool (pre-spool best-effort behavior), never crashing. The shared helper loads
|
|
161
|
+
* configured — the caller then runs without a spool (best-effort behavior). The shared helper loads
|
|
163
162
|
* ioredis via `createRequire`, so this stays importable where Redis isn't present.
|
|
164
163
|
*/
|
|
165
164
|
export function createEnvRedisAuditSpool(opts = {}) {
|
|
@@ -169,4 +168,4 @@ export function createEnvRedisAuditSpool(opts = {}) {
|
|
|
169
168
|
logger.info('Redis audit spool initialized');
|
|
170
169
|
return createRedisAuditSpool(inst, opts);
|
|
171
170
|
}
|
|
172
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtc3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvYXVkaXQtc3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQStEM0MsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUM7QUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFDakMsb0ZBQW9GO0FBQ3BGLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDO0FBRXBDLFNBQVMsTUFBTSxDQUFDLEdBQVk7SUFDMUIsT0FBTyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEdBQVc7SUFDNUIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQW9CLENBQUM7UUFDbEQsT0FBTyxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN0RSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLEtBQXNCLEVBQ3RCLElBQUksR0FBd0Ms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LENBQUM7Z0JBQ0QsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2xCLFdBQVcsQ0FBQyw2QkFBNkIsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQzFELE1BQU0sQ0FBQyxJQUFJLENBQUMsbURBQW1ELEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRixDQUFDO2dCQUNELE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbEUsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztRQUVELEtBQUssQ0FBQyxLQUFLO1lBQ1QsSUFBSSxDQUFDO2dCQUNILE9BQU8sTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLElBQUksR0FBd0MsRUFBRTtJQUNyRixNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBa0IsYUFBYSxDQUFDLENBQUM7SUFDbEUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDN0MsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0NsaWVudCB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVtb3RlQXVkaXRFdmVudCB9IGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignYXVkaXQtc3Bvb2wnKTtcblxuLyoqIEEgYnVmZmVyZWQgZW1pc3Npb246IHRoZSBldmVudCBwbHVzIHdoaWNoIHNlcnZpY2UgbXVzdCByZS1kZWxpdmVyIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdWRpdFNwb29sRW50cnkge1xuICBldmVudDogUmVtb3RlQXVkaXRFdmVudDtcbiAgc2VydmljZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEdXJhYmxlIGJ1ZmZlciBmb3IgYXVkaXQgZXZlbnRzIHRoYXQgZmFpbGVkIExJVkUgZGVsaXZlcnkgdG8gdGhlIHBsYXRmb3JtXG4gKiAocmV0cmllcyBleGhhdXN0ZWQgZHVyaW5nIGEgc3VzdGFpbmVkIG91dGFnZSkuIFdpdGhvdXQgdGhpcywgdGhlIGF1ZGl0IHRyYWlsIOKAlFxuICogYSBzZWN1cml0eSBsb2cg4oCUIGlzIHNpbGVudGx5IGxvc3QgdGhlIG1vbWVudCB0aGUgcGxhdGZvcm0gaXMgZG93biBmb3IgbG9uZ2VyXG4gKiB0aGFuIHRoZSBjbGllbnQncyBzbWFsbCByZXRyeSBidWRnZXQuXG4gKlxuICogQ29udHJhY3Q6XG4gKiAtIEJPVU5ERUQuIEEgc2VjdXJpdHkgbG9nIG11c3QgZGVncmFkZSB0byBcImRyb3BwZWQgdGhlIG9sZGVzdCwgbG91ZGx5XCIgKGFcbiAqICAgbWV0cmljKSByYXRoZXIgdGhhbiBncm93IHdpdGhvdXQgbGltaXQgYW5kIE9PTSB0aGUgZW1pdHRlci5cbiAqIC0gRkFJTC1TQUZFLiBFdmVyeSBtZXRob2Qgc3dhbGxvd3MgaXRzIG93biBlcnJvcnMg4oCUIGEgYnJva2VuL3VucmVhY2hhYmxlIHNwb29sXG4gKiAgIG11c3QgbmV2ZXIgYnJlYWsgb3IgYmxvY2sgdGhlIGF1ZGl0IGVtaXNzaW9uIHBhdGggKHdoaWNoIGlzIGl0c2VsZlxuICogICBmaXJlLWFuZC1mb3JnZXQpLiBBIHNwb29sIHByb2JsZW0gZGVncmFkZXMgdG8gdGhlIHByZS1zcG9vbCBiZWhhdmlvci5cbiAqIC0gT3JkZXJpbmcgaXMgYmVzdC1lZmZvcnQuIFJlLWRlbGl2ZXJlZCBldmVudHMgY2hhaW4gYXQgcmUtZGVsaXZlcnkgdGltZVxuICogICAodGhhdCdzIHdoZW4gdGhlIHBsYXRmb3JtIGluc2VydHMgdGhlbSksIHNvIGVhY2ggZXZlbnQgYWxzbyBjYXJyaWVzIGFuXG4gKiAgIGBvY2N1cnJlZEF0YCBzdGFtcGVkIGF0IGVtaXNzaW9uIGZvciByZXZpZXdlcnMg4oCUIHNlZSBSZW1vdGVBdWRpdEV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0U3Bvb2wge1xuICAvKiogQnVmZmVyIGFuIGV2ZW50IHRoYXQgZmFpbGVkIGxpdmUgZGVsaXZlcnkuICovXG4gIGVucXVldWUoZW50cnk6IEF1ZGl0U3Bvb2xFbnRyeSk6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IE1PVkUgdXAgdG8gYG1heGAgYnVmZmVyZWQgZW50cmllcyBvbnRvIGFuIGluLXByb2dyZXNzIGxpc3QgYW5kXG4gICAqIHJldHVybiB0aGVtLiBCZWNhdXNlIHRoZSBlbnRyaWVzIGFyZSBtb3ZlZCAobm90IHBvcHBlZC1hbmQtZHJvcHBlZCksIGEgY3Jhc2hcbiAgICogbWlkLWRyYWluIGxlYXZlcyB0aGVtIHJlY292ZXJhYmxlIG9uIHRoZSBpbi1wcm9ncmVzcyBsaXN0IOKAlCBzZWUgYHJlY292ZXJgLlxuICAgKiBFYWNoIHRha2VuIGVudHJ5IE1VU1QgYmUgcmVzb2x2ZWQgd2l0aCBleGFjdGx5IG9uZSBvZiBgYWNrYCAoZGVsaXZlcmVkKSBvclxuICAgKiBgcmVxdWV1ZWAgKHN0aWxsIGZhaWxpbmcpLCBvciBpdCBsaW5nZXJzIG9uIHRoZSBpbi1wcm9ncmVzcyBsaXN0IHVudGlsIHRoZVxuICAgKiBuZXh0IGByZWNvdmVyYC5cbiAgICovXG4gIHRha2UobWF4OiBudW1iZXIpOiBQcm9taXNlPEF1ZGl0U3Bvb2xFbnRyeVtdPjtcbiAgLyoqIEFja25vd2xlZGdlIHN1Y2Nlc3NmdWxseSByZS1kZWxpdmVyZWQgZW50cmllcyDigJQgcmVtb3ZlcyB0aGVtIGZyb20gdGhlXG4gICAqICBpbi1wcm9ncmVzcyBsaXN0IHNvIHRoZXkgYXJlIG5vdCByZWNvdmVyZWQgYWdhaW4uICovXG4gIGFjayhlbnRyaWVzOiBBdWRpdFNwb29sRW50cnlbXSk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSZXR1cm4gZW50cmllcyB3aG9zZSByZS1kZWxpdmVyeSBmYWlsZWQgdG8gdGhlIEhFQUQgb2YgdGhlIGJ1ZmZlciAocmV0cmllZFxuICAgKiAgZmlyc3QpIGFuZCBjbGVhciB0aGVtIGZyb20gdGhlIGluLXByb2dyZXNzIGxpc3QuIEJlc3QtZWZmb3J0LiAqL1xuICByZXF1ZXVlKGVudHJpZXM6IEF1ZGl0U3Bvb2xFbnRyeVtdKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJlY2xhaW0gYW55IGVudHJpZXMgc3RyYW5kZWQgb24gdGhlIGluLXByb2dyZXNzIGxpc3QgYnkgYSBwcmlvciBjcmFzaCxcbiAgICogIG1vdmluZyB0aGVtIGJhY2sgdG8gdGhlIGhlYWQgb2YgdGhlIG1haW4gYnVmZmVyLiBDYWxsIG9uY2UgYXQgc3RhcnR1cC5cbiAgICogIFJldHVybnMgdGhlIG51bWJlciByZWNsYWltZWQuICovXG4gIHJlY292ZXIoKTogUHJvbWlzZTxudW1iZXI+O1xuICAvKiogQXBwcm94aW1hdGUgY3VycmVudCBkZXB0aCAoZm9yIG1ldHJpY3MgLyBkcmFpbiBkZWNpc2lvbnMpLiAqL1xuICBkZXB0aCgpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbi8qKiBNaW5pbWFsIFJlZGlzIExJU1Qgc3VyZmFjZSB0aGUgc3Bvb2wgbmVlZHMgKGEgc3Vic2V0IG9mIGlvcmVkaXMpLiAqL1xuaW50ZXJmYWNlIFJlZGlzTGlzdENsaWVudCB7XG4gIHJwdXNoKGtleTogc3RyaW5nLCAuLi52YWx1ZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+O1xuICBscHVzaChrZXk6IHN0cmluZywgLi4udmFsdWVzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgbHBvcChrZXk6IHN0cmluZywgY291bnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10gfCBudWxsPjtcbiAgbHRyaW0oa2V5OiBzdHJpbmcsIHN0YXJ0OiBudW1iZXIsIHN0b3A6IG51bWJlcik6IFByb21pc2U8dW5rbm93bj47XG4gIGxsZW4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG4gIC8qKiBBdG9taWNhbGx5IHBvcCBmcm9tIG9uZSBsaXN0IGVuZCBhbmQgcHVzaCB0byBhbm90aGVyIChSZWRpcyDiiaUgNi4yKS4gKi9cbiAgbG1vdmUoc291cmNlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBzdHJpbmcsIGZyb206ICdMRUZUJyB8ICdSSUdIVCcsIHRvOiAnTEVGVCcgfCAnUklHSFQnKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgLyoqIFJlbW92ZSBgY291bnRgIG9jY3VycmVuY2VzIG9mIGB2YWx1ZWAgZnJvbSBhIGxpc3QuICovXG4gIGxyZW0oa2V5OiBzdHJpbmcsIGNvdW50OiBudW1iZXIsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbmNvbnN0IERFRkFVTFRfU1BPT0xfS0VZID0gJ2F1ZGl0OnNwb29sJztcbmNvbnN0IERFRkFVTFRfTUFYX0RFUFRIID0gMTBfMDAwO1xuLyoqIEd1YXJkIHNvIGEgcGF0aG9sb2dpY2FsIGluLXByb2dyZXNzIGxpc3QgY2FuJ3Qgc3BpbiBgcmVjb3ZlcmAvYHRha2VgIGZvcmV2ZXIuICovXG5jb25zdCBNQVhfTU9WRV9JVEVSQVRJT05TID0gMTAwXzAwMDtcblxuZnVuY3Rpb24gZXJyTXNnKGVycjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG59XG5cbmZ1bmN0aW9uIHNhZmVQYXJzZShyYXc6IHN0cmluZyk6IEF1ZGl0U3Bvb2xFbnRyeSB8IG51bGwge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyBBdWRpdFNwb29sRW50cnk7XG4gICAgcmV0dXJuIHBhcnNlZCAmJiBwYXJzZWQuZXZlbnQgJiYgcGFyc2VkLnNlcnZpY2VOYW1lID8gcGFyc2VkIDogbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWRpcy1MSVNULWJhY2tlZCBzcG9vbC4gRHVyYWJsZSBhY3Jvc3MgcHJvY2VzcyByZXN0YXJ0cyAodW5saWtlIGFuIGluLW1lbW9yeVxuICogb3IgcGVyLXBvZC1kaXNrIGJ1ZmZlciksIHNoYXJlZCBieSBhbGwgcmVwbGljYXMgb2YgYSBzZXJ2aWNlLCBhbmQgYm91bmRlZCB2aWFcbiAqIGEgdHJpbS10by10YWlsIG9uIG92ZXJmbG93IChkcm9wcyB0aGUgT0xERVNULCBlbWl0dGluZyBgYXVkaXRfc3Bvb2xfZHJvcHBlZF90b3RhbGApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNBdWRpdFNwb29sKFxuICByZWRpczogUmVkaXNMaXN0Q2xpZW50LFxuICBvcHRzOiB7IG1heERlcHRoPzogbnVtYmVyOyBrZXk/OiBzdHJpbmcgfSA9IHt9LFxuKTogQXVkaXRTcG9vbCB7XG4gIGNvbnN0IGtleSA9IG9wdHMua2V5ID8/IERFRkFVTFRfU1BPT0xfS0VZO1xuICAvLyBUaGUgaW4tcHJvZ3Jlc3MgXCJwcm9jZXNzaW5nXCIgbGlzdCDigJQgYSB0YWtlbiBiYXRjaCBsaXZlcyBoZXJlIHVudGlsIGl0IGlzXG4gIC8vIGFja2VkIChkZWxpdmVyZWQpIG9yIHJlcXVldWVkIChzdGlsbCBmYWlsaW5nKS4gSXQgaXMgYSBzZWN1cml0eSBsb2cnc1xuICAvLyBkdXJhYmlsaXR5IG5ldDogYSBjcmFzaCBiZXR3ZWVuIHRha2UgYW5kIGFjay9yZXF1ZXVlIGxlYXZlcyB0aGUgYmF0Y2ggaGVyZSxcbiAgLy8gYW5kIGByZWNvdmVyYCByZWNsYWltcyBpdCBvbiByZXN0YXJ0IGluc3RlYWQgb2Ygc2lsZW50bHkgbG9zaW5nIGl0LlxuICBjb25zdCBpblByb2dyZXNzS2V5ID0gYCR7a2V5fTppbmZsaWdodGA7XG4gIGNvbnN0IG1heERlcHRoID0gTWF0aC5tYXgoMSwgb3B0cy5tYXhEZXB0aCA/PyBERUZBVUxUX01BWF9ERVBUSCk7XG5cbiAgLy8gVGhlIEVYQUNUIHNlcmlhbGl6ZWQgc3RyaW5nIGVhY2ggcmV0dXJuZWQgZW50cnkgd2FzIHBhcnNlZCBmcm9tLCBzbyBgYWNrYCAvXG4gIC8vIGByZXF1ZXVlYCBjYW4gTFJFTSB0aGUgcHJlY2lzZSB2YWx1ZSBvZmYgdGhlIGluLXByb2dyZXNzIGxpc3QuIEtleWVkIGJ5IHRoZVxuICAvLyByZXR1cm5lZCBvYmplY3QgaWRlbnRpdHkgKHRoZSBkcmFpbiBjb25zdW1lciBwYXNzZXMgdGhlIFNBTUUgb2JqZWN0cyBiYWNrKSxcbiAgLy8gc28gaXQgbmVlZHMgbm8gc3RhYmxlIHJlLXNlcmlhbGl6YXRpb24uIFdlYWtNYXAg4oaSIGVudHJpZXMgR0MgbmF0dXJhbGx5LlxuICBjb25zdCByYXdCeUVudHJ5ID0gbmV3IFdlYWtNYXA8QXVkaXRTcG9vbEVudHJ5LCBzdHJpbmc+KCk7XG4gIGNvbnN0IHJhd09mID0gKGVudHJ5OiBBdWRpdFNwb29sRW50cnkpOiBzdHJpbmcgPT4gcmF3QnlFbnRyeS5nZXQoZW50cnkpID8/IEpTT04uc3RyaW5naWZ5KGVudHJ5KTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGVucXVldWUoZW50cnkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGxlbiA9IGF3YWl0IHJlZGlzLnJwdXNoKGtleSwgSlNPTi5zdHJpbmdpZnkoZW50cnkpKTtcbiAgICAgICAgZW1pdENvdW50ZXIoJ2F1ZGl0X3Nwb29sX2VucXVldWVkX3RvdGFsJywgeyBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgaWYgKGxlbiA+IG1heERlcHRoKSB7XG4gICAgICAgICAgLy8gS2VlcCBvbmx5IHRoZSBuZXdlc3QgYG1heERlcHRoYDsgZHJvcCB0aGUgb3ZlcmZsb3cgYXQgdGhlIGhlYWQuXG4gICAgICAgICAgY29uc3QgZHJvcHBlZCA9IGxlbiAtIG1heERlcHRoO1xuICAgICAgICAgIGF3YWl0IHJlZGlzLmx0cmltKGtleSwgZHJvcHBlZCwgLTEpO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9kcm9wcGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9LCBkcm9wcGVkKTtcbiAgICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgb3ZlcmZsb3cg4oCUIGRyb3BwZWQgb2xkZXN0IGJ1ZmZlcmVkIGV2ZW50cycsIHsgZHJvcHBlZCwgbWF4RGVwdGggfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgZW5xdWV1ZSBmYWlsZWQgKGV2ZW50IGxvc3QpJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHRha2UobWF4KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvdXQ6IEF1ZGl0U3Bvb2xFbnRyeVtdID0gW107XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5tYXgoMSwgbWF4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7XG4gICAgICAgICAgLy8gQXRvbWljYWxseSBNT1ZFIGhlYWTihpJpbi1wcm9ncmVzcy10YWlsIHNvIHRoZSBlbnRyeSBpcyBuZXZlciBpbiBsaW1ibzpcbiAgICAgICAgICAvLyBpdCBpcyBvbiBleGFjdGx5IG9uZSBsaXN0IGF0IGFsbCB0aW1lcywgcmVjb3ZlcmFibGUgYWZ0ZXIgYSBjcmFzaC5cbiAgICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWRpcy5sbW92ZShrZXksIGluUHJvZ3Jlc3NLZXksICdMRUZUJywgJ1JJR0hUJyk7XG4gICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICAgICAgY29uc3QgcGFyc2VkID0gc2FmZVBhcnNlKHJhdyk7XG4gICAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgcmF3QnlFbnRyeS5zZXQocGFyc2VkLCByYXcpO1xuICAgICAgICAgICAgb3V0LnB1c2gocGFyc2VkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ29ycnVwdCBwYXlsb2FkIOKAlCBkcm9wIGl0IG9mZiB0aGUgaW4tcHJvZ3Jlc3MgbGlzdCBzbyBpdCBjYW4ndCB3ZWRnZVxuICAgICAgICAgICAgLy8gdGhlIGRyYWluLCBhbmQgYWNjb3VudCBmb3IgaXQuXG4gICAgICAgICAgICBhd2FpdCByZWRpcy5scmVtKGluUHJvZ3Jlc3NLZXksIDEsIHJhdyk7XG4gICAgICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfc3Bvb2xfZHJvcHBlZF90b3RhbCcsIHsgc2VydmljZTogJ3Vua25vd24nIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCB0YWtlIGZhaWxlZCcsIHsgZXJyb3I6IGVyck1zZyhlcnIpIH0pO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGFjayhlbnRyaWVzKSB7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgIGF3YWl0IHJlZGlzLmxyZW0oaW5Qcm9ncmVzc0tleSwgMSwgcmF3T2YoZW50cnkpKTtcbiAgICAgICAgICByYXdCeUVudHJ5LmRlbGV0ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgYWNrIGZhaWxlZCAobWF5IHJlLWRlbGl2ZXIgb24gcmVjb3ZlciknLCB7IGVycm9yOiBlcnJNc2coZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcmVxdWV1ZShlbnRyaWVzKSB7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFB1dCBmYWlsZWQgcmUtZGVsaXZlcmllcyBiYWNrIGF0IHRoZSBIRUFEIHNvIHRoZXkncmUgcmV0cmllZCBmaXJzdCBhbmRcbiAgICAgICAgLy8gcm91Z2ggZW1pc3Npb24gb3JkZXIgaXMgcHJlc2VydmVkIGFjcm9zcyB0aGUgb3V0YWdlIOKAlCBhbmQgY2xlYXIgdGhlbVxuICAgICAgICAvLyBmcm9tIHRoZSBpbi1wcm9ncmVzcyBsaXN0IHNvIGByZWNvdmVyYCBkb2Vzbid0IGRvdWJsZSB0aGVtLiBJdGVyYXRlIGluXG4gICAgICAgIC8vIHJldmVyc2Ugc28gbHB1c2ggcmVzdG9yZXMgdGhlIGJhdGNoJ3Mgb3JpZ2luYWwgb3JkZXIgYXQgdGhlIGhlYWQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE9SREVSSU5HIElOVkFSSUFOVCAoYXQtbGVhc3Qtb25jZSk6IGxwdXNoIHRvIHRoZSBtYWluIGxpc3QgRklSU1QsIFRIRU5cbiAgICAgICAgLy8gbHJlbSBmcm9tIGluLXByb2dyZXNzLiBBIGNyYXNoIGJldHdlZW4gdGhlIHR3byBsZWF2ZXMgdGhlIGVudHJ5IG9uIEJPVEhcbiAgICAgICAgLy8gbGlzdHMg4oaSIGhhcm1sZXNzIGRvdWJsZS1kZWxpdmVyeSAoZGVkdXBlZCBkb3duc3RyZWFtIGJ5IGlkZW1wb3RlbmN5XG4gICAgICAgIC8vIHJldXNlKSwgbmV2ZXIgYSBMT1NTLiBUaGUgcmV2ZXJzZSBvcmRlciAobHJlbSB0aGVuIGxwdXNoKSB3b3VsZCBkcm9wIHRoZVxuICAgICAgICAvLyBldmVudCBvdXRyaWdodCBvbiBhIGNyYXNoIGluIHRoZSBnYXAsIHdoaWNoIGEgc2VjdXJpdHkgbG9nIG11c3Qgbm90IGRvLlxuICAgICAgICBmb3IgKGxldCBpID0gZW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGNvbnN0IHJhdyA9IHJhd09mKGVudHJpZXNbaV0pO1xuICAgICAgICAgIGF3YWl0IHJlZGlzLmxwdXNoKGtleSwgcmF3KTtcbiAgICAgICAgICBhd2FpdCByZWRpcy5scmVtKGluUHJvZ3Jlc3NLZXksIDEsIHJhdyk7XG4gICAgICAgICAgcmF3QnlFbnRyeS5kZWxldGUoZW50cmllc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgcmVxdWV1ZSBmYWlsZWQgKGV2ZW50cyBsb3N0KScsIHsgZXJyb3I6IGVyck1zZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyByZWNvdmVyKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IHJlY2xhaW1lZCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTUFYX01PVkVfSVRFUkFUSU9OUzsgaSsrKSB7XG4gICAgICAgICAgLy8gTW92ZSBpbi1wcm9ncmVzcy10YWlsIOKGkiBtYWluLWhlYWQ6IGFuIG9sZGVyIHN0cmFuZGVkIGVudHJ5IChuZWFyZXIgdGhlXG4gICAgICAgICAgLy8gaW4tcHJvZ3Jlc3MgaGVhZCkgZW5kcyB1cCBhaGVhZCBvZiBhIG5ld2VyIG9uZSwgcHJlc2VydmluZyBvcmRlci5cbiAgICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWRpcy5sbW92ZShpblByb2dyZXNzS2V5LCBrZXksICdSSUdIVCcsICdMRUZUJyk7XG4gICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICAgICAgcmVjbGFpbWVkKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlY2xhaW1lZCA+IDApIHtcbiAgICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfc3Bvb2xfcmVjb3ZlcmVkX3RvdGFsJywge30sIHJlY2xhaW1lZCk7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIHJlY292ZXJlZCBzdHJhbmRlZCBpbi1wcm9ncmVzcyBldmVudHMnLCB7IHJlY2xhaW1lZCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjbGFpbWVkO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCByZWNvdmVyIGZhaWxlZCcsIHsgZXJyb3I6IGVyck1zZyhlcnIpIH0pO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZGVwdGgoKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVkaXMubGxlbihrZXkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBSZWRpcy1iYWNrZWQgYXVkaXQgc3Bvb2wgZnJvbSB0aGUgYW1iaWVudCBgUkVESVNfVVJMYCAvIGBSRURJU19IT1NUYFxuICogZW52IHZpYSB0aGUgc2hhcmVkIGBjcmVhdGVFbnZSZWRpc0NsaWVudGAuIFJldHVybnMgYG51bGxgIHdoZW4gUmVkaXMgaXMgbm90XG4gKiBjb25maWd1cmVkIG9yIHRoZSBjbGllbnQgY2FuJ3QgYmUgY29uc3RydWN0ZWQg4oCUIHRoZSBjYWxsZXIgdGhlbiBydW5zIHdpdGhvdXQgYVxuICogc3Bvb2wgKHByZS1zcG9vbCBiZXN0LWVmZm9ydCBiZWhhdmlvciksIG5ldmVyIGNyYXNoaW5nLiBUaGUgc2hhcmVkIGhlbHBlciBsb2Fkc1xuICogaW9yZWRpcyB2aWEgYGNyZWF0ZVJlcXVpcmVgLCBzbyB0aGlzIHN0YXlzIGltcG9ydGFibGUgd2hlcmUgUmVkaXMgaXNuJ3QgcHJlc2VudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbChvcHRzOiB7IG1heERlcHRoPzogbnVtYmVyOyBrZXk/OiBzdHJpbmcgfSA9IHt9KTogQXVkaXRTcG9vbCB8IG51bGwge1xuICBjb25zdCBpbnN0ID0gY3JlYXRlRW52UmVkaXNDbGllbnQ8UmVkaXNMaXN0Q2xpZW50PignYXVkaXQtc3Bvb2wnKTtcbiAgaWYgKCFpbnN0KSByZXR1cm4gbnVsbDtcbiAgbG9nZ2VyLmluZm8oJ1JlZGlzIGF1ZGl0IHNwb29sIGluaXRpYWxpemVkJyk7XG4gIHJldHVybiBjcmVhdGVSZWRpc0F1ZGl0U3Bvb2woaW5zdCwgb3B0cyk7XG59XG4iXX0=
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtc3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvYXVkaXQtc3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQStEM0MsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUM7QUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFDakMsb0ZBQW9GO0FBQ3BGLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDO0FBRXBDLFNBQVMsTUFBTSxDQUFDLEdBQVk7SUFDMUIsT0FBTyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEdBQVc7SUFDNUIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQW9CLENBQUM7UUFDbEQsT0FBTyxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN0RSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLEtBQXNCLEVBQ3RCLElBQUksR0FBd0Ms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LENBQUM7Z0JBQ0QsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2xCLFdBQVcsQ0FBQyw2QkFBNkIsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQzFELE1BQU0sQ0FBQyxJQUFJLENBQUMsbURBQW1ELEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRixDQUFDO2dCQUNELE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbEUsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztRQUVELEtBQUssQ0FBQyxLQUFLO1lBQ1QsSUFBSSxDQUFDO2dCQUNILE9BQU8sTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsSUFBSSxHQUF3QyxFQUFFO0lBQ3JGLE1BQU0sSUFBSSxHQUFHLG9CQUFvQixDQUFrQixhQUFhLENBQUMsQ0FBQztJQUNsRSxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUM3QyxPQUFPLHFCQUFxQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQ2xpZW50IH0gZnJvbSAnLi9lbnYtcmVkaXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZW1vdGVBdWRpdEV2ZW50IH0gZnJvbSAnLi9yZW1vdGUtYXVkaXQtY2xpZW50LmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdhdWRpdC1zcG9vbCcpO1xuXG4vKiogQSBidWZmZXJlZCBlbWlzc2lvbjogdGhlIGV2ZW50IHBsdXMgd2hpY2ggc2VydmljZSBtdXN0IHJlLWRlbGl2ZXIgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0U3Bvb2xFbnRyeSB7XG4gIGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50O1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIER1cmFibGUgYnVmZmVyIGZvciBhdWRpdCBldmVudHMgdGhhdCBmYWlsZWQgTElWRSBkZWxpdmVyeSB0byB0aGUgcGxhdGZvcm1cbiAqIChyZXRyaWVzIGV4aGF1c3RlZCBkdXJpbmcgYSBzdXN0YWluZWQgb3V0YWdlKS4gV2l0aG91dCB0aGlzLCB0aGUgYXVkaXQgdHJhaWwg4oCUXG4gKiBhIHNlY3VyaXR5IGxvZyDigJQgaXMgc2lsZW50bHkgbG9zdCB0aGUgbW9tZW50IHRoZSBwbGF0Zm9ybSBpcyBkb3duIGZvciBsb25nZXJcbiAqIHRoYW4gdGhlIGNsaWVudCdzIHNtYWxsIHJldHJ5IGJ1ZGdldC5cbiAqXG4gKiBDb250cmFjdDpcbiAqIC0gQk9VTkRFRC4gQSBzZWN1cml0eSBsb2cgbXVzdCBkZWdyYWRlIHRvIFwiZHJvcHBlZCB0aGUgb2xkZXN0LCBsb3VkbHlcIiAoYVxuICogICBtZXRyaWMpIHJhdGhlciB0aGFuIGdyb3cgd2l0aG91dCBsaW1pdCBhbmQgT09NIHRoZSBlbWl0dGVyLlxuICogLSBGQUlMLVNBRkUuIEV2ZXJ5IG1ldGhvZCBzd2FsbG93cyBpdHMgb3duIGVycm9ycyDigJQgYSBicm9rZW4vdW5yZWFjaGFibGUgc3Bvb2xcbiAqICAgbXVzdCBuZXZlciBicmVhayBvciBibG9jayB0aGUgYXVkaXQgZW1pc3Npb24gcGF0aCAod2hpY2ggaXMgaXRzZWxmXG4gKiAgIGZpcmUtYW5kLWZvcmdldCkuIEEgc3Bvb2wgcHJvYmxlbSBkZWdyYWRlcyB0byB0aGUgcHJlLXNwb29sIGJlaGF2aW9yLlxuICogLSBPcmRlcmluZyBpcyBiZXN0LWVmZm9ydC4gUmUtZGVsaXZlcmVkIGV2ZW50cyBjaGFpbiBhdCByZS1kZWxpdmVyeSB0aW1lXG4gKiAgICh0aGF0J3Mgd2hlbiB0aGUgcGxhdGZvcm0gaW5zZXJ0cyB0aGVtKSwgc28gZWFjaCBldmVudCBhbHNvIGNhcnJpZXMgYW5cbiAqICAgYG9jY3VycmVkQXRgIHN0YW1wZWQgYXQgZW1pc3Npb24gZm9yIHJldmlld2VycyDigJQgc2VlIFJlbW90ZUF1ZGl0RXZlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRTcG9vbCB7XG4gIC8qKiBCdWZmZXIgYW4gZXZlbnQgdGhhdCBmYWlsZWQgbGl2ZSBkZWxpdmVyeS4gKi9cbiAgZW5xdWV1ZShlbnRyeTogQXVkaXRTcG9vbEVudHJ5KTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgTU9WRSB1cCB0byBgbWF4YCBidWZmZXJlZCBlbnRyaWVzIG9udG8gYW4gaW4tcHJvZ3Jlc3MgbGlzdCBhbmRcbiAgICogcmV0dXJuIHRoZW0uIEJlY2F1c2UgdGhlIGVudHJpZXMgYXJlIG1vdmVkIChub3QgcG9wcGVkLWFuZC1kcm9wcGVkKSwgYSBjcmFzaFxuICAgKiBtaWQtZHJhaW4gbGVhdmVzIHRoZW0gcmVjb3ZlcmFibGUgb24gdGhlIGluLXByb2dyZXNzIGxpc3Qg4oCUIHNlZSBgcmVjb3ZlcmAuXG4gICAqIEVhY2ggdGFrZW4gZW50cnkgTVVTVCBiZSByZXNvbHZlZCB3aXRoIGV4YWN0bHkgb25lIG9mIGBhY2tgIChkZWxpdmVyZWQpIG9yXG4gICAqIGByZXF1ZXVlYCAoc3RpbGwgZmFpbGluZyksIG9yIGl0IGxpbmdlcnMgb24gdGhlIGluLXByb2dyZXNzIGxpc3QgdW50aWwgdGhlXG4gICAqIG5leHQgYHJlY292ZXJgLlxuICAgKi9cbiAgdGFrZShtYXg6IG51bWJlcik6IFByb21pc2U8QXVkaXRTcG9vbEVudHJ5W10+O1xuICAvKiogQWNrbm93bGVkZ2Ugc3VjY2Vzc2Z1bGx5IHJlLWRlbGl2ZXJlZCBlbnRyaWVzIOKAlCByZW1vdmVzIHRoZW0gZnJvbSB0aGVcbiAgICogIGluLXByb2dyZXNzIGxpc3Qgc28gdGhleSBhcmUgbm90IHJlY292ZXJlZCBhZ2Fpbi4gKi9cbiAgYWNrKGVudHJpZXM6IEF1ZGl0U3Bvb2xFbnRyeVtdKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJldHVybiBlbnRyaWVzIHdob3NlIHJlLWRlbGl2ZXJ5IGZhaWxlZCB0byB0aGUgSEVBRCBvZiB0aGUgYnVmZmVyIChyZXRyaWVkXG4gICAqICBmaXJzdCkgYW5kIGNsZWFyIHRoZW0gZnJvbSB0aGUgaW4tcHJvZ3Jlc3MgbGlzdC4gQmVzdC1lZmZvcnQuICovXG4gIHJlcXVldWUoZW50cmllczogQXVkaXRTcG9vbEVudHJ5W10pOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogUmVjbGFpbSBhbnkgZW50cmllcyBzdHJhbmRlZCBvbiB0aGUgaW4tcHJvZ3Jlc3MgbGlzdCBieSBhIHByaW9yIGNyYXNoLFxuICAgKiAgbW92aW5nIHRoZW0gYmFjayB0byB0aGUgaGVhZCBvZiB0aGUgbWFpbiBidWZmZXIuIENhbGwgb25jZSBhdCBzdGFydHVwLlxuICAgKiAgUmV0dXJucyB0aGUgbnVtYmVyIHJlY2xhaW1lZC4gKi9cbiAgcmVjb3ZlcigpOiBQcm9taXNlPG51bWJlcj47XG4gIC8qKiBBcHByb3hpbWF0ZSBjdXJyZW50IGRlcHRoIChmb3IgbWV0cmljcyAvIGRyYWluIGRlY2lzaW9ucykuICovXG4gIGRlcHRoKCk6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuLyoqIE1pbmltYWwgUmVkaXMgTElTVCBzdXJmYWNlIHRoZSBzcG9vbCBuZWVkcyAoYSBzdWJzZXQgb2YgaW9yZWRpcykuICovXG5pbnRlcmZhY2UgUmVkaXNMaXN0Q2xpZW50IHtcbiAgcnB1c2goa2V5OiBzdHJpbmcsIC4uLnZhbHVlczogc3RyaW5nW10pOiBQcm9taXNlPG51bWJlcj47XG4gIGxwdXNoKGtleTogc3RyaW5nLCAuLi52YWx1ZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+O1xuICBscG9wKGtleTogc3RyaW5nLCBjb3VudDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+O1xuICBsdHJpbShrZXk6IHN0cmluZywgc3RhcnQ6IG51bWJlciwgc3RvcDogbnVtYmVyKTogUHJvbWlzZTx1bmtub3duPjtcbiAgbGxlbihrZXk6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIEF0b21pY2FsbHkgcG9wIGZyb20gb25lIGxpc3QgZW5kIGFuZCBwdXNoIHRvIGFub3RoZXIgKFJlZGlzIOKJpSA2LjIpLiAqL1xuICBsbW92ZShzb3VyY2U6IHN0cmluZywgZGVzdGluYXRpb246IHN0cmluZywgZnJvbTogJ0xFRlQnIHwgJ1JJR0hUJywgdG86ICdMRUZUJyB8ICdSSUdIVCcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICAvKiogUmVtb3ZlIGBjb3VudGAgb2NjdXJyZW5jZXMgb2YgYHZhbHVlYCBmcm9tIGEgbGlzdC4gKi9cbiAgbHJlbShrZXk6IHN0cmluZywgY291bnQ6IG51bWJlciwgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuY29uc3QgREVGQVVMVF9TUE9PTF9LRVkgPSAnYXVkaXQ6c3Bvb2wnO1xuY29uc3QgREVGQVVMVF9NQVhfREVQVEggPSAxMF8wMDA7XG4vKiogR3VhcmQgc28gYSBwYXRob2xvZ2ljYWwgaW4tcHJvZ3Jlc3MgbGlzdCBjYW4ndCBzcGluIGByZWNvdmVyYC9gdGFrZWAgZm9yZXZlci4gKi9cbmNvbnN0IE1BWF9NT1ZFX0lURVJBVElPTlMgPSAxMDBfMDAwO1xuXG5mdW5jdGlvbiBlcnJNc2coZXJyOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbn1cblxuZnVuY3Rpb24gc2FmZVBhcnNlKHJhdzogc3RyaW5nKTogQXVkaXRTcG9vbEVudHJ5IHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpIGFzIEF1ZGl0U3Bvb2xFbnRyeTtcbiAgICByZXR1cm4gcGFyc2VkICYmIHBhcnNlZC5ldmVudCAmJiBwYXJzZWQuc2VydmljZU5hbWUgPyBwYXJzZWQgOiBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIFJlZGlzLUxJU1QtYmFja2VkIHNwb29sLiBEdXJhYmxlIGFjcm9zcyBwcm9jZXNzIHJlc3RhcnRzICh1bmxpa2UgYW4gaW4tbWVtb3J5XG4gKiBvciBwZXItcG9kLWRpc2sgYnVmZmVyKSwgc2hhcmVkIGJ5IGFsbCByZXBsaWNhcyBvZiBhIHNlcnZpY2UsIGFuZCBib3VuZGVkIHZpYVxuICogYSB0cmltLXRvLXRhaWwgb24gb3ZlcmZsb3cgKGRyb3BzIHRoZSBPTERFU1QsIGVtaXR0aW5nIGBhdWRpdF9zcG9vbF9kcm9wcGVkX3RvdGFsYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWRpc0F1ZGl0U3Bvb2woXG4gIHJlZGlzOiBSZWRpc0xpc3RDbGllbnQsXG4gIG9wdHM6IHsgbWF4RGVwdGg/OiBudW1iZXI7IGtleT86IHN0cmluZyB9ID0ge30sXG4pOiBBdWRpdFNwb29sIHtcbiAgY29uc3Qga2V5ID0gb3B0cy5rZXkgPz8gREVGQVVMVF9TUE9PTF9LRVk7XG4gIC8vIFRoZSBpbi1wcm9ncmVzcyBcInByb2Nlc3NpbmdcIiBsaXN0IOKAlCBhIHRha2VuIGJhdGNoIGxpdmVzIGhlcmUgdW50aWwgaXQgaXNcbiAgLy8gYWNrZWQgKGRlbGl2ZXJlZCkgb3IgcmVxdWV1ZWQgKHN0aWxsIGZhaWxpbmcpLiBJdCBpcyBhIHNlY3VyaXR5IGxvZydzXG4gIC8vIGR1cmFiaWxpdHkgbmV0OiBhIGNyYXNoIGJldHdlZW4gdGFrZSBhbmQgYWNrL3JlcXVldWUgbGVhdmVzIHRoZSBiYXRjaCBoZXJlLFxuICAvLyBhbmQgYHJlY292ZXJgIHJlY2xhaW1zIGl0IG9uIHJlc3RhcnQgaW5zdGVhZCBvZiBzaWxlbnRseSBsb3NpbmcgaXQuXG4gIGNvbnN0IGluUHJvZ3Jlc3NLZXkgPSBgJHtrZXl9OmluZmxpZ2h0YDtcbiAgY29uc3QgbWF4RGVwdGggPSBNYXRoLm1heCgxLCBvcHRzLm1heERlcHRoID8/IERFRkFVTFRfTUFYX0RFUFRIKTtcblxuICAvLyBUaGUgRVhBQ1Qgc2VyaWFsaXplZCBzdHJpbmcgZWFjaCByZXR1cm5lZCBlbnRyeSB3YXMgcGFyc2VkIGZyb20sIHNvIGBhY2tgIC9cbiAgLy8gYHJlcXVldWVgIGNhbiBMUkVNIHRoZSBwcmVjaXNlIHZhbHVlIG9mZiB0aGUgaW4tcHJvZ3Jlc3MgbGlzdC4gS2V5ZWQgYnkgdGhlXG4gIC8vIHJldHVybmVkIG9iamVjdCBpZGVudGl0eSAodGhlIGRyYWluIGNvbnN1bWVyIHBhc3NlcyB0aGUgU0FNRSBvYmplY3RzIGJhY2spLFxuICAvLyBzbyBpdCBuZWVkcyBubyBzdGFibGUgcmUtc2VyaWFsaXphdGlvbi4gV2Vha01hcCDihpIgZW50cmllcyBHQyBuYXR1cmFsbHkuXG4gIGNvbnN0IHJhd0J5RW50cnkgPSBuZXcgV2Vha01hcDxBdWRpdFNwb29sRW50cnksIHN0cmluZz4oKTtcbiAgY29uc3QgcmF3T2YgPSAoZW50cnk6IEF1ZGl0U3Bvb2xFbnRyeSk6IHN0cmluZyA9PiByYXdCeUVudHJ5LmdldChlbnRyeSkgPz8gSlNPTi5zdHJpbmdpZnkoZW50cnkpO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgZW5xdWV1ZShlbnRyeSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbGVuID0gYXdhaXQgcmVkaXMucnB1c2goa2V5LCBKU09OLnN0cmluZ2lmeShlbnRyeSkpO1xuICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfc3Bvb2xfZW5xdWV1ZWRfdG90YWwnLCB7IHNlcnZpY2U6IGVudHJ5LnNlcnZpY2VOYW1lIH0pO1xuICAgICAgICBpZiAobGVuID4gbWF4RGVwdGgpIHtcbiAgICAgICAgICAvLyBLZWVwIG9ubHkgdGhlIG5ld2VzdCBgbWF4RGVwdGhgOyBkcm9wIHRoZSBvdmVyZmxvdyBhdCB0aGUgaGVhZC5cbiAgICAgICAgICBjb25zdCBkcm9wcGVkID0gbGVuIC0gbWF4RGVwdGg7XG4gICAgICAgICAgYXdhaXQgcmVkaXMubHRyaW0oa2V5LCBkcm9wcGVkLCAtMSk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ2F1ZGl0X3Nwb29sX2Ryb3BwZWRfdG90YWwnLCB7IHNlcnZpY2U6IGVudHJ5LnNlcnZpY2VOYW1lIH0sIGRyb3BwZWQpO1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCBvdmVyZmxvdyDigJQgZHJvcHBlZCBvbGRlc3QgYnVmZmVyZWQgZXZlbnRzJywgeyBkcm9wcGVkLCBtYXhEZXB0aCB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCBlbnF1ZXVlIGZhaWxlZCAoZXZlbnQgbG9zdCknLCB7IGVycm9yOiBlcnJNc2coZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgdGFrZShtYXgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG91dDogQXVkaXRTcG9vbEVudHJ5W10gPSBbXTtcbiAgICAgICAgY29uc3QgbGltaXQgPSBNYXRoLm1heCgxLCBtYXgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbWl0OyBpKyspIHtcbiAgICAgICAgICAvLyBBdG9taWNhbGx5IE1PVkUgaGVhZOKGkmluLXByb2dyZXNzLXRhaWwgc28gdGhlIGVudHJ5IGlzIG5ldmVyIGluIGxpbWJvOlxuICAgICAgICAgIC8vIGl0IGlzIG9uIGV4YWN0bHkgb25lIGxpc3QgYXQgYWxsIHRpbWVzLCByZWNvdmVyYWJsZSBhZnRlciBhIGNyYXNoLlxuICAgICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlZGlzLmxtb3ZlKGtleSwgaW5Qcm9ncmVzc0tleSwgJ0xFRlQnLCAnUklHSFQnKTtcbiAgICAgICAgICBpZiAocmF3ID09PSBudWxsIHx8IHJhdyA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBzYWZlUGFyc2UocmF3KTtcbiAgICAgICAgICBpZiAocGFyc2VkKSB7XG4gICAgICAgICAgICByYXdCeUVudHJ5LnNldChwYXJzZWQsIHJhdyk7XG4gICAgICAgICAgICBvdXQucHVzaChwYXJzZWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDb3JydXB0IHBheWxvYWQg4oCUIGRyb3AgaXQgb2ZmIHRoZSBpbi1wcm9ncmVzcyBsaXN0IHNvIGl0IGNhbid0IHdlZGdlXG4gICAgICAgICAgICAvLyB0aGUgZHJhaW4sIGFuZCBhY2NvdW50IGZvciBpdC5cbiAgICAgICAgICAgIGF3YWl0IHJlZGlzLmxyZW0oaW5Qcm9ncmVzc0tleSwgMSwgcmF3KTtcbiAgICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9kcm9wcGVkX3RvdGFsJywgeyBzZXJ2aWNlOiAndW5rbm93bicgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIHRha2UgZmFpbGVkJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgYWNrKGVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgYXdhaXQgcmVkaXMubHJlbShpblByb2dyZXNzS2V5LCAxLCByYXdPZihlbnRyeSkpO1xuICAgICAgICAgIHJhd0J5RW50cnkuZGVsZXRlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCBhY2sgZmFpbGVkIChtYXkgcmUtZGVsaXZlciBvbiByZWNvdmVyKScsIHsgZXJyb3I6IGVyck1zZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyByZXF1ZXVlKGVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUHV0IGZhaWxlZCByZS1kZWxpdmVyaWVzIGJhY2sgYXQgdGhlIEhFQUQgc28gdGhleSdyZSByZXRyaWVkIGZpcnN0IGFuZFxuICAgICAgICAvLyByb3VnaCBlbWlzc2lvbiBvcmRlciBpcyBwcmVzZXJ2ZWQgYWNyb3NzIHRoZSBvdXRhZ2Ug4oCUIGFuZCBjbGVhciB0aGVtXG4gICAgICAgIC8vIGZyb20gdGhlIGluLXByb2dyZXNzIGxpc3Qgc28gYHJlY292ZXJgIGRvZXNuJ3QgZG91YmxlIHRoZW0uIEl0ZXJhdGUgaW5cbiAgICAgICAgLy8gcmV2ZXJzZSBzbyBscHVzaCByZXN0b3JlcyB0aGUgYmF0Y2gncyBvcmlnaW5hbCBvcmRlciBhdCB0aGUgaGVhZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gT1JERVJJTkcgSU5WQVJJQU5UIChhdC1sZWFzdC1vbmNlKTogbHB1c2ggdG8gdGhlIG1haW4gbGlzdCBGSVJTVCwgVEhFTlxuICAgICAgICAvLyBscmVtIGZyb20gaW4tcHJvZ3Jlc3MuIEEgY3Jhc2ggYmV0d2VlbiB0aGUgdHdvIGxlYXZlcyB0aGUgZW50cnkgb24gQk9USFxuICAgICAgICAvLyBsaXN0cyDihpIgaGFybWxlc3MgZG91YmxlLWRlbGl2ZXJ5IChkZWR1cGVkIGRvd25zdHJlYW0gYnkgaWRlbXBvdGVuY3lcbiAgICAgICAgLy8gcmV1c2UpLCBuZXZlciBhIExPU1MuIFRoZSByZXZlcnNlIG9yZGVyIChscmVtIHRoZW4gbHB1c2gpIHdvdWxkIGRyb3AgdGhlXG4gICAgICAgIC8vIGV2ZW50IG91dHJpZ2h0IG9uIGEgY3Jhc2ggaW4gdGhlIGdhcCwgd2hpY2ggYSBzZWN1cml0eSBsb2cgbXVzdCBub3QgZG8uXG4gICAgICAgIGZvciAobGV0IGkgPSBlbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgY29uc3QgcmF3ID0gcmF3T2YoZW50cmllc1tpXSk7XG4gICAgICAgICAgYXdhaXQgcmVkaXMubHB1c2goa2V5LCByYXcpO1xuICAgICAgICAgIGF3YWl0IHJlZGlzLmxyZW0oaW5Qcm9ncmVzc0tleSwgMSwgcmF3KTtcbiAgICAgICAgICByYXdCeUVudHJ5LmRlbGV0ZShlbnRyaWVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCByZXF1ZXVlIGZhaWxlZCAoZXZlbnRzIGxvc3QpJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHJlY292ZXIoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgcmVjbGFpbWVkID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNQVhfTU9WRV9JVEVSQVRJT05TOyBpKyspIHtcbiAgICAgICAgICAvLyBNb3ZlIGluLXByb2dyZXNzLXRhaWwg4oaSIG1haW4taGVhZDogYW4gb2xkZXIgc3RyYW5kZWQgZW50cnkgKG5lYXJlciB0aGVcbiAgICAgICAgICAvLyBpbi1wcm9ncmVzcyBoZWFkKSBlbmRzIHVwIGFoZWFkIG9mIGEgbmV3ZXIgb25lLCBwcmVzZXJ2aW5nIG9yZGVyLlxuICAgICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlZGlzLmxtb3ZlKGluUHJvZ3Jlc3NLZXksIGtleSwgJ1JJR0hUJywgJ0xFRlQnKTtcbiAgICAgICAgICBpZiAocmF3ID09PSBudWxsIHx8IHJhdyA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgICAgICByZWNsYWltZWQrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVjbGFpbWVkID4gMCkge1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9yZWNvdmVyZWRfdG90YWwnLCB7fSwgcmVjbGFpbWVkKTtcbiAgICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgcmVjb3ZlcmVkIHN0cmFuZGVkIGluLXByb2dyZXNzIGV2ZW50cycsIHsgcmVjbGFpbWVkIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNsYWltZWQ7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIHJlY292ZXIgZmFpbGVkJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBkZXB0aCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZWRpcy5sbGVuKGtleSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFJlZGlzLWJhY2tlZCBhdWRpdCBzcG9vbCBmcm9tIHRoZSBhbWJpZW50IGBSRURJU19VUkxgIC8gYFJFRElTX1NFTlRJTkVMU2BcbiAqIGVudiB2aWEgdGhlIHNoYXJlZCBgY3JlYXRlRW52UmVkaXNDbGllbnRgLiBSZXR1cm5zIGBudWxsYCB3aGVuIFJlZGlzIGlzIG5vdFxuICogY29uZmlndXJlZCDigJQgdGhlIGNhbGxlciB0aGVuIHJ1bnMgd2l0aG91dCBhIHNwb29sIChiZXN0LWVmZm9ydCBiZWhhdmlvcikuIFRoZSBzaGFyZWQgaGVscGVyIGxvYWRzXG4gKiBpb3JlZGlzIHZpYSBgY3JlYXRlUmVxdWlyZWAsIHNvIHRoaXMgc3RheXMgaW1wb3J0YWJsZSB3aGVyZSBSZWRpcyBpc24ndCBwcmVzZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52UmVkaXNBdWRpdFNwb29sKG9wdHM6IHsgbWF4RGVwdGg/OiBudW1iZXI7IGtleT86IHN0cmluZyB9ID0ge30pOiBBdWRpdFNwb29sIHwgbnVsbCB7XG4gIGNvbnN0IGluc3QgPSBjcmVhdGVFbnZSZWRpc0NsaWVudDxSZWRpc0xpc3RDbGllbnQ+KCdhdWRpdC1zcG9vbCcpO1xuICBpZiAoIWluc3QpIHJldHVybiBudWxsO1xuICBsb2dnZXIuaW5mbygnUmVkaXMgYXVkaXQgc3Bvb2wgaW5pdGlhbGl6ZWQnKTtcbiAgcmV0dXJuIGNyZWF0ZVJlZGlzQXVkaXRTcG9vbChpbnN0LCBvcHRzKTtcbn1cbiJdfQ==
|
|
@@ -22,7 +22,54 @@ export interface CacheConfig {
|
|
|
22
22
|
maxEntries?: number;
|
|
23
23
|
/** Optional Redis client — uses in-memory cache if not provided */
|
|
24
24
|
redis?: RedisCacheClient;
|
|
25
|
+
/**
|
|
26
|
+
* Cross-replica invalidation bus for the in-memory backend. Omit to use the
|
|
27
|
+
* shared env-Redis bus (null when Redis isn't configured → single-process
|
|
28
|
+
* semantics); pass `null` to disable explicitly. Ignored with `redis` (the
|
|
29
|
+
* store itself is shared, so there is nothing to fan out).
|
|
30
|
+
*/
|
|
31
|
+
invalidationBus?: CacheInvalidationBus | null;
|
|
32
|
+
}
|
|
33
|
+
/** One invalidation broadcast to every replica. */
|
|
34
|
+
export interface CacheInvalidationMessage {
|
|
35
|
+
/** Id of the CacheService instance that invalidated (it ignores its own echo). */
|
|
36
|
+
origin: string;
|
|
37
|
+
/** The cache namespace (`CacheConfig.prefix`) the invalidation applies to. */
|
|
38
|
+
prefix: string;
|
|
39
|
+
op: 'del' | 'pattern' | 'clear';
|
|
40
|
+
/** Un-prefixed key (`del`) or glob pattern (`pattern`). */
|
|
41
|
+
key?: string;
|
|
42
|
+
}
|
|
43
|
+
/** Transport that fans cache invalidations out to every replica. */
|
|
44
|
+
export interface CacheInvalidationBus {
|
|
45
|
+
/** Fire-and-forget broadcast. Never throws. */
|
|
46
|
+
publish(msg: CacheInvalidationMessage): void;
|
|
47
|
+
/**
|
|
48
|
+
* Register handlers. `onMessage` receives every broadcast (including this
|
|
49
|
+
* process's own); `onResync` fires whenever the subscription is (re)established,
|
|
50
|
+
* i.e. whenever invalidations may have been missed.
|
|
51
|
+
*/
|
|
52
|
+
subscribe(onMessage: (msg: CacheInvalidationMessage) => void, onResync: () => void): void;
|
|
25
53
|
}
|
|
54
|
+
/** Minimal ioredis pub/sub surface the env bus needs. */
|
|
55
|
+
export interface RedisInvalidationClient {
|
|
56
|
+
publish(channel: string, message: string): Promise<number>;
|
|
57
|
+
subscribe(...channels: string[]): Promise<unknown>;
|
|
58
|
+
on(event: string, cb: (...args: any[]) => void): unknown;
|
|
59
|
+
duplicate(): RedisInvalidationClient;
|
|
60
|
+
status?: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Redis pub/sub invalidation bus. PUBLISH on the given client; SUBSCRIBE on a
|
|
64
|
+
* `duplicate()` (a subscribed ioredis connection can't run other commands).
|
|
65
|
+
*
|
|
66
|
+
* The SUBSCRIBE is issued on every `ready` (initial connect AND each reconnect)
|
|
67
|
+
* rather than once at construction: the env client runs without an offline
|
|
68
|
+
* queue, so a subscribe issued before the connection is up is rejected and would
|
|
69
|
+
* never be retried. Each `ready` also triggers `onResync` so every cache flushes
|
|
70
|
+
* whatever it may have missed while disconnected.
|
|
71
|
+
*/
|
|
72
|
+
export declare function createRedisCacheInvalidationBus(publisher: RedisInvalidationClient): CacheInvalidationBus;
|
|
26
73
|
/**
|
|
27
74
|
* Cache service with get/set/del operations and automatic TTL expiry.
|
|
28
75
|
*
|
|
@@ -55,6 +102,14 @@ export declare class CacheService {
|
|
|
55
102
|
private readonly defaultTtlMs;
|
|
56
103
|
private readonly maxEntries;
|
|
57
104
|
private readonly redis?;
|
|
105
|
+
private readonly bus;
|
|
106
|
+
private readonly instanceId;
|
|
107
|
+
/**
|
|
108
|
+
* Bumped on EVERY invalidation (local or remote). `getOrSet` only caches a
|
|
109
|
+
* factory result if no invalidation happened while the factory ran — otherwise
|
|
110
|
+
* it could re-cache a value read before the write that invalidated it.
|
|
111
|
+
*/
|
|
112
|
+
private generation;
|
|
58
113
|
/** Cache metrics — tracks hits, misses, and invalidations. */
|
|
59
114
|
readonly metrics: {
|
|
60
115
|
hits: number;
|
|
@@ -63,6 +118,10 @@ export declare class CacheService {
|
|
|
63
118
|
invalidations: number;
|
|
64
119
|
};
|
|
65
120
|
constructor(config: CacheConfig);
|
|
121
|
+
/** Broadcast an invalidation to the other replicas (in-memory backend only). */
|
|
122
|
+
private broadcast;
|
|
123
|
+
/** Apply an invalidation to THIS process's in-memory entries. Returns the count removed. */
|
|
124
|
+
private applyLocalInvalidation;
|
|
66
125
|
private fullKey;
|
|
67
126
|
/**
|
|
68
127
|
* Get a cached value. Returns null on miss or error.
|
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Lightweight caching service with TTL support.
|
|
5
|
+
*
|
|
6
|
+
* Two implementations:
|
|
7
|
+
* - In-memory (default): true-LRU Map cache, no external dependencies
|
|
8
|
+
* - Redis: When a Redis client is provided, uses Redis for cross-process caching
|
|
9
|
+
*
|
|
10
|
+
* Cross-replica invalidation (in-memory backend): every service runs several
|
|
11
|
+
* replicas (HPA), each with its OWN in-memory cache. An invalidation performed on
|
|
12
|
+
* one pod (`del` / `invalidatePattern` / `clear`) is broadcast over Redis pub/sub
|
|
13
|
+
* ({@link CacheInvalidationBus}, wired from the ambient Redis env by default) and
|
|
14
|
+
* applied by every other pod, so a write on pod A can't leave pod B serving the
|
|
15
|
+
* stale entry until its TTL lapses. A pod whose subscriber (re)connects flushes
|
|
16
|
+
* its local cache — it may have missed invalidations while disconnected — and a
|
|
17
|
+
* `getOrSet` whose factory raced an invalidation does not cache its result.
|
|
18
|
+
*
|
|
19
|
+
* Design:
|
|
20
|
+
* - All operations are fail-safe: cache misses/errors return null, never throw
|
|
21
|
+
* - JSON serialization for Redis; the in-memory backend deep-clones on read so
|
|
22
|
+
* both backends return an independent copy (mutating a result is always safe)
|
|
23
|
+
* - `getOrSet` is single-flight: concurrent misses share one factory() call
|
|
24
|
+
* - Key namespace prefixing to avoid collisions between services
|
|
25
|
+
*/
|
|
26
|
+
import { randomUUID } from 'crypto';
|
|
27
|
+
import { createEnvRedisClient } from './env-redis.js';
|
|
28
|
+
import { createLogger } from '../utils/logger.js';
|
|
29
|
+
import { emitCounter } from '../utils/metric-emitter.js';
|
|
30
|
+
const logger = createLogger('cache-service');
|
|
3
31
|
/**
|
|
4
32
|
* Deep-clone a value so the in-memory backend hands back an INDEPENDENT copy on
|
|
5
33
|
* every read — matching the Redis backend, which returns a fresh `JSON.parse`
|
|
@@ -20,6 +48,87 @@ function cloneValue(value) {
|
|
|
20
48
|
return JSON.parse(JSON.stringify(value));
|
|
21
49
|
}
|
|
22
50
|
}
|
|
51
|
+
const CACHE_INVALIDATION_CHANNEL = 'cache:invalidate';
|
|
52
|
+
/**
|
|
53
|
+
* Redis pub/sub invalidation bus. PUBLISH on the given client; SUBSCRIBE on a
|
|
54
|
+
* `duplicate()` (a subscribed ioredis connection can't run other commands).
|
|
55
|
+
*
|
|
56
|
+
* The SUBSCRIBE is issued on every `ready` (initial connect AND each reconnect)
|
|
57
|
+
* rather than once at construction: the env client runs without an offline
|
|
58
|
+
* queue, so a subscribe issued before the connection is up is rejected and would
|
|
59
|
+
* never be retried. Each `ready` also triggers `onResync` so every cache flushes
|
|
60
|
+
* whatever it may have missed while disconnected.
|
|
61
|
+
*/
|
|
62
|
+
export function createRedisCacheInvalidationBus(publisher) {
|
|
63
|
+
const subscriber = publisher.duplicate();
|
|
64
|
+
const messageHandlers = [];
|
|
65
|
+
const resyncHandlers = [];
|
|
66
|
+
const resync = () => {
|
|
67
|
+
for (const h of resyncHandlers) {
|
|
68
|
+
try {
|
|
69
|
+
h();
|
|
70
|
+
}
|
|
71
|
+
catch { /* isolated */ }
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const doSubscribe = () => {
|
|
75
|
+
void Promise.resolve(subscriber.subscribe(CACHE_INVALIDATION_CHANNEL))
|
|
76
|
+
.then(() => resync())
|
|
77
|
+
.catch((err) => {
|
|
78
|
+
emitCounter('cache_invalidation_subscribe_failed_total', {});
|
|
79
|
+
logger.warn('Cache invalidation subscribe failed; will retry on next reconnect', {
|
|
80
|
+
error: err instanceof Error ? err.message : String(err),
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
subscriber.on('message', (channel, raw) => {
|
|
85
|
+
if (channel !== CACHE_INVALIDATION_CHANNEL)
|
|
86
|
+
return;
|
|
87
|
+
let msg;
|
|
88
|
+
try {
|
|
89
|
+
msg = JSON.parse(raw);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
for (const h of messageHandlers) {
|
|
95
|
+
try {
|
|
96
|
+
h(msg);
|
|
97
|
+
}
|
|
98
|
+
catch { /* one cache can't break the others */ }
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
subscriber.on('ready', doSubscribe);
|
|
102
|
+
subscriber.on('error', (e) => logger.warn('Cache invalidation subscriber error', { error: e instanceof Error ? e.message : String(e) }));
|
|
103
|
+
if (subscriber.status === 'ready')
|
|
104
|
+
doSubscribe();
|
|
105
|
+
return {
|
|
106
|
+
publish(msg) {
|
|
107
|
+
void Promise.resolve()
|
|
108
|
+
.then(() => publisher.publish(CACHE_INVALIDATION_CHANNEL, JSON.stringify(msg)))
|
|
109
|
+
.catch((err) => {
|
|
110
|
+
emitCounter('cache_invalidation_publish_failed_total', { prefix: msg.prefix });
|
|
111
|
+
logger.warn('Cache invalidation publish failed (other replicas keep the entry until TTL)', {
|
|
112
|
+
prefix: msg.prefix, op: msg.op, error: err instanceof Error ? err.message : String(err),
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
subscribe(onMessage, onResync) {
|
|
117
|
+
messageHandlers.push(onMessage);
|
|
118
|
+
resyncHandlers.push(onResync);
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
// undefined = not yet attempted; null = attempted, Redis not configured.
|
|
123
|
+
let envInvalidationBus;
|
|
124
|
+
/** Process-wide invalidation bus from the ambient Redis env (null without Redis). */
|
|
125
|
+
function getEnvCacheInvalidationBus() {
|
|
126
|
+
if (envInvalidationBus === undefined) {
|
|
127
|
+
const client = createEnvRedisClient('cache-invalidation');
|
|
128
|
+
envInvalidationBus = client ? createRedisCacheInvalidationBus(client) : null;
|
|
129
|
+
}
|
|
130
|
+
return envInvalidationBus;
|
|
131
|
+
}
|
|
23
132
|
/**
|
|
24
133
|
* Cache service with get/set/del operations and automatic TTL expiry.
|
|
25
134
|
*
|
|
@@ -52,6 +161,14 @@ export class CacheService {
|
|
|
52
161
|
defaultTtlMs;
|
|
53
162
|
maxEntries;
|
|
54
163
|
redis;
|
|
164
|
+
bus;
|
|
165
|
+
instanceId = randomUUID();
|
|
166
|
+
/**
|
|
167
|
+
* Bumped on EVERY invalidation (local or remote). `getOrSet` only caches a
|
|
168
|
+
* factory result if no invalidation happened while the factory ran — otherwise
|
|
169
|
+
* it could re-cache a value read before the write that invalidated it.
|
|
170
|
+
*/
|
|
171
|
+
generation = 0;
|
|
55
172
|
/** Cache metrics — tracks hits, misses, and invalidations. */
|
|
56
173
|
metrics = { hits: 0, misses: 0, sets: 0, invalidations: 0 };
|
|
57
174
|
constructor(config) {
|
|
@@ -59,6 +176,41 @@ export class CacheService {
|
|
|
59
176
|
this.defaultTtlMs = config.defaultTtlSeconds * 1000;
|
|
60
177
|
this.maxEntries = config.maxEntries ?? 1000;
|
|
61
178
|
this.redis = config.redis;
|
|
179
|
+
this.bus = this.redis ? null : (config.invalidationBus === undefined ? getEnvCacheInvalidationBus() : config.invalidationBus);
|
|
180
|
+
this.bus?.subscribe((msg) => {
|
|
181
|
+
if (msg.origin === this.instanceId || msg.prefix !== this.prefix)
|
|
182
|
+
return;
|
|
183
|
+
this.applyLocalInvalidation(msg.op, msg.key);
|
|
184
|
+
}, () => this.applyLocalInvalidation('clear'));
|
|
185
|
+
}
|
|
186
|
+
/** Broadcast an invalidation to the other replicas (in-memory backend only). */
|
|
187
|
+
broadcast(op, key) {
|
|
188
|
+
this.bus?.publish({ origin: this.instanceId, prefix: this.prefix, op, ...(key !== undefined && { key }) });
|
|
189
|
+
}
|
|
190
|
+
/** Apply an invalidation to THIS process's in-memory entries. Returns the count removed. */
|
|
191
|
+
applyLocalInvalidation(op, key) {
|
|
192
|
+
this.generation++;
|
|
193
|
+
if (op === 'clear') {
|
|
194
|
+
const n = this.memory.size;
|
|
195
|
+
this.memory.clear();
|
|
196
|
+
return n;
|
|
197
|
+
}
|
|
198
|
+
if (op === 'del') {
|
|
199
|
+
return this.memory.delete(this.fullKey(key ?? '')) ? 1 : 0;
|
|
200
|
+
}
|
|
201
|
+
// Glob pattern. Escape regex metacharacters first so a literal `.`/`(`/`[`
|
|
202
|
+
// in a key prefix (e.g. `org:v1.2:*`) can't over-match or throw (a throw
|
|
203
|
+
// here would leave entries stale); only `*` is treated as a wildcard.
|
|
204
|
+
const fp = this.fullKey(key ?? '');
|
|
205
|
+
const regex = new RegExp('^' + fp.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\\\*/g, '.*') + '$');
|
|
206
|
+
let deleted = 0;
|
|
207
|
+
for (const k of this.memory.keys()) {
|
|
208
|
+
if (regex.test(k)) {
|
|
209
|
+
this.memory.delete(k);
|
|
210
|
+
deleted++;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return deleted;
|
|
62
214
|
}
|
|
63
215
|
fullKey(key) {
|
|
64
216
|
return `${this.prefix}${key}`;
|
|
@@ -153,7 +305,8 @@ export class CacheService {
|
|
|
153
305
|
await this.redis.del(fk);
|
|
154
306
|
return;
|
|
155
307
|
}
|
|
156
|
-
this.
|
|
308
|
+
this.applyLocalInvalidation('del', key);
|
|
309
|
+
this.broadcast('del', key);
|
|
157
310
|
}
|
|
158
311
|
catch {
|
|
159
312
|
// Cache delete failure is non-fatal
|
|
@@ -176,18 +329,9 @@ export class CacheService {
|
|
|
176
329
|
}
|
|
177
330
|
return keys.length;
|
|
178
331
|
}
|
|
179
|
-
// In-memory —
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
// stale reads); only `*` is treated as a wildcard.
|
|
183
|
-
const regex = new RegExp('^' + fp.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\\\*/g, '.*') + '$');
|
|
184
|
-
let deleted = 0;
|
|
185
|
-
for (const key of this.memory.keys()) {
|
|
186
|
-
if (regex.test(key)) {
|
|
187
|
-
this.memory.delete(key);
|
|
188
|
-
deleted++;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
332
|
+
// In-memory — apply locally, then fan out to the other replicas.
|
|
333
|
+
const deleted = this.applyLocalInvalidation('pattern', pattern);
|
|
334
|
+
this.broadcast('pattern', pattern);
|
|
191
335
|
this.metrics.invalidations += deleted;
|
|
192
336
|
return deleted;
|
|
193
337
|
}
|
|
@@ -234,9 +378,13 @@ export class CacheService {
|
|
|
234
378
|
const existing = this.inflight.get(fk);
|
|
235
379
|
if (existing)
|
|
236
380
|
return cloneValue(await existing);
|
|
381
|
+
const generationAtStart = this.generation;
|
|
237
382
|
const flight = (async () => {
|
|
238
383
|
const value = await factory();
|
|
239
|
-
|
|
384
|
+
// An invalidation (here or on another replica) landed while the factory
|
|
385
|
+
// ran: its read may predate that write, so don't cache it.
|
|
386
|
+
if (this.generation === generationAtStart)
|
|
387
|
+
await this.set(key, value, ttlSeconds);
|
|
240
388
|
return value;
|
|
241
389
|
})();
|
|
242
390
|
this.inflight.set(fk, flight);
|
|
@@ -255,7 +403,8 @@ export class CacheService {
|
|
|
255
403
|
await this.invalidatePattern('*');
|
|
256
404
|
}
|
|
257
405
|
else {
|
|
258
|
-
this.
|
|
406
|
+
this.applyLocalInvalidation('clear');
|
|
407
|
+
this.broadcast('clear');
|
|
259
408
|
}
|
|
260
409
|
}
|
|
261
410
|
/** Current in-memory cache size (for diagnostics). */
|
|
@@ -273,4 +422,4 @@ export class CacheService {
|
|
|
273
422
|
export function createCacheService(prefix, defaultTtlSeconds = 300, redis) {
|
|
274
423
|
return new CacheService({ prefix, defaultTtlSeconds, redis });
|
|
275
424
|
}
|
|
276
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUEwQnRDOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsVUFBVSxDQUFJLEtBQVE7SUFDN0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxJQUFJLENBQUM7UUFDSCxPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQU0sQ0FBQztJQUNoRCxDQUFDO0FBQ0gsQ0FBQztBQTBCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBQ2YsTUFBTSxHQUFHLElBQUksR0FBRyxFQUErQixDQUFDO0lBQ3hEOzs7O09BSUc7SUFDSyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFDdEMsTUFBTSxDQUFTO0lBQ2YsWUFBWSxDQUFTO0lBQ3JCLFVBQVUsQ0FBUztJQUNuQixLQUFLLENBQW9CO0lBRTFDLDhEQUE4RDtJQUNyRCxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFFckUsWUFBWSxNQUFtQjtRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3BELElBQUksQ0FBQyxVQUFVLEdB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RXhCLE9BQU8sSUFBSSxZQUFZLENBQUMsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUNoRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogTGlnaHR3ZWlnaHQgY2FjaGluZyBzZXJ2aWNlIHdpdGggVFRMIHN1cHBvcnQuXG4gKlxuICogVHdvIGltcGxlbWVudGF0aW9uczpcbiAqIC0gSW4tbWVtb3J5IChkZWZhdWx0KTogdHJ1ZS1MUlUgTWFwIGNhY2hlLCBubyBleHRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqIC0gUmVkaXM6IFdoZW4gYSBSZWRpcyBjbGllbnQgaXMgcHJvdmlkZWQsIHVzZXMgUmVkaXMgZm9yIGNyb3NzLXByb2Nlc3MgY2FjaGluZ1xuICpcbiAqIERlc2lnbjpcbiAqIC0gQWxsIG9wZXJhdGlvbnMgYXJlIGZhaWwtc2FmZTogY2FjaGUgbWlzc2VzL2Vycm9ycyByZXR1cm4gbnVsbCwgbmV2ZXIgdGhyb3dcbiAqIC0gSlNPTiBzZXJpYWxpemF0aW9uIGZvciBSZWRpczsgdGhlIGluLW1lbW9yeSBiYWNrZW5kIGRlZXAtY2xvbmVzIG9uIHJlYWQgc29cbiAqICAgYm90aCBiYWNrZW5kcyByZXR1cm4gYW4gaW5kZXBlbmRlbnQgY29weSAobXV0YXRpbmcgYSByZXN1bHQgaXMgYWx3YXlzIHNhZmUpXG4gKiAtIGBnZXRPclNldGAgaXMgc2luZ2xlLWZsaWdodDogY29uY3VycmVudCBtaXNzZXMgc2hhcmUgb25lIGZhY3RvcnkoKSBjYWxsXG4gKiAtIEtleSBuYW1lc3BhY2UgcHJlZml4aW5nIHRvIGF2b2lkIGNvbGxpc2lvbnMgYmV0d2VlbiBzZXJ2aWNlc1xuICovXG5cblxuLyoqXG4gKiBDYWNoZSBlbnRyeSB3aXRoIHZhbHVlIGFuZCBleHBpcmF0aW9uIHRpbWUuXG4gKi9cbmludGVyZmFjZSBDYWNoZUVudHJ5PFQ+IHtcbiAgdmFsdWU6IFQ7XG4gIGV4cGlyZXNBdDogbnVtYmVyOyAvLyBVbml4IHRpbWVzdGFtcCBpbiBtc1xufVxuXG4vKipcbiAqIERlZXAtY2xvbmUgYSB2YWx1ZSBzbyB0aGUgaW4tbWVtb3J5IGJhY2tlbmQgaGFuZHMgYmFjayBhbiBJTkRFUEVOREVOVCBjb3B5IG9uXG4gKiBldmVyeSByZWFkIOKAlCBtYXRjaGluZyB0aGUgUmVkaXMgYmFja2VuZCwgd2hpY2ggcmV0dXJucyBhIGZyZXNoIGBKU09OLnBhcnNlYFxuICogY2xvbmUgZWFjaCB0aW1lLiBXaXRob3V0IHRoaXMgdGhlIGluLW1lbW9yeSBjYWNoZSByZXR1cm5zIHRoZSBzYW1lIHN0b3JlZFxuICogb2JqZWN0IHJlZmVyZW5jZSwgc28gYSBjb25zdW1lciBtdXRhdGluZyBhIFwiY2FjaGVkXCIgb2JqZWN0IHNpbGVudGx5IGNvcnJ1cHRzXG4gKiB0aGUgc2hhcmVkIGNhY2hlIChhIGZvb3RndW4gdGhhdCBvbmx5IGJpdGVzIHVuZGVyIHRoZSBtZW1vcnkgYmFja2VuZCkuXG4gKlxuICogUHJpbWl0aXZlcyBhcmUgcmV0dXJuZWQgYXMtaXMuIFByZWZlcnMgdGhlIHN0cnVjdHVyZWQtY2xvbmUgYWxnb3JpdGhtOyBmYWxsc1xuICogYmFjayB0byBhIEpTT04gcm91bmQtdHJpcCBvbiBvbGRlciBydW50aW1lcyBvciBleG90aWMgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBjbG9uZVZhbHVlPFQ+KHZhbHVlOiBUKTogVCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdmFsdWU7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgYXMgVDtcbiAgfVxufVxuXG4vKipcbiAqIE1pbmltYWwgUmVkaXMtbGlrZSBjbGllbnQgaW50ZXJmYWNlIChzdWJzZXQgb2YgaW9yZWRpcykuXG4gKiBTZXJ2aWNlcyBwYXNzIHRoZWlyIG93biBSZWRpcyBjbGllbnQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVkaXNDYWNoZUNsaWVudCB7XG4gIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgZGVsKC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+O1xuICBrZXlzKHBhdHRlcm46IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+O1xuICAvKiogU0NBTi1iYXNlZCBpdGVyYXRpb24gKHByZWZlcnJlZCBvdmVyIEtFWVMgZm9yIHByb2R1Y3Rpb24pLiAqL1xuICBzY2FuU3RyZWFtPyhvcHRpb25zOiB7IG1hdGNoOiBzdHJpbmc7IGNvdW50PzogbnVtYmVyIH0pOiBOb2RlSlMuUmVhZGFibGVTdHJlYW07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVDb25maWcge1xuICAvKiogS2V5IHByZWZpeCBmb3IgbmFtZXNwYWNlIGlzb2xhdGlvbiAoZS5nLiwgJ3BsdWdpbjonLCAnY29tcGxpYW5jZTonKSAqL1xuICBwcmVmaXg6IHN0cmluZztcbiAgLyoqIERlZmF1bHQgVFRMIGluIHNlY29uZHMgKi9cbiAgZGVmYXVsdFR0bFNlY29uZHM6IG51bWJlcjtcbiAgLyoqIE1heCBlbnRyaWVzIGZvciBpbi1tZW1vcnkgY2FjaGUgKGRlZmF1bHQgMTAwMCkgKi9cbiAgbWF4RW50cmllcz86IG51bWJlcjtcbiAgLyoqIE9wdGlvbmFsIFJlZGlzIGNsaWVudCDigJQgdXNlcyBpbi1tZW1vcnkgY2FjaGUgaWYgbm90IHByb3ZpZGVkICovXG4gIHJlZGlzPzogUmVkaXNDYWNoZUNsaWVudDtcbn1cblxuLyoqXG4gKiBDYWNoZSBzZXJ2aWNlIHdpdGggZ2V0L3NldC9kZWwgb3BlcmF0aW9ucyBhbmQgYXV0b21hdGljIFRUTCBleHBpcnkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNhY2hlID0gbmV3IENhY2hlU2VydmljZSh7IHByZWZpeDogJ3BsdWdpbjonLCBkZWZhdWx0VHRsU2Vjb25kczogMzAwIH0pO1xuICpcbiAqIC8vIFNldCB3aXRoIGRlZmF1bHQgVFRMXG4gKiBhd2FpdCBjYWNoZS5zZXQoJ29yZzEyMzpsaXN0JywgcGx1Z2lucyk7XG4gKlxuICogLy8gR2V0IChyZXR1cm5zIG51bGwgb24gbWlzcylcbiAqIGNvbnN0IGNhY2hlZCA9IGF3YWl0IGNhY2hlLmdldDxQbHVnaW5bXT4oJ29yZzEyMzpsaXN0Jyk7XG4gKlxuICogLy8gSW52YWxpZGF0ZVxuICogYXdhaXQgY2FjaGUuZGVsKCdvcmcxMjM6bGlzdCcpO1xuICpcbiAqIC8vIEludmFsaWRhdGUgYnkgcGF0dGVyblxuICogYXdhaXQgY2FjaGUuaW52YWxpZGF0ZVBhdHRlcm4oJ29yZzEyMzoqJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENhY2hlU2VydmljZSB7XG4gIHByaXZhdGUgbWVtb3J5ID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlRW50cnk8dW5rbm93bj4+KCk7XG4gIC8qKlxuICAgKiBJbi1mbGlnaHQgYGdldE9yU2V0YCBmYWN0b3J5IHByb21pc2VzLCBrZXllZCBieSBmdWxsIGNhY2hlIGtleS4gQ29hbGVzY2VzXG4gICAqIGNvbmN1cnJlbnQgY29sZCBjYWxsZXJzIG9udG8gYSBzaW5nbGUgYGZhY3RvcnkoKWAgaW52b2NhdGlvbiAoc2luZ2xlLWZsaWdodFxuICAgKiAvIHN0YW1wZWRlIHByb3RlY3Rpb24pOyBlbnRyaWVzIGFyZSBjbGVhcmVkIG9uY2UgdGhlIHByb21pc2Ugc2V0dGxlcy5cbiAgICovXG4gIHByaXZhdGUgaW5mbGlnaHQgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmaXg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0VHRsTXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhFbnRyaWVzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVkaXM/OiBSZWRpc0NhY2hlQ2xpZW50O1xuXG4gIC8qKiBDYWNoZSBtZXRyaWNzIOKAlCB0cmFja3MgaGl0cywgbWlzc2VzLCBhbmQgaW52YWxpZGF0aW9ucy4gKi9cbiAgcmVhZG9ubHkgbWV0cmljcyA9IHsgaGl0czogMCwgbWlzc2VzOiAwLCBzZXRzOiAwLCBpbnZhbGlkYXRpb25zOiAwIH07XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDYWNoZUNvbmZpZykge1xuICAgIHRoaXMucHJlZml4ID0gY29uZmlnLnByZWZpeDtcbiAgICB0aGlzLmRlZmF1bHRUdGxNcyA9IGNvbmZpZy5kZWZhdWx0VHRsU2Vjb25kcyAqIDEwMDA7XG4gICAgdGhpcy5tYXhFbnRyaWVzID0gY29uZmlnLm1heEVudHJpZXMgPz8gMTAwMDtcbiAgICB0aGlzLnJlZGlzID0gY29uZmlnLnJlZGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBmdWxsS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9JHtrZXl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBjYWNoZWQgdmFsdWUuIFJldHVybnMgbnVsbCBvbiBtaXNzIG9yIGVycm9yLlxuICAgKlxuICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYW4gSU5ERVBFTkRFTlQgZGVlcCBjb3B5IOKAlCBtdXRhdGluZyBpdCBuZXZlciBhZmZlY3RzXG4gICAqIHRoZSBjYWNoZWQgZW50cnkgKHRoZSBpbi1tZW1vcnkgYmFja2VuZCBjbG9uZXMgb24gcmVhZCBmb3IgcGFyaXR5IHdpdGhcbiAgICogUmVkaXMsIHdoaWNoIHJldHVybnMgYSBmcmVzaCBKU09OIGNsb25lKS4gQ2FsbGVycyBtYXkgc3RpbGwgdHJlYXQgcmVzdWx0cyBhc1xuICAgKiBpbW11dGFibGUsIGJ1dCBkb2luZyBzbyBpcyBubyBsb25nZXIgbG9hZC1iZWFyaW5nIGZvciBjYWNoZSBpbnRlZ3JpdHkuXG4gICAqL1xuICBhc3luYyBnZXQ8VD4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgY29uc3QgZmsgPSB0aGlzLmZ1bGxLZXkoa2V5KTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5yZWRpcykge1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCB0aGlzLnJlZGlzLmdldChmayk7XG4gICAgICAgIGlmICghcmF3KSB7IHRoaXMubWV0cmljcy5taXNzZXMrKzsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgdGhpcy5tZXRyaWNzLmhpdHMrKztcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBUO1xuICAgICAgfVxuXG4gICAgICAvLyBJbi1tZW1vcnlcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5tZW1vcnkuZ2V0KGZrKTtcbiAgICAgIGlmICghZW50cnkpIHsgdGhpcy5tZXRyaWNzLm1pc3NlcysrOyByZXR1cm4gbnVsbDsgfVxuICAgICAgaWYgKERhdGUubm93KCkgPiBlbnRyeS5leHBpcmVzQXQpIHtcbiAgICAgICAgdGhpcy5tZW1vcnkuZGVsZXRlKGZrKTtcbiAgICAgICAgdGhpcy5tZXRyaWNzLm1pc3NlcysrO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIExSVSB0b3VjaDogZGVsZXRlICsgcmUtaW5zZXJ0IG1vdmVzIHRoaXMga2V5IHRvIHRoZSBuZXdlc3QgcG9zaXRpb25cbiAgICAgIC8vIChNYXAgcHJlc2VydmVzIGluc2VydGlvbiBvcmRlciksIHNvIGBzZXRgJ3Mgb2xkZXN0LWZpcnN0IGV2aWN0aW9uIGlzIGFcbiAgICAgIC8vIHRydWUgbGVhc3QtcmVjZW50bHktVVNFRCBldmljdGlvbiByYXRoZXIgdGhhbiBmaXJzdC1pbnNlcnRlZCAoRklGTykuXG4gICAgICB0aGlzLm1lbW9yeS5kZWxldGUoZmspO1xuICAgICAgdGhpcy5tZW1vcnkuc2V0KGZrLCBlbnRyeSk7XG4gICAgICB0aGlzLm1ldHJpY3MuaGl0cysrO1xuICAgICAgLy8gQ2xvbmUgc28gYSBjYWxsZXIgbXV0YXRpbmcgdGhlIHJlc3VsdCBjYW4ndCBjb3JydXB0IHRoZSBzaGFyZWQgZW50cnkuXG4gICAgICByZXR1cm4gY2xvbmVWYWx1ZShlbnRyeS52YWx1ZSkgYXMgVDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMubWV0cmljcy5taXNzZXMrKztcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBjYWNoZWQgdmFsdWUgd2l0aCBvcHRpb25hbCBUVEwgb3ZlcnJpZGUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBDYWNoZSBrZXkgKHByZWZpeCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5KVxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjYWNoZSAobXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZSBmb3IgUmVkaXMpXG4gICAqIEBwYXJhbSB0dGxTZWNvbmRzIC0gVFRMIG92ZXJyaWRlICh1c2VzIGRlZmF1bHQgaWYgbm90IHByb3ZpZGVkKVxuICAgKi9cbiAgYXN5bmMgc2V0PFQ+KGtleTogc3RyaW5nLCB2YWx1ZTogVCwgdHRsU2Vjb25kcz86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZrID0gdGhpcy5mdWxsS2V5KGtleSk7XG4gICAgY29uc3QgdHRsID0gdHRsU2Vjb25kcyA/PyB0aGlzLmRlZmF1bHRUdGxNcyAvIDEwMDA7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5tZXRyaWNzLnNldHMrKztcbiAgICAgIGlmICh0aGlzLnJlZGlzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVkaXMuc2V0KGZrLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSksICdFWCcsIHR0bCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSW4tbWVtb3J5IOKAlCBhIHdyaXRlIGNvdW50cyBhcyBhIHVzZSwgc28gZHJvcCBhbnkgZXhpc3RpbmcgZW50cnkgZmlyc3RcbiAgICAgIC8vIGFuZCByZS1pbnNlcnQgYmVsb3cgYXMgdGhlIG5ld2VzdCAoTWFwIHByZXNlcnZlcyBpbnNlcnRpb24gb3JkZXIpLiBUaGlzXG4gICAgICAvLyBrZWVwcyB0aGUgTWFwIG9yZGVyZWQgb2xkZXN0LVVTRUQg4oaSIG5ld2VzdC1VU0VEIHNvIHRoZSBldmljdGlvbiBiZWxvdyBpc1xuICAgICAgLy8gdHJ1ZSBMUlUsIGFuZCBhdm9pZHMgZXZpY3RpbmcgYSB2aWN0aW0gd2hlbiBtZXJlbHkgdXBkYXRpbmcgYSBrZXkuXG4gICAgICB0aGlzLm1lbW9yeS5kZWxldGUoZmspO1xuICAgICAgaWYgKHRoaXMubWVtb3J5LnNpemUgPj0gdGhpcy5tYXhFbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5tZW1vcnkua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgaWYgKGZpcnN0S2V5KSB0aGlzLm1lbW9yeS5kZWxldGUoZmlyc3RLZXkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1lbW9yeS5zZXQoZmssIHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIHR0bCAqIDEwMDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENhY2hlIHNldCBmYWlsdXJlIGlzIG5vbi1mYXRhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBjYWNoZWQgdmFsdWUuXG4gICAqL1xuICBhc3luYyBkZWwoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmayA9IHRoaXMuZnVsbEtleShrZXkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnJlZGlzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVkaXMuZGVsKGZrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5tZW1vcnkuZGVsZXRlKGZrKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENhY2hlIGRlbGV0ZSBmYWlsdXJlIGlzIG5vbi1mYXRhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZhbGlkYXRlIGFsbCBrZXlzIG1hdGNoaW5nIGEgcGF0dGVybiAoZS5nLiwgJ29yZzEyMzoqJykuXG4gICAqIFVzZXMgU0NBTiBmb3IgUmVkaXMgKG5vbi1ibG9ja2luZykgd2l0aCBLRVlTIGZhbGxiYWNrLCBvciByZWdleCBmb3IgaW4tbWVtb3J5LlxuICAgKi9cbiAgYXN5bmMgaW52YWxpZGF0ZVBhdHRlcm4ocGF0dGVybjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBmcCA9IHRoaXMuZnVsbEtleShwYXR0ZXJuKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5yZWRpcykge1xuICAgICAgICBjb25zdCBrZXlzID0gdGhpcy5yZWRpcy5zY2FuU3RyZWFtXG4gICAgICAgICAgPyBhd2FpdCB0aGlzLnNjYW5LZXlzKGZwKVxuICAgICAgICAgIDogYXdhaXQgdGhpcy5yZWRpcy5rZXlzKGZwKTtcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVkaXMuZGVsKC4uLmtleXMpO1xuICAgICAgICAgIHRoaXMubWV0cmljcy5pbnZhbGlkYXRpb25zICs9IGtleXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXlzLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgLy8gSW4tbWVtb3J5IOKAlCBtYXRjaCBnbG9iLXN0eWxlIHBhdHRlcm4uIEVzY2FwZSByZWdleCBtZXRhY2hhcmFjdGVycyBmaXJzdFxuICAgICAgLy8gc28gYSBsaXRlcmFsIGAuYC9gKGAvYFtgIGluIGEga2V5IHByZWZpeCAoZS5nLiBgb3JnOnYxLjI6KmApIGNhbid0XG4gICAgICAvLyBvdmVyLW1hdGNoIG9yIHRocm93IChhIHRocm93IGhlcmUgaXMgc3dhbGxvd2VkIOKGkiBub3RoaW5nIGludmFsaWRhdGVkIOKGklxuICAgICAgLy8gc3RhbGUgcmVhZHMpOyBvbmx5IGAqYCBpcyB0cmVhdGVkIGFzIGEgd2lsZGNhcmQuXG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgZnAucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKS5yZXBsYWNlKC9cXFxcXFwqL2csICcuKicpICsgJyQnKTtcbiAgICAgIGxldCBkZWxldGVkID0gMDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMubWVtb3J5LmtleXMoKSkge1xuICAgICAgICBpZiAocmVnZXgudGVzdChrZXkpKSB7XG4gICAgICAgICAgdGhpcy5tZW1vcnkuZGVsZXRlKGtleSk7XG4gICAgICAgICAgZGVsZXRlZCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLm1ldHJpY3MuaW52YWxpZGF0aW9ucyArPSBkZWxldGVkO1xuICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICAvKiogQ29sbGVjdCBrZXlzIHZpYSBSZWRpcyBTQ0FOIChub24tYmxvY2tpbmcgYWx0ZXJuYXRpdmUgdG8gS0VZUykuICovXG4gIHByaXZhdGUgc2NhbktleXMocGF0dGVybjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnJlZGlzIS5zY2FuU3RyZWFtISh7IG1hdGNoOiBwYXR0ZXJuLCBjb3VudDogMTAwIH0pO1xuICAgICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgIHN0cmVhbS5vbignZGF0YScsIChiYXRjaDogc3RyaW5nW10pID0+IGtleXMucHVzaCguLi5iYXRjaCkpO1xuICAgICAgc3RyZWFtLm9uY2UoJ2VuZCcsICgpID0+IHJlc29sdmUoa2V5cykpO1xuICAgICAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3IgY29tcHV0ZTogcmV0dXJucyBjYWNoZWQgdmFsdWUgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgY2FsbHMgdGhlXG4gICAqIGZhY3RvcnkgZnVuY3Rpb24sIGNhY2hlcyB0aGUgcmVzdWx0LCBhbmQgcmV0dXJucyBpdC5cbiAgICpcbiAgICogU2luZ2xlLWZsaWdodCAvIHN0YW1wZWRlIHByb3RlY3Rpb246IHdoZW4gTiBjYWxsZXJzIG1pc3MgY29uY3VycmVudGx5IGZvclxuICAgKiB0aGUgc2FtZSBrZXksIG9ubHkgT05FIGBmYWN0b3J5KClgIHJ1bnMg4oCUIHRoZSByZXN0IGF3YWl0IGl0cyBzaGFyZWQgcHJvbWlzZS5cbiAgICogVGhlIGluLWZsaWdodCBlbnRyeSBpcyBjbGVhcmVkIG9uY2UgaXQgc2V0dGxlcyAoc3VjY2VzcyBvciBmYWlsdXJlKSwgc28gYVxuICAgKiBmYWlsZWQgZmFjdG9yeSBkb2Vzbid0IHBvaXNvbiBsYXRlciBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIENhY2hlIGtleVxuICAgKiBAcGFyYW0gZmFjdG9yeSAtIEFzeW5jIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9uIGNhY2hlIG1pc3NcbiAgICogQHBhcmFtIHR0bFNlY29uZHMgLSBPcHRpb25hbCBUVEwgb3ZlcnJpZGVcbiAgICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBjb21wdXRlZCB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgZ2V0T3JTZXQ8VD4oa2V5OiBzdHJpbmcsIGZhY3Rvcnk6ICgpID0+IFByb21pc2U8VD4sIHR0bFNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCB0aGlzLmdldDxUPihrZXkpO1xuICAgIGlmIChjYWNoZWQgIT09IG51bGwpIHJldHVybiBjYWNoZWQ7XG5cbiAgICBjb25zdCBmayA9IHRoaXMuZnVsbEtleShrZXkpO1xuICAgIC8vIENvYWxlc2NlIGNvbmN1cnJlbnQgY29sZCBjYWxsZXJzIG9udG8gYSBzaW5nbGUgZmFjdG9yeSgpIGludm9jYXRpb24uIFRoZVxuICAgIC8vIGluLWZsaWdodCBwcm9taXNlIHJlc29sdmVzIHRvIHRoZSBSQVcgdmFsdWU7IGVhY2ggYXdhaXRlciAodGhlIHByaW1hcnlcbiAgICAvLyBjYWxsZXIgYmVsb3cgQU5EIGV2ZXJ5IGNvYWxlc2NlZCBjYWxsZXIgaGVyZSkgY2xvbmVzIGl0IElOREVQRU5ERU5UTFkuXG4gICAgLy8gQ2xvbmluZyBpbnNpZGUgdGhlIGZsaWdodCBpbnN0ZWFkIHdvdWxkIGhhbmQgb25lIHNoYXJlZCBjbG9uZSB0byBhbGwgTlxuICAgIC8vIGNvYWxlc2NlZCBjYWxsZXJzLCBzbyBvbmUgY2FsbGVyIG11dGF0aW5nIGl0cyBcImluZGVwZW5kZW50XCIgcmVzdWx0IHdvdWxkXG4gICAgLy8gY29ycnVwdCB3aGF0IHRoZSBvdGhlcnMgcmVhZCDigJQgdGhlIGV4YWN0IGZvb3RndW4gZ2V0KCkncyBjbG9uZS1vbi1yZWFkXG4gICAgLy8gcHJldmVudHMuIChSZWRpcyBiYWNrZW5kIGlzIHVuYWZmZWN0ZWQ6IHNldCBzZXJpYWxpemVzLCBnZXQgSlNPTi5wYXJzZXMuKVxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5pbmZsaWdodC5nZXQoZmspIGFzIFByb21pc2U8VD4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gY2xvbmVWYWx1ZShhd2FpdCBleGlzdGluZyk7XG5cbiAgICBjb25zdCBmbGlnaHQgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBmYWN0b3J5KCk7XG4gICAgICBhd2FpdCB0aGlzLnNldChrZXksIHZhbHVlLCB0dGxTZWNvbmRzKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KSgpO1xuICAgIHRoaXMuaW5mbGlnaHQuc2V0KGZrLCBmbGlnaHQpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY2xvbmVWYWx1ZShhd2FpdCBmbGlnaHQpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmluZmxpZ2h0LmRlbGV0ZShmayk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBlbnRyaWVzICh1c2VmdWwgZm9yIHRlc3RpbmcpLlxuICAgKi9cbiAgYXN5bmMgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMucmVkaXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZVBhdHRlcm4oJyonKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZW1vcnkuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ3VycmVudCBpbi1tZW1vcnkgY2FjaGUgc2l6ZSAoZm9yIGRpYWdub3N0aWNzKS4gKi9cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tZW1vcnkuc2l6ZTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGNhY2hlIHNlcnZpY2UgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHByZWZpeCAtIE5hbWVzcGFjZSBwcmVmaXggKGUuZy4sICdjb21wbGlhbmNlOicsICdwbHVnaW46JylcbiAqIEBwYXJhbSBkZWZhdWx0VHRsU2Vjb25kcyAtIERlZmF1bHQgVFRMIGluIHNlY29uZHMgKGRlZmF1bHQgMzAwID0gNSBtaW4pXG4gKiBAcGFyYW0gcmVkaXMgLSBPcHRpb25hbCBSZWRpcyBjbGllbnQgZm9yIGNyb3NzLXByb2Nlc3MgY2FjaGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2FjaGVTZXJ2aWNlKFxuICBwcmVmaXg6IHN0cmluZyxcbiAgZGVmYXVsdFR0bFNlY29uZHMgPSAzMDAsXG4gIHJlZGlzPzogUmVkaXNDYWNoZUNsaWVudCxcbik6IENhY2hlU2VydmljZSB7XG4gIHJldHVybiBuZXcgQ2FjaGVTZXJ2aWNlKHsgcHJlZml4LCBkZWZhdWx0VHRsU2Vjb25kcywgcmVkaXMgfSk7XG59XG4iXX0=
|
|
425
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXBDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBVTdDOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsVUFBVSxDQUFJLEtBQVE7SUFDN0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxJQUFJLENBQUM7UUFDSCxPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQU0sQ0FBQztJQUNoRCxDQUFDO0FBQ0gsQ0FBQztBQWlFRCxNQUFNLDBCQUEwQixHQUFHLGtCQUFrQixDQUFDO0FBRXREOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSwrQkFBK0IsQ0FBQyxTQUFrQztJQUNoRixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDekMsTUFBTSxlQUFlLEdBQW1ELEVBQUUsQ0FBQztJQUMzRSxNQUFNLGNBQWMsR0FBc0IsRUFBRSxDQUFDO0lBRTdDLE1BQU0sTUFBTSxHQUFHLEdBQVMsRUFBRTtRQUN4QixLQUFLLE1BQU0sQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQztnQkFBQyxDQUFDLEVBQUUsQ0FBQztZQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxXQUFXLEdBQUcsR0FBUyxFQUFFO1FBQzdCLEtBQUssT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLDBCQUEwQixDQUFDLENBQUM7YUFDbkUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ3BCLEtBQUssQ0FBQyxDQUFDLEdBQVksRUFBRSxFQUFFO1lBQ3RCLFdBQVcsQ0FBQywyQ0FBMkMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3RCxNQUFNLENBQUMsSUFBSSxDQUFDLG1FQUFtRSxFQUFFO2dCQUMvRSxLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQzthQUN4RCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztJQUVGLFVBQVUsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBZSxFQUFFLEdBQVcsRUFBRSxFQUFFO1FBQ3hELElBQUksT0FBTyxLQUFLLDBCQUEwQjtZQUFFLE9BQU87UUFDbkQsSUFBSSxHQUE2QixDQUFDO1FBQ2xDLElBQUksQ0FBQztZQUNILEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBNkIsQ0FBQztRQUNwRCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTztRQUNULENBQUM7UUFDRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQztnQkFBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSCxVQUFVLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwQyxVQUFVLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQVUsRUFBRSxFQUFFLENBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMscUNBQXFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdHLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxPQUFPO1FBQUUsV0FBVyxFQUFFLENBQUM7SUFFakQsT0FBTztRQUNMLE9BQU8sQ0FBQyxHQUFHO1lBQ1QsS0FBSyxPQUFPLENBQUMsT0FBTyxFQUFFO2lCQUNuQixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQzlFLEtBQUssQ0FBQyxDQUFDLEdBQVksRUFBRSxFQUFFO2dCQUN0QixXQUFXLENBQUMseUNBQXlDLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQy9FLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkVBQTZFLEVBQUU7b0JBQ3pGLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN4RixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFDRCxTQUFTLENBQUMsU0FBUyxFQUFFLFFBQVE7WUFDM0IsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELHlFQUF5RTtBQUN6RSxJQUFJLGtCQUEyRCxDQUFDO0FBRWhFLHFGQUFxRjtBQUNyRixTQUFTLDBCQUEwQjtJQUNqQyxJQUFJLGtCQUFrQixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLG9CQUFvQixDQUEwQixvQkFBb0IsQ0FBQyxDQUFDO1FBQ25GLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsK0JBQStCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMvRSxDQUFDO0lBQ0QsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNmLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztJQUN4RDs7OztPQUlHO0lBQ0ssUUFBUSxHQUFHLElBQUksR0FBRyxFQUE0QixDQUFDO0lBQ3RDLE1BQU0sQ0FBUztJQUNmLFlBQVksQ0FBUztJQUNyQixVQUFVLENBQVM7SUFDbkIsS0FBSyxDQUFvQjtJQUN6QixHQUFHLENBQThCO0lBQ2pDLFVBQVUsR0FBRyxVQUFVLEVBQUUsQ0FBQztJQUMzQzs7OztPQUlHO0lBQ0ssVUFBVSxHQUFHLENBQUMsQ0FBQztJQUV2Qiw4REFBOEQ7SUFDckQsT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBRXJFLFlBQVksTUFBbUI7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNwRCxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDO1FBQzVDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzlILElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUNqQixDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ04sSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPO1lBQ3pFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQyxDQUFDLEVBQ0QsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVELGdGQUFnRjtJQUN4RSxTQUFTLENBQUMsRUFBa0MsRUFBRSxHQUFZO1FBQ2hFLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0csQ0FBQztJQUVELDRGQUE0RjtJQUNwRixzQkFBc0IsQ0FBQyxFQUFrQyxFQUFFLEdBQVk7UUFDN0UsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksRUFBRSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ25CLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEIsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDakIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSxzRUFBc0U7UUFDdEUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN2RyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDbkMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVPLE9BQU8sQ0FBQyxHQUFXO1FBQ3pCLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBSSxHQUFXO1FBQ3RCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0IsSUFBSSxDQUFDO1lBQ0gsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQUMsT0FBTyxJQUFJLENBQUM7Z0JBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDcEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBTSxDQUFDO1lBQzlCLENBQUM7WUFFRCxZQUFZO1lBQ1osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQUMsT0FBTyxJQUFJLENBQUM7WUFBQyxDQUFDO1lBQ25ELElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELHNFQUFzRTtZQUN0RSx5RUFBeUU7WUFDekUsdUVBQXVFO1lBQ3ZFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLHdFQUF3RTtZQUN4RSxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFNLENBQUM7UUFDdEMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUksR0FBVyxFQUFFLEtBQVEsRUFBRSxVQUFtQjtRQUNyRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sR0FBRyxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUVuRCxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMzRCxPQUFPO1lBQ1QsQ0FBQztZQUVELHdFQUF3RTtZQUN4RSwwRUFBMEU7WUFDMUUsMkVBQTJFO1lBQzNFLHFFQUFxRTtZQUNyRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ2pELElBQUksUUFBUTtvQkFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO2dCQUNsQixLQUFLO2dCQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUk7YUFDbkMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLGlDQUFpQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFXO1FBQ25CLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0IsSUFBSSxDQUFDO1lBQ0gsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekIsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxvQ0FBb0M7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBZTtRQUNyQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWpDLElBQUksQ0FBQztZQUNILElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtvQkFDaEMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQ3pCLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3BCLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDNUMsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDckIsQ0FBQztZQUVELGlFQUFpRTtZQUNqRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLE9BQU8sQ0FBQztZQUN0QyxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVELHNFQUFzRTtJQUM5RCxRQUFRLENBQUMsT0FBZTtRQUM5QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFNLENBQUMsVUFBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN2RSxNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFlLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzVELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFJLEdBQVcsRUFBRSxPQUF5QixFQUFFLFVBQW1CO1FBQzNFLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBSSxHQUFHLENBQUMsQ0FBQztRQUN0QyxJQUFJLE1BQU0sS0FBSyxJQUFJO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFFbkMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QiwyRUFBMkU7UUFDM0UseUVBQXlFO1FBQ3pFLHlFQUF5RTtRQUN6RSx5RUFBeUU7UUFDekUsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSw0RUFBNEU7UUFDNUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUEyQixDQUFDO1FBQ2pFLElBQUksUUFBUTtZQUFFLE9BQU8sVUFBVSxDQUFDLE1BQU0sUUFBUSxDQUFDLENBQUM7UUFFaEQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDekIsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLEVBQUUsQ0FBQztZQUM5Qix3RUFBd0U7WUFDeEUsMkRBQTJEO1lBQzNELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxpQkFBaUI7Z0JBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDbEYsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQztZQUNILE9BQU8sVUFBVSxDQUFDLE1BQU0sTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQsc0RBQXNEO0lBQ3RELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxNQUFjLEVBQ2QsaUJBQWlCLEdBQUcsR0FBRyxFQUN2QixLQUF3QjtJQUV4QixPQUFPLElBQUksWUFBWSxDQUFDLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDaEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIExpZ2h0d2VpZ2h0IGNhY2hpbmcgc2VydmljZSB3aXRoIFRUTCBzdXBwb3J0LlxuICpcbiAqIFR3byBpbXBsZW1lbnRhdGlvbnM6XG4gKiAtIEluLW1lbW9yeSAoZGVmYXVsdCk6IHRydWUtTFJVIE1hcCBjYWNoZSwgbm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKiAtIFJlZGlzOiBXaGVuIGEgUmVkaXMgY2xpZW50IGlzIHByb3ZpZGVkLCB1c2VzIFJlZGlzIGZvciBjcm9zcy1wcm9jZXNzIGNhY2hpbmdcbiAqXG4gKiBDcm9zcy1yZXBsaWNhIGludmFsaWRhdGlvbiAoaW4tbWVtb3J5IGJhY2tlbmQpOiBldmVyeSBzZXJ2aWNlIHJ1bnMgc2V2ZXJhbFxuICogcmVwbGljYXMgKEhQQSksIGVhY2ggd2l0aCBpdHMgT1dOIGluLW1lbW9yeSBjYWNoZS4gQW4gaW52YWxpZGF0aW9uIHBlcmZvcm1lZCBvblxuICogb25lIHBvZCAoYGRlbGAgLyBgaW52YWxpZGF0ZVBhdHRlcm5gIC8gYGNsZWFyYCkgaXMgYnJvYWRjYXN0IG92ZXIgUmVkaXMgcHViL3N1YlxuICogKHtAbGluayBDYWNoZUludmFsaWRhdGlvbkJ1c30sIHdpcmVkIGZyb20gdGhlIGFtYmllbnQgUmVkaXMgZW52IGJ5IGRlZmF1bHQpIGFuZFxuICogYXBwbGllZCBieSBldmVyeSBvdGhlciBwb2QsIHNvIGEgd3JpdGUgb24gcG9kIEEgY2FuJ3QgbGVhdmUgcG9kIEIgc2VydmluZyB0aGVcbiAqIHN0YWxlIGVudHJ5IHVudGlsIGl0cyBUVEwgbGFwc2VzLiBBIHBvZCB3aG9zZSBzdWJzY3JpYmVyIChyZSljb25uZWN0cyBmbHVzaGVzXG4gKiBpdHMgbG9jYWwgY2FjaGUg4oCUIGl0IG1heSBoYXZlIG1pc3NlZCBpbnZhbGlkYXRpb25zIHdoaWxlIGRpc2Nvbm5lY3RlZCDigJQgYW5kIGFcbiAqIGBnZXRPclNldGAgd2hvc2UgZmFjdG9yeSByYWNlZCBhbiBpbnZhbGlkYXRpb24gZG9lcyBub3QgY2FjaGUgaXRzIHJlc3VsdC5cbiAqXG4gKiBEZXNpZ246XG4gKiAtIEFsbCBvcGVyYXRpb25zIGFyZSBmYWlsLXNhZmU6IGNhY2hlIG1pc3Nlcy9lcnJvcnMgcmV0dXJuIG51bGwsIG5ldmVyIHRocm93XG4gKiAtIEpTT04gc2VyaWFsaXphdGlvbiBmb3IgUmVkaXM7IHRoZSBpbi1tZW1vcnkgYmFja2VuZCBkZWVwLWNsb25lcyBvbiByZWFkIHNvXG4gKiAgIGJvdGggYmFja2VuZHMgcmV0dXJuIGFuIGluZGVwZW5kZW50IGNvcHkgKG11dGF0aW5nIGEgcmVzdWx0IGlzIGFsd2F5cyBzYWZlKVxuICogLSBgZ2V0T3JTZXRgIGlzIHNpbmdsZS1mbGlnaHQ6IGNvbmN1cnJlbnQgbWlzc2VzIHNoYXJlIG9uZSBmYWN0b3J5KCkgY2FsbFxuICogLSBLZXkgbmFtZXNwYWNlIHByZWZpeGluZyB0byBhdm9pZCBjb2xsaXNpb25zIGJldHdlZW4gc2VydmljZXNcbiAqL1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnY3J5cHRvJztcblxuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNDbGllbnQgfSBmcm9tICcuL2Vudi1yZWRpcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignY2FjaGUtc2VydmljZScpO1xuXG4vKipcbiAqIENhY2hlIGVudHJ5IHdpdGggdmFsdWUgYW5kIGV4cGlyYXRpb24gdGltZS5cbiAqL1xuaW50ZXJmYWNlIENhY2hlRW50cnk8VD4ge1xuICB2YWx1ZTogVDtcbiAgZXhwaXJlc0F0OiBudW1iZXI7IC8vIFVuaXggdGltZXN0YW1wIGluIG1zXG59XG5cbi8qKlxuICogRGVlcC1jbG9uZSBhIHZhbHVlIHNvIHRoZSBpbi1tZW1vcnkgYmFja2VuZCBoYW5kcyBiYWNrIGFuIElOREVQRU5ERU5UIGNvcHkgb25cbiAqIGV2ZXJ5IHJlYWQg4oCUIG1hdGNoaW5nIHRoZSBSZWRpcyBiYWNrZW5kLCB3aGljaCByZXR1cm5zIGEgZnJlc2ggYEpTT04ucGFyc2VgXG4gKiBjbG9uZSBlYWNoIHRpbWUuIFdpdGhvdXQgdGhpcyB0aGUgaW4tbWVtb3J5IGNhY2hlIHJldHVybnMgdGhlIHNhbWUgc3RvcmVkXG4gKiBvYmplY3QgcmVmZXJlbmNlLCBzbyBhIGNvbnN1bWVyIG11dGF0aW5nIGEgXCJjYWNoZWRcIiBvYmplY3Qgc2lsZW50bHkgY29ycnVwdHNcbiAqIHRoZSBzaGFyZWQgY2FjaGUgKGEgZm9vdGd1biB0aGF0IG9ubHkgYml0ZXMgdW5kZXIgdGhlIG1lbW9yeSBiYWNrZW5kKS5cbiAqXG4gKiBQcmltaXRpdmVzIGFyZSByZXR1cm5lZCBhcy1pcy4gUHJlZmVycyB0aGUgc3RydWN0dXJlZC1jbG9uZSBhbGdvcml0aG07IGZhbGxzXG4gKiBiYWNrIHRvIGEgSlNPTiByb3VuZC10cmlwIG9uIG9sZGVyIHJ1bnRpbWVzIG9yIGV4b3RpYyB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGNsb25lVmFsdWU8VD4odmFsdWU6IFQpOiBUIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB2YWx1ZTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpKSBhcyBUO1xuICB9XG59XG5cbi8qKlxuICogTWluaW1hbCBSZWRpcy1saWtlIGNsaWVudCBpbnRlcmZhY2UgKHN1YnNldCBvZiBpb3JlZGlzKS5cbiAqIFNlcnZpY2VzIHBhc3MgdGhlaXIgb3duIFJlZGlzIGNsaWVudCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRpc0NhY2hlQ2xpZW50IHtcbiAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHVua25vd24+O1xuICBkZWwoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPG51bWJlcj47XG4gIGtleXMocGF0dGVybjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT47XG4gIC8qKiBTQ0FOLWJhc2VkIGl0ZXJhdGlvbiAocHJlZmVycmVkIG92ZXIgS0VZUyBmb3IgcHJvZHVjdGlvbikuICovXG4gIHNjYW5TdHJlYW0/KG9wdGlvbnM6IHsgbWF0Y2g6IHN0cmluZzsgY291bnQ/OiBudW1iZXIgfSk6IE5vZGVKUy5SZWFkYWJsZVN0cmVhbTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWNoZUNvbmZpZyB7XG4gIC8qKiBLZXkgcHJlZml4IGZvciBuYW1lc3BhY2UgaXNvbGF0aW9uIChlLmcuLCAncGx1Z2luOicsICdjb21wbGlhbmNlOicpICovXG4gIHByZWZpeDogc3RyaW5nO1xuICAvKiogRGVmYXVsdCBUVEwgaW4gc2Vjb25kcyAqL1xuICBkZWZhdWx0VHRsU2Vjb25kczogbnVtYmVyO1xuICAvKiogTWF4IGVudHJpZXMgZm9yIGluLW1lbW9yeSBjYWNoZSAoZGVmYXVsdCAxMDAwKSAqL1xuICBtYXhFbnRyaWVzPzogbnVtYmVyO1xuICAvKiogT3B0aW9uYWwgUmVkaXMgY2xpZW50IOKAlCB1c2VzIGluLW1lbW9yeSBjYWNoZSBpZiBub3QgcHJvdmlkZWQgKi9cbiAgcmVkaXM/OiBSZWRpc0NhY2hlQ2xpZW50O1xuICAvKipcbiAgICogQ3Jvc3MtcmVwbGljYSBpbnZhbGlkYXRpb24gYnVzIGZvciB0aGUgaW4tbWVtb3J5IGJhY2tlbmQuIE9taXQgdG8gdXNlIHRoZVxuICAgKiBzaGFyZWQgZW52LVJlZGlzIGJ1cyAobnVsbCB3aGVuIFJlZGlzIGlzbid0IGNvbmZpZ3VyZWQg4oaSIHNpbmdsZS1wcm9jZXNzXG4gICAqIHNlbWFudGljcyk7IHBhc3MgYG51bGxgIHRvIGRpc2FibGUgZXhwbGljaXRseS4gSWdub3JlZCB3aXRoIGByZWRpc2AgKHRoZVxuICAgKiBzdG9yZSBpdHNlbGYgaXMgc2hhcmVkLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGZhbiBvdXQpLlxuICAgKi9cbiAgaW52YWxpZGF0aW9uQnVzPzogQ2FjaGVJbnZhbGlkYXRpb25CdXMgfCBudWxsO1xufVxuXG4vKiogT25lIGludmFsaWRhdGlvbiBicm9hZGNhc3QgdG8gZXZlcnkgcmVwbGljYS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVJbnZhbGlkYXRpb25NZXNzYWdlIHtcbiAgLyoqIElkIG9mIHRoZSBDYWNoZVNlcnZpY2UgaW5zdGFuY2UgdGhhdCBpbnZhbGlkYXRlZCAoaXQgaWdub3JlcyBpdHMgb3duIGVjaG8pLiAqL1xuICBvcmlnaW46IHN0cmluZztcbiAgLyoqIFRoZSBjYWNoZSBuYW1lc3BhY2UgKGBDYWNoZUNvbmZpZy5wcmVmaXhgKSB0aGUgaW52YWxpZGF0aW9uIGFwcGxpZXMgdG8uICovXG4gIHByZWZpeDogc3RyaW5nO1xuICBvcDogJ2RlbCcgfCAncGF0dGVybicgfCAnY2xlYXInO1xuICAvKiogVW4tcHJlZml4ZWQga2V5IChgZGVsYCkgb3IgZ2xvYiBwYXR0ZXJuIChgcGF0dGVybmApLiAqL1xuICBrZXk/OiBzdHJpbmc7XG59XG5cbi8qKiBUcmFuc3BvcnQgdGhhdCBmYW5zIGNhY2hlIGludmFsaWRhdGlvbnMgb3V0IHRvIGV2ZXJ5IHJlcGxpY2EuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlSW52YWxpZGF0aW9uQnVzIHtcbiAgLyoqIEZpcmUtYW5kLWZvcmdldCBicm9hZGNhc3QuIE5ldmVyIHRocm93cy4gKi9cbiAgcHVibGlzaChtc2c6IENhY2hlSW52YWxpZGF0aW9uTWVzc2FnZSk6IHZvaWQ7XG4gIC8qKlxuICAgKiBSZWdpc3RlciBoYW5kbGVycy4gYG9uTWVzc2FnZWAgcmVjZWl2ZXMgZXZlcnkgYnJvYWRjYXN0IChpbmNsdWRpbmcgdGhpc1xuICAgKiBwcm9jZXNzJ3Mgb3duKTsgYG9uUmVzeW5jYCBmaXJlcyB3aGVuZXZlciB0aGUgc3Vic2NyaXB0aW9uIGlzIChyZSllc3RhYmxpc2hlZCxcbiAgICogaS5lLiB3aGVuZXZlciBpbnZhbGlkYXRpb25zIG1heSBoYXZlIGJlZW4gbWlzc2VkLlxuICAgKi9cbiAgc3Vic2NyaWJlKG9uTWVzc2FnZTogKG1zZzogQ2FjaGVJbnZhbGlkYXRpb25NZXNzYWdlKSA9PiB2b2lkLCBvblJlc3luYzogKCkgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbi8qKiBNaW5pbWFsIGlvcmVkaXMgcHViL3N1YiBzdXJmYWNlIHRoZSBlbnYgYnVzIG5lZWRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRpc0ludmFsaWRhdGlvbkNsaWVudCB7XG4gIHB1Ymxpc2goY2hhbm5lbDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG4gIHN1YnNjcmliZSguLi5jaGFubmVsczogc3RyaW5nW10pOiBQcm9taXNlPHVua25vd24+O1xuICBvbihldmVudDogc3RyaW5nLCBjYjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdW5rbm93bjtcbiAgZHVwbGljYXRlKCk6IFJlZGlzSW52YWxpZGF0aW9uQ2xpZW50O1xuICBzdGF0dXM/OiBzdHJpbmc7XG59XG5cbmNvbnN0IENBQ0hFX0lOVkFMSURBVElPTl9DSEFOTkVMID0gJ2NhY2hlOmludmFsaWRhdGUnO1xuXG4vKipcbiAqIFJlZGlzIHB1Yi9zdWIgaW52YWxpZGF0aW9uIGJ1cy4gUFVCTElTSCBvbiB0aGUgZ2l2ZW4gY2xpZW50OyBTVUJTQ1JJQkUgb24gYVxuICogYGR1cGxpY2F0ZSgpYCAoYSBzdWJzY3JpYmVkIGlvcmVkaXMgY29ubmVjdGlvbiBjYW4ndCBydW4gb3RoZXIgY29tbWFuZHMpLlxuICpcbiAqIFRoZSBTVUJTQ1JJQkUgaXMgaXNzdWVkIG9uIGV2ZXJ5IGByZWFkeWAgKGluaXRpYWwgY29ubmVjdCBBTkQgZWFjaCByZWNvbm5lY3QpXG4gKiByYXRoZXIgdGhhbiBvbmNlIGF0IGNvbnN0cnVjdGlvbjogdGhlIGVudiBjbGllbnQgcnVucyB3aXRob3V0IGFuIG9mZmxpbmVcbiAqIHF1ZXVlLCBzbyBhIHN1YnNjcmliZSBpc3N1ZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIGlzIHVwIGlzIHJlamVjdGVkIGFuZCB3b3VsZFxuICogbmV2ZXIgYmUgcmV0cmllZC4gRWFjaCBgcmVhZHlgIGFsc28gdHJpZ2dlcnMgYG9uUmVzeW5jYCBzbyBldmVyeSBjYWNoZSBmbHVzaGVzXG4gKiB3aGF0ZXZlciBpdCBtYXkgaGF2ZSBtaXNzZWQgd2hpbGUgZGlzY29ubmVjdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNDYWNoZUludmFsaWRhdGlvbkJ1cyhwdWJsaXNoZXI6IFJlZGlzSW52YWxpZGF0aW9uQ2xpZW50KTogQ2FjaGVJbnZhbGlkYXRpb25CdXMge1xuICBjb25zdCBzdWJzY3JpYmVyID0gcHVibGlzaGVyLmR1cGxpY2F0ZSgpO1xuICBjb25zdCBtZXNzYWdlSGFuZGxlcnM6IEFycmF5PChtc2c6IENhY2hlSW52YWxpZGF0aW9uTWVzc2FnZSkgPT4gdm9pZD4gPSBbXTtcbiAgY29uc3QgcmVzeW5jSGFuZGxlcnM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgY29uc3QgcmVzeW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgaCBvZiByZXN5bmNIYW5kbGVycykge1xuICAgICAgdHJ5IHsgaCgpOyB9IGNhdGNoIHsgLyogaXNvbGF0ZWQgKi8gfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgZG9TdWJzY3JpYmUgPSAoKTogdm9pZCA9PiB7XG4gICAgdm9pZCBQcm9taXNlLnJlc29sdmUoc3Vic2NyaWJlci5zdWJzY3JpYmUoQ0FDSEVfSU5WQUxJREFUSU9OX0NIQU5ORUwpKVxuICAgICAgLnRoZW4oKCkgPT4gcmVzeW5jKCkpXG4gICAgICAuY2F0Y2goKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICBlbWl0Q291bnRlcignY2FjaGVfaW52YWxpZGF0aW9uX3N1YnNjcmliZV9mYWlsZWRfdG90YWwnLCB7fSk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdDYWNoZSBpbnZhbGlkYXRpb24gc3Vic2NyaWJlIGZhaWxlZDsgd2lsbCByZXRyeSBvbiBuZXh0IHJlY29ubmVjdCcsIHtcbiAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9O1xuXG4gIHN1YnNjcmliZXIub24oJ21lc3NhZ2UnLCAoY2hhbm5lbDogc3RyaW5nLCByYXc6IHN0cmluZykgPT4ge1xuICAgIGlmIChjaGFubmVsICE9PSBDQUNIRV9JTlZBTElEQVRJT05fQ0hBTk5FTCkgcmV0dXJuO1xuICAgIGxldCBtc2c6IENhY2hlSW52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICB0cnkge1xuICAgICAgbXNnID0gSlNPTi5wYXJzZShyYXcpIGFzIENhY2hlSW52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBoIG9mIG1lc3NhZ2VIYW5kbGVycykge1xuICAgICAgdHJ5IHsgaChtc2cpOyB9IGNhdGNoIHsgLyogb25lIGNhY2hlIGNhbid0IGJyZWFrIHRoZSBvdGhlcnMgKi8gfVxuICAgIH1cbiAgfSk7XG4gIHN1YnNjcmliZXIub24oJ3JlYWR5JywgZG9TdWJzY3JpYmUpO1xuICBzdWJzY3JpYmVyLm9uKCdlcnJvcicsIChlOiB1bmtub3duKSA9PlxuICAgIGxvZ2dlci53YXJuKCdDYWNoZSBpbnZhbGlkYXRpb24gc3Vic2NyaWJlciBlcnJvcicsIHsgZXJyb3I6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSB9KSk7XG4gIGlmIChzdWJzY3JpYmVyLnN0YXR1cyA9PT0gJ3JlYWR5JykgZG9TdWJzY3JpYmUoKTtcblxuICByZXR1cm4ge1xuICAgIHB1Ymxpc2gobXNnKSB7XG4gICAgICB2b2lkIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIC50aGVuKCgpID0+IHB1Ymxpc2hlci5wdWJsaXNoKENBQ0hFX0lOVkFMSURBVElPTl9DSEFOTkVMLCBKU09OLnN0cmluZ2lmeShtc2cpKSlcbiAgICAgICAgLmNhdGNoKChlcnI6IHVua25vd24pID0+IHtcbiAgICAgICAgICBlbWl0Q291bnRlcignY2FjaGVfaW52YWxpZGF0aW9uX3B1Ymxpc2hfZmFpbGVkX3RvdGFsJywgeyBwcmVmaXg6IG1zZy5wcmVmaXggfSk7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0NhY2hlIGludmFsaWRhdGlvbiBwdWJsaXNoIGZhaWxlZCAob3RoZXIgcmVwbGljYXMga2VlcCB0aGUgZW50cnkgdW50aWwgVFRMKScsIHtcbiAgICAgICAgICAgIHByZWZpeDogbXNnLnByZWZpeCwgb3A6IG1zZy5vcCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBzdWJzY3JpYmUob25NZXNzYWdlLCBvblJlc3luYykge1xuICAgICAgbWVzc2FnZUhhbmRsZXJzLnB1c2gob25NZXNzYWdlKTtcbiAgICAgIHJlc3luY0hhbmRsZXJzLnB1c2gob25SZXN5bmMpO1xuICAgIH0sXG4gIH07XG59XG5cbi8vIHVuZGVmaW5lZCA9IG5vdCB5ZXQgYXR0ZW1wdGVkOyBudWxsID0gYXR0ZW1wdGVkLCBSZWRpcyBub3QgY29uZmlndXJlZC5cbmxldCBlbnZJbnZhbGlkYXRpb25CdXM6IENhY2hlSW52YWxpZGF0aW9uQnVzIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuLyoqIFByb2Nlc3Mtd2lkZSBpbnZhbGlkYXRpb24gYnVzIGZyb20gdGhlIGFtYmllbnQgUmVkaXMgZW52IChudWxsIHdpdGhvdXQgUmVkaXMpLiAqL1xuZnVuY3Rpb24gZ2V0RW52Q2FjaGVJbnZhbGlkYXRpb25CdXMoKTogQ2FjaGVJbnZhbGlkYXRpb25CdXMgfCBudWxsIHtcbiAgaWYgKGVudkludmFsaWRhdGlvbkJ1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2xpZW50ID0gY3JlYXRlRW52UmVkaXNDbGllbnQ8UmVkaXNJbnZhbGlkYXRpb25DbGllbnQ+KCdjYWNoZS1pbnZhbGlkYXRpb24nKTtcbiAgICBlbnZJbnZhbGlkYXRpb25CdXMgPSBjbGllbnQgPyBjcmVhdGVSZWRpc0NhY2hlSW52YWxpZGF0aW9uQnVzKGNsaWVudCkgOiBudWxsO1xuICB9XG4gIHJldHVybiBlbnZJbnZhbGlkYXRpb25CdXM7XG59XG5cbi8qKlxuICogQ2FjaGUgc2VydmljZSB3aXRoIGdldC9zZXQvZGVsIG9wZXJhdGlvbnMgYW5kIGF1dG9tYXRpYyBUVEwgZXhwaXJ5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZVNlcnZpY2UoeyBwcmVmaXg6ICdwbHVnaW46JywgZGVmYXVsdFR0bFNlY29uZHM6IDMwMCB9KTtcbiAqXG4gKiAvLyBTZXQgd2l0aCBkZWZhdWx0IFRUTFxuICogYXdhaXQgY2FjaGUuc2V0KCdvcmcxMjM6bGlzdCcsIHBsdWdpbnMpO1xuICpcbiAqIC8vIEdldCAocmV0dXJucyBudWxsIG9uIG1pc3MpXG4gKiBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZS5nZXQ8UGx1Z2luW10+KCdvcmcxMjM6bGlzdCcpO1xuICpcbiAqIC8vIEludmFsaWRhdGVcbiAqIGF3YWl0IGNhY2hlLmRlbCgnb3JnMTIzOmxpc3QnKTtcbiAqXG4gKiAvLyBJbnZhbGlkYXRlIGJ5IHBhdHRlcm5cbiAqIGF3YWl0IGNhY2hlLmludmFsaWRhdGVQYXR0ZXJuKCdvcmcxMjM6KicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWNoZVNlcnZpY2Uge1xuICBwcml2YXRlIG1lbW9yeSA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZUVudHJ5PHVua25vd24+PigpO1xuICAvKipcbiAgICogSW4tZmxpZ2h0IGBnZXRPclNldGAgZmFjdG9yeSBwcm9taXNlcywga2V5ZWQgYnkgZnVsbCBjYWNoZSBrZXkuIENvYWxlc2Nlc1xuICAgKiBjb25jdXJyZW50IGNvbGQgY2FsbGVycyBvbnRvIGEgc2luZ2xlIGBmYWN0b3J5KClgIGludm9jYXRpb24gKHNpbmdsZS1mbGlnaHRcbiAgICogLyBzdGFtcGVkZSBwcm90ZWN0aW9uKTsgZW50cmllcyBhcmUgY2xlYXJlZCBvbmNlIHRoZSBwcm9taXNlIHNldHRsZXMuXG4gICAqL1xuICBwcml2YXRlIGluZmxpZ2h0ID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFR0bE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4RW50cmllczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZGlzPzogUmVkaXNDYWNoZUNsaWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBidXM6IENhY2hlSW52YWxpZGF0aW9uQnVzIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZUlkID0gcmFuZG9tVVVJRCgpO1xuICAvKipcbiAgICogQnVtcGVkIG9uIEVWRVJZIGludmFsaWRhdGlvbiAobG9jYWwgb3IgcmVtb3RlKS4gYGdldE9yU2V0YCBvbmx5IGNhY2hlcyBhXG4gICAqIGZhY3RvcnkgcmVzdWx0IGlmIG5vIGludmFsaWRhdGlvbiBoYXBwZW5lZCB3aGlsZSB0aGUgZmFjdG9yeSByYW4g4oCUIG90aGVyd2lzZVxuICAgKiBpdCBjb3VsZCByZS1jYWNoZSBhIHZhbHVlIHJlYWQgYmVmb3JlIHRoZSB3cml0ZSB0aGF0IGludmFsaWRhdGVkIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0aW9uID0gMDtcblxuICAvKiogQ2FjaGUgbWV0cmljcyDigJQgdHJhY2tzIGhpdHMsIG1pc3NlcywgYW5kIGludmFsaWRhdGlvbnMuICovXG4gIHJlYWRvbmx5IG1ldHJpY3MgPSB7IGhpdHM6IDAsIG1pc3NlczogMCwgc2V0czogMCwgaW52YWxpZGF0aW9uczogMCB9O1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ2FjaGVDb25maWcpIHtcbiAgICB0aGlzLnByZWZpeCA9IGNvbmZpZy5wcmVmaXg7XG4gICAgdGhpcy5kZWZhdWx0VHRsTXMgPSBjb25maWcuZGVmYXVsdFR0bFNlY29uZHMgKiAxMDAwO1xuICAgIHRoaXMubWF4RW50cmllcyA9IGNvbmZpZy5tYXhFbnRyaWVzID8/IDEwMDA7XG4gICAgdGhpcy5yZWRpcyA9IGNvbmZpZy5yZWRpcztcbiAgICB0aGlzLmJ1cyA9IHRoaXMucmVkaXMgPyBudWxsIDogKGNvbmZpZy5pbnZhbGlkYXRpb25CdXMgPT09IHVuZGVmaW5lZCA/IGdldEVudkNhY2hlSW52YWxpZGF0aW9uQnVzKCkgOiBjb25maWcuaW52YWxpZGF0aW9uQnVzKTtcbiAgICB0aGlzLmJ1cz8uc3Vic2NyaWJlKFxuICAgICAgKG1zZykgPT4ge1xuICAgICAgICBpZiAobXNnLm9yaWdpbiA9PT0gdGhpcy5pbnN0YW5jZUlkIHx8IG1zZy5wcmVmaXggIT09IHRoaXMucHJlZml4KSByZXR1cm47XG4gICAgICAgIHRoaXMuYXBwbHlMb2NhbEludmFsaWRhdGlvbihtc2cub3AsIG1zZy5rZXkpO1xuICAgICAgfSxcbiAgICAgICgpID0+IHRoaXMuYXBwbHlMb2NhbEludmFsaWRhdGlvbignY2xlYXInKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEJyb2FkY2FzdCBhbiBpbnZhbGlkYXRpb24gdG8gdGhlIG90aGVyIHJlcGxpY2FzIChpbi1tZW1vcnkgYmFja2VuZCBvbmx5KS4gKi9cbiAgcHJpdmF0ZSBicm9hZGNhc3Qob3A6IENhY2hlSW52YWxpZGF0aW9uTWVzc2FnZVsnb3AnXSwga2V5Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5idXM/LnB1Ymxpc2goeyBvcmlnaW46IHRoaXMuaW5zdGFuY2VJZCwgcHJlZml4OiB0aGlzLnByZWZpeCwgb3AsIC4uLihrZXkgIT09IHVuZGVmaW5lZCAmJiB7IGtleSB9KSB9KTtcbiAgfVxuXG4gIC8qKiBBcHBseSBhbiBpbnZhbGlkYXRpb24gdG8gVEhJUyBwcm9jZXNzJ3MgaW4tbWVtb3J5IGVudHJpZXMuIFJldHVybnMgdGhlIGNvdW50IHJlbW92ZWQuICovXG4gIHByaXZhdGUgYXBwbHlMb2NhbEludmFsaWRhdGlvbihvcDogQ2FjaGVJbnZhbGlkYXRpb25NZXNzYWdlWydvcCddLCBrZXk/OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHRoaXMuZ2VuZXJhdGlvbisrO1xuICAgIGlmIChvcCA9PT0gJ2NsZWFyJykge1xuICAgICAgY29uc3QgbiA9IHRoaXMubWVtb3J5LnNpemU7XG4gICAgICB0aGlzLm1lbW9yeS5jbGVhcigpO1xuICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIGlmIChvcCA9PT0gJ2RlbCcpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5kZWxldGUodGhpcy5mdWxsS2V5KGtleSA/PyAnJykpID8gMSA6IDA7XG4gICAgfVxuICAgIC8vIEdsb2IgcGF0dGVybi4gRXNjYXBlIHJlZ2V4IG1ldGFjaGFyYWN0ZXJzIGZpcnN0IHNvIGEgbGl0ZXJhbCBgLmAvYChgL2BbYFxuICAgIC8vIGluIGEga2V5IHByZWZpeCAoZS5nLiBgb3JnOnYxLjI6KmApIGNhbid0IG92ZXItbWF0Y2ggb3IgdGhyb3cgKGEgdGhyb3dcbiAgICAvLyBoZXJlIHdvdWxkIGxlYXZlIGVudHJpZXMgc3RhbGUpOyBvbmx5IGAqYCBpcyB0cmVhdGVkIGFzIGEgd2lsZGNhcmQuXG4gICAgY29uc3QgZnAgPSB0aGlzLmZ1bGxLZXkoa2V5ID8/ICcnKTtcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgZnAucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKS5yZXBsYWNlKC9cXFxcXFwqL2csICcuKicpICsgJyQnKTtcbiAgICBsZXQgZGVsZXRlZCA9IDA7XG4gICAgZm9yIChjb25zdCBrIG9mIHRoaXMubWVtb3J5LmtleXMoKSkge1xuICAgICAgaWYgKHJlZ2V4LnRlc3QoaykpIHtcbiAgICAgICAgdGhpcy5tZW1vcnkuZGVsZXRlKGspO1xuICAgICAgICBkZWxldGVkKys7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBmdWxsS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9JHtrZXl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBjYWNoZWQgdmFsdWUuIFJldHVybnMgbnVsbCBvbiBtaXNzIG9yIGVycm9yLlxuICAgKlxuICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYW4gSU5ERVBFTkRFTlQgZGVlcCBjb3B5IOKAlCBtdXRhdGluZyBpdCBuZXZlciBhZmZlY3RzXG4gICAqIHRoZSBjYWNoZWQgZW50cnkgKHRoZSBpbi1tZW1vcnkgYmFja2VuZCBjbG9uZXMgb24gcmVhZCBmb3IgcGFyaXR5IHdpdGhcbiAgICogUmVkaXMsIHdoaWNoIHJldHVybnMgYSBmcmVzaCBKU09OIGNsb25lKS4gQ2FsbGVycyBtYXkgc3RpbGwgdHJlYXQgcmVzdWx0cyBhc1xuICAgKiBpbW11dGFibGUsIGJ1dCBkb2luZyBzbyBpcyBubyBsb25nZXIgbG9hZC1iZWFyaW5nIGZvciBjYWNoZSBpbnRlZ3JpdHkuXG4gICAqL1xuICBhc3luYyBnZXQ8VD4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgY29uc3QgZmsgPSB0aGlzLmZ1bGxLZXkoa2V5KTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5yZWRpcykge1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCB0aGlzLnJlZGlzLmdldChmayk7XG4gICAgICAgIGlmICghcmF3KSB7IHRoaXMubWV0cmljcy5taXNzZXMrKzsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgdGhpcy5tZXRyaWNzLmhpdHMrKztcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBUO1xuICAgICAgfVxuXG4gICAgICAvLyBJbi1tZW1vcnlcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5tZW1vcnkuZ2V0KGZrKTtcbiAgICAgIGlmICghZW50cnkpIHsgdGhpcy5tZXRyaWNzLm1pc3NlcysrOyByZXR1cm4gbnVsbDsgfVxuICAgICAgaWYgKERhdGUubm93KCkgPiBlbnRyeS5leHBpcmVzQXQpIHtcbiAgICAgICAgdGhpcy5tZW1vcnkuZGVsZXRlKGZrKTtcbiAgICAgICAgdGhpcy5tZXRyaWNzLm1pc3NlcysrO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIExSVSB0b3VjaDogZGVsZXRlICsgcmUtaW5zZXJ0IG1vdmVzIHRoaXMga2V5IHRvIHRoZSBuZXdlc3QgcG9zaXRpb25cbiAgICAgIC8vIChNYXAgcHJlc2VydmVzIGluc2VydGlvbiBvcmRlciksIHNvIGBzZXRgJ3Mgb2xkZXN0LWZpcnN0IGV2aWN0aW9uIGlzIGFcbiAgICAgIC8vIHRydWUgbGVhc3QtcmVjZW50bHktVVNFRCBldmljdGlvbiByYXRoZXIgdGhhbiBmaXJzdC1pbnNlcnRlZCAoRklGTykuXG4gICAgICB0aGlzLm1lbW9yeS5kZWxldGUoZmspO1xuICAgICAgdGhpcy5tZW1vcnkuc2V0KGZrLCBlbnRyeSk7XG4gICAgICB0aGlzLm1ldHJpY3MuaGl0cysrO1xuICAgICAgLy8gQ2xvbmUgc28gYSBjYWxsZXIgbXV0YXRpbmcgdGhlIHJlc3VsdCBjYW4ndCBjb3JydXB0IHRoZSBzaGFyZWQgZW50cnkuXG4gICAgICByZXR1cm4gY2xvbmVWYWx1ZShlbnRyeS52YWx1ZSkgYXMgVDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMubWV0cmljcy5taXNzZXMrKztcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBjYWNoZWQgdmFsdWUgd2l0aCBvcHRpb25hbCBUVEwgb3ZlcnJpZGUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBDYWNoZSBrZXkgKHByZWZpeCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5KVxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjYWNoZSAobXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZSBmb3IgUmVkaXMpXG4gICAqIEBwYXJhbSB0dGxTZWNvbmRzIC0gVFRMIG92ZXJyaWRlICh1c2VzIGRlZmF1bHQgaWYgbm90IHByb3ZpZGVkKVxuICAgKi9cbiAgYXN5bmMgc2V0PFQ+KGtleTogc3RyaW5nLCB2YWx1ZTogVCwgdHRsU2Vjb25kcz86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZrID0gdGhpcy5mdWxsS2V5KGtleSk7XG4gICAgY29uc3QgdHRsID0gdHRsU2Vjb25kcyA/PyB0aGlzLmRlZmF1bHRUdGxNcyAvIDEwMDA7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5tZXRyaWNzLnNldHMrKztcbiAgICAgIGlmICh0aGlzLnJlZGlzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVkaXMuc2V0KGZrLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSksICdFWCcsIHR0bCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSW4tbWVtb3J5IOKAlCBhIHdyaXRlIGNvdW50cyBhcyBhIHVzZSwgc28gZHJvcCBhbnkgZXhpc3RpbmcgZW50cnkgZmlyc3RcbiAgICAgIC8vIGFuZCByZS1pbnNlcnQgYmVsb3cgYXMgdGhlIG5ld2VzdCAoTWFwIHByZXNlcnZlcyBpbnNlcnRpb24gb3JkZXIpLiBUaGlzXG4gICAgICAvLyBrZWVwcyB0aGUgTWFwIG9yZGVyZWQgb2xkZXN0LVVTRUQg4oaSIG5ld2VzdC1VU0VEIHNvIHRoZSBldmljdGlvbiBiZWxvdyBpc1xuICAgICAgLy8gdHJ1ZSBMUlUsIGFuZCBhdm9pZHMgZXZpY3RpbmcgYSB2aWN0aW0gd2hlbiBtZXJlbHkgdXBkYXRpbmcgYSBrZXkuXG4gICAgICB0aGlzLm1lbW9yeS5kZWxldGUoZmspO1xuICAgICAgaWYgKHRoaXMubWVtb3J5LnNpemUgPj0gdGhpcy5tYXhFbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5tZW1vcnkua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgaWYgKGZpcnN0S2V5KSB0aGlzLm1lbW9yeS5kZWxldGUoZmlyc3RLZXkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1lbW9yeS5zZXQoZmssIHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIHR0bCAqIDEwMDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENhY2hlIHNldCBmYWlsdXJlIGlzIG5vbi1mYXRhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBjYWNoZWQgdmFsdWUuXG4gICAqL1xuICBhc3luYyBkZWwoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmayA9IHRoaXMuZnVsbEtleShrZXkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnJlZGlzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVkaXMuZGVsKGZrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5hcHBseUxvY2FsSW52YWxpZGF0aW9uKCdkZWwnLCBrZXkpO1xuICAgICAgdGhpcy5icm9hZGNhc3QoJ2RlbCcsIGtleSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDYWNoZSBkZWxldGUgZmFpbHVyZSBpcyBub24tZmF0YWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52YWxpZGF0ZSBhbGwga2V5cyBtYXRjaGluZyBhIHBhdHRlcm4gKGUuZy4sICdvcmcxMjM6KicpLlxuICAgKiBVc2VzIFNDQU4gZm9yIFJlZGlzIChub24tYmxvY2tpbmcpIHdpdGggS0VZUyBmYWxsYmFjaywgb3IgcmVnZXggZm9yIGluLW1lbW9yeS5cbiAgICovXG4gIGFzeW5jIGludmFsaWRhdGVQYXR0ZXJuKHBhdHRlcm46IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgZnAgPSB0aGlzLmZ1bGxLZXkocGF0dGVybik7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMucmVkaXMpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IHRoaXMucmVkaXMuc2NhblN0cmVhbVxuICAgICAgICAgID8gYXdhaXQgdGhpcy5zY2FuS2V5cyhmcClcbiAgICAgICAgICA6IGF3YWl0IHRoaXMucmVkaXMua2V5cyhmcCk7XG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZGlzLmRlbCguLi5rZXlzKTtcbiAgICAgICAgICB0aGlzLm1ldHJpY3MuaW52YWxpZGF0aW9ucyArPSBrZXlzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5cy5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIC8vIEluLW1lbW9yeSDigJQgYXBwbHkgbG9jYWxseSwgdGhlbiBmYW4gb3V0IHRvIHRoZSBvdGhlciByZXBsaWNhcy5cbiAgICAgIGNvbnN0IGRlbGV0ZWQgPSB0aGlzLmFwcGx5TG9jYWxJbnZhbGlkYXRpb24oJ3BhdHRlcm4nLCBwYXR0ZXJuKTtcbiAgICAgIHRoaXMuYnJvYWRjYXN0KCdwYXR0ZXJuJywgcGF0dGVybik7XG4gICAgICB0aGlzLm1ldHJpY3MuaW52YWxpZGF0aW9ucyArPSBkZWxldGVkO1xuICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICAvKiogQ29sbGVjdCBrZXlzIHZpYSBSZWRpcyBTQ0FOIChub24tYmxvY2tpbmcgYWx0ZXJuYXRpdmUgdG8gS0VZUykuICovXG4gIHByaXZhdGUgc2NhbktleXMocGF0dGVybjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnJlZGlzIS5zY2FuU3RyZWFtISh7IG1hdGNoOiBwYXR0ZXJuLCBjb3VudDogMTAwIH0pO1xuICAgICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgIHN0cmVhbS5vbignZGF0YScsIChiYXRjaDogc3RyaW5nW10pID0+IGtleXMucHVzaCguLi5iYXRjaCkpO1xuICAgICAgc3RyZWFtLm9uY2UoJ2VuZCcsICgpID0+IHJlc29sdmUoa2V5cykpO1xuICAgICAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3IgY29tcHV0ZTogcmV0dXJucyBjYWNoZWQgdmFsdWUgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgY2FsbHMgdGhlXG4gICAqIGZhY3RvcnkgZnVuY3Rpb24sIGNhY2hlcyB0aGUgcmVzdWx0LCBhbmQgcmV0dXJucyBpdC5cbiAgICpcbiAgICogU2luZ2xlLWZsaWdodCAvIHN0YW1wZWRlIHByb3RlY3Rpb246IHdoZW4gTiBjYWxsZXJzIG1pc3MgY29uY3VycmVudGx5IGZvclxuICAgKiB0aGUgc2FtZSBrZXksIG9ubHkgT05FIGBmYWN0b3J5KClgIHJ1bnMg4oCUIHRoZSByZXN0IGF3YWl0IGl0cyBzaGFyZWQgcHJvbWlzZS5cbiAgICogVGhlIGluLWZsaWdodCBlbnRyeSBpcyBjbGVhcmVkIG9uY2UgaXQgc2V0dGxlcyAoc3VjY2VzcyBvciBmYWlsdXJlKSwgc28gYVxuICAgKiBmYWlsZWQgZmFjdG9yeSBkb2Vzbid0IHBvaXNvbiBsYXRlciBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIENhY2hlIGtleVxuICAgKiBAcGFyYW0gZmFjdG9yeSAtIEFzeW5jIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9uIGNhY2hlIG1pc3NcbiAgICogQHBhcmFtIHR0bFNlY29uZHMgLSBPcHRpb25hbCBUVEwgb3ZlcnJpZGVcbiAgICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBjb21wdXRlZCB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgZ2V0T3JTZXQ8VD4oa2V5OiBzdHJpbmcsIGZhY3Rvcnk6ICgpID0+IFByb21pc2U8VD4sIHR0bFNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCB0aGlzLmdldDxUPihrZXkpO1xuICAgIGlmIChjYWNoZWQgIT09IG51bGwpIHJldHVybiBjYWNoZWQ7XG5cbiAgICBjb25zdCBmayA9IHRoaXMuZnVsbEtleShrZXkpO1xuICAgIC8vIENvYWxlc2NlIGNvbmN1cnJlbnQgY29sZCBjYWxsZXJzIG9udG8gYSBzaW5nbGUgZmFjdG9yeSgpIGludm9jYXRpb24uIFRoZVxuICAgIC8vIGluLWZsaWdodCBwcm9taXNlIHJlc29sdmVzIHRvIHRoZSBSQVcgdmFsdWU7IGVhY2ggYXdhaXRlciAodGhlIHByaW1hcnlcbiAgICAvLyBjYWxsZXIgYmVsb3cgQU5EIGV2ZXJ5IGNvYWxlc2NlZCBjYWxsZXIgaGVyZSkgY2xvbmVzIGl0IElOREVQRU5ERU5UTFkuXG4gICAgLy8gQ2xvbmluZyBpbnNpZGUgdGhlIGZsaWdodCBpbnN0ZWFkIHdvdWxkIGhhbmQgb25lIHNoYXJlZCBjbG9uZSB0byBhbGwgTlxuICAgIC8vIGNvYWxlc2NlZCBjYWxsZXJzLCBzbyBvbmUgY2FsbGVyIG11dGF0aW5nIGl0cyBcImluZGVwZW5kZW50XCIgcmVzdWx0IHdvdWxkXG4gICAgLy8gY29ycnVwdCB3aGF0IHRoZSBvdGhlcnMgcmVhZCDigJQgdGhlIGV4YWN0IGZvb3RndW4gZ2V0KCkncyBjbG9uZS1vbi1yZWFkXG4gICAgLy8gcHJldmVudHMuIChSZWRpcyBiYWNrZW5kIGlzIHVuYWZmZWN0ZWQ6IHNldCBzZXJpYWxpemVzLCBnZXQgSlNPTi5wYXJzZXMuKVxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5pbmZsaWdodC5nZXQoZmspIGFzIFByb21pc2U8VD4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gY2xvbmVWYWx1ZShhd2FpdCBleGlzdGluZyk7XG5cbiAgICBjb25zdCBnZW5lcmF0aW9uQXRTdGFydCA9IHRoaXMuZ2VuZXJhdGlvbjtcbiAgICBjb25zdCBmbGlnaHQgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBmYWN0b3J5KCk7XG4gICAgICAvLyBBbiBpbnZhbGlkYXRpb24gKGhlcmUgb3Igb24gYW5vdGhlciByZXBsaWNhKSBsYW5kZWQgd2hpbGUgdGhlIGZhY3RvcnlcbiAgICAgIC8vIHJhbjogaXRzIHJlYWQgbWF5IHByZWRhdGUgdGhhdCB3cml0ZSwgc28gZG9uJ3QgY2FjaGUgaXQuXG4gICAgICBpZiAodGhpcy5nZW5lcmF0aW9uID09PSBnZW5lcmF0aW9uQXRTdGFydCkgYXdhaXQgdGhpcy5zZXQoa2V5LCB2YWx1ZSwgdHRsU2Vjb25kcyk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSkoKTtcbiAgICB0aGlzLmluZmxpZ2h0LnNldChmaywgZmxpZ2h0KTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNsb25lVmFsdWUoYXdhaXQgZmxpZ2h0KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pbmZsaWdodC5kZWxldGUoZmspO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgZW50cmllcyAodXNlZnVsIGZvciB0ZXN0aW5nKS5cbiAgICovXG4gIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnJlZGlzKSB7XG4gICAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVQYXR0ZXJuKCcqJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXBwbHlMb2NhbEludmFsaWRhdGlvbignY2xlYXInKTtcbiAgICAgIHRoaXMuYnJvYWRjYXN0KCdjbGVhcicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDdXJyZW50IGluLW1lbW9yeSBjYWNoZSBzaXplIChmb3IgZGlhZ25vc3RpY3MpLiAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1lbW9yeS5zaXplO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FjaGUgc2VydmljZSBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gcHJlZml4IC0gTmFtZXNwYWNlIHByZWZpeCAoZS5nLiwgJ2NvbXBsaWFuY2U6JywgJ3BsdWdpbjonKVxuICogQHBhcmFtIGRlZmF1bHRUdGxTZWNvbmRzIC0gRGVmYXVsdCBUVEwgaW4gc2Vjb25kcyAoZGVmYXVsdCAzMDAgPSA1IG1pbilcbiAqIEBwYXJhbSByZWRpcyAtIE9wdGlvbmFsIFJlZGlzIGNsaWVudCBmb3IgY3Jvc3MtcHJvY2VzcyBjYWNoaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYWNoZVNlcnZpY2UoXG4gIHByZWZpeDogc3RyaW5nLFxuICBkZWZhdWx0VHRsU2Vjb25kcyA9IDMwMCxcbiAgcmVkaXM/OiBSZWRpc0NhY2hlQ2xpZW50LFxuKTogQ2FjaGVTZXJ2aWNlIHtcbiAgcmV0dXJuIG5ldyBDYWNoZVNlcnZpY2UoeyBwcmVmaXgsIGRlZmF1bHRUdGxTZWNvbmRzLCByZWRpcyB9KTtcbn1cbiJdfQ==
|