@pipeline-builder/api-server 4.4.2 → 4.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/api/server.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { Server } from 'http';
4
- import { buildRouteTable, createLogger, errorMessage, installCrashHandlers, nextBackoffMs, resolveRedisConnection, retryForever, summarizeRouteTable, sleep, envInt } from '@pipeline-builder/api-core';
4
+ import { buildRouteTable, createLogger, errorMessage, flushQuotaIncrements, installCrashHandlers, nextBackoffMs, resolveRedisConnection, retryForever, summarizeRouteTable, sleep, envInt } from '@pipeline-builder/api-core';
5
5
  import { Config } from '@pipeline-builder/pipeline-core';
6
6
  import { getConnection, closeConnection } from '@pipeline-builder/pipeline-data';
7
7
  import { setReady, isReady } from './readiness.js';
@@ -192,6 +192,9 @@ export async function startServer(app, options = {}) {
192
192
  // Close HTTP server
193
193
  server.close(async () => {
194
194
  logger.info('HTTP server closed');
195
+ // Every in-flight request has now finished and buffered its metering unit;
196
+ // send them before exiting (api-core quota-increment-batcher). Never rejects.
197
+ await flushQuotaIncrements();
195
198
  // Shutdown OpenTelemetry tracing
196
199
  await shutdownTracing().catch(err => logger.error('Error shutting down tracing', { error: err }));
197
200
  // Close database connection
@@ -258,4 +261,4 @@ export function runServer(app, options = {}) {
258
261
  process.exit(1);
259
262
  });
260
263
  }
261
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsc0JBQXNCLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4TSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRixPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRS9ELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUd0Qyw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSx5Q0FBeUM7QUFDekMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDakMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFDakMsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsK0JBQStCLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFOUY7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILEtBQUssVUFBVSxxQkFBcUIsQ0FDbEMsSUFBWSxFQUNaLGFBQWdELEVBQ2hELFlBQTBELEVBQzFELE9BQXNCO0lBRXRCLElB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Q0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUV4RCxPQUFPO1FBQ0wsTUFBTTtRQUNOLElBQUk7UUFDSixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFO0tBQzNCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsR0FBWSxFQUFFLE9BQU8sR0FBdUIsRUFBRTtJQUN0RSw4RUFBOEU7SUFDOUUsOEVBQThFO0lBQzlFLHdFQUF3RTtJQUN4RSwyQkFBMkI7SUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTVFLHlFQUF5RTtJQUN6RSx5RUFBeUU7SUFDekUsNEVBQTRFO0lBQzVFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDeEMsNEVBQTRFO1FBQzVFLDJFQUEyRTtRQUMzRSw0RUFBNEU7UUFDNUUscUVBQXFFO1FBQ3JFLDZFQUE2RTtRQUM3RSxNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFO1lBQ3JDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQzFCLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQ3hELENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IFNlcnZlciB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgYnVpbGRSb3V0ZVRhYmxlLCBjcmVhdGVMb2dnZXIsIGVycm9yTWVzc2FnZSwgaW5zdGFsbENyYXNoSGFuZGxlcnMsIG5leHRCYWNrb2ZmTXMsIHJlc29sdmVSZWRpc0Nvbm5lY3Rpb24sIHJldHJ5Rm9yZXZlciwgc3VtbWFyaXplUm91dGVUYWJsZSwgc2xlZXAsIGVudkludCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHsgZ2V0Q29ubmVjdGlvbiwgY2xvc2VDb25uZWN0aW9uIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEV4cHJlc3MgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IHNldFJlYWR5LCBpc1JlYWR5IH0gZnJvbSAnLi9yZWFkaW5lc3MuanMnO1xuaW1wb3J0IHsgc2h1dGRvd25UcmFjaW5nIH0gZnJvbSAnLi90cmFjaW5nLmpzJztcbmltcG9ydCB7IFNTRU1hbmFnZXIgfSBmcm9tICcuLi9odHRwL3NzZS1jb25uZWN0aW9uLW1hbmFnZXIuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3NlcnZlcicpO1xuXG5cbi8vIERlcGVuZGVuY3ktc3VwZXJ2aXNvciBjYWRlbmNlLiBJbml0aWFsIGNvbm5lY3QgcmV0cmllcyB3aXRoIGNhcHBlZCBiYWNrb2ZmO1xuLy8gb25jZSBjb25uZWN0ZWQsIHJlLWNoZWNrcyBhdCBhIHN0ZWFkeSBpbnRlcnZhbCBzbyBhIGxhdGVyIG91dGFnZSBmbGlwcyB0aGVcbi8vIHNlcnZpY2UgTm90UmVhZHkgKGRyYWluaW5nIHRyYWZmaWMpIGFuZCBhIHJlY292ZXJ5IGZsaXBzIGl0IGJhY2sg4oCUIHdpdGhvdXRcbi8vIGV2ZXIgZXhpdGluZyAvIHJlc3RhcnRpbmcgdGhlIHByb2Nlc3MuXG5jb25zdCBSRUFEWV9SRVRSWV9CQVNFX01TID0gMTAwMDtcbmNvbnN0IFJFQURZX1JFVFJZX01BWF9NUyA9IDEwMDAwO1xuY29uc3QgUkVBRFlfTU9OSVRPUl9JTlRFUlZBTF9NUyA9IGVudkludCgnUkVBRElORVNTX01PTklUT1JfSU5URVJWQUxfTVMnLCAxNV8wMDAsIHsgbWluOiAxIH0pO1xuXG4vKipcbiAqIEVzdGFibGlzaCBhbmQgY29udGludW91c2x5IG1vbml0b3IgdGhlIHNlcnZpY2UncyBkYXRhc3RvcmUgZGVwZW5kZW5jeSxcbiAqIGZsaXBwaW5nIHJlYWRpbmVzcyBzdGF0ZSBpbnN0ZWFkIG9mIGNyYXNoLWxvb3BpbmcuXG4gKlxuICogLSBFc3RhYmxpc2ggcGhhc2U6IHJldHJ5IGBvbkJlZm9yZVN0YXJ0YCAoZS5nLiBjb25uZWN0TW9uZ28pIHdpdGggY2FwcGVkXG4gKiAgIGJhY2tvZmYgdW50aWwgaXQgc3VjY2VlZHMg4oCUIGEgY29sZCBkYXRhc3RvcmUgbXVzdCBuZXZlciBleGl0IHRoZSBwcm9jZXNzLlxuICogLSBNb25pdG9yIHBoYXNlOiBwb2xsIGB0ZXN0RGF0YWJhc2VgIGZvciB0aGUgbGlmZSBvZiB0aGUgcHJvY2VzczsgZmxpcFxuICogICByZWFkeS9Ob3RSZWFkeSBvbiB0cmFuc2l0aW9ucy4gV2hpbGUgTm90UmVhZHkgdGhlIHJlYWRpbmVzcyBndWFyZCA1MDNzXG4gKiAgIGJ1c2luZXNzIHRyYWZmaWMgYW5kIG9yY2hlc3RyYXRvciByZWFkaW5lc3MgcHJvYmVzIGRyYWluIHRoZSBpbnN0YW5jZS5cbiAqXG4gKiBSdW5zIGluIHRoZSBiYWNrZ3JvdW5kICh0aGUgSFRUUCBzZXJ2ZXIgaXMgYWxyZWFkeSBsaXN0ZW5pbmcpLiBTdG9wcyB3aGVuXG4gKiBgYWJvcnRlZCgpYCByZXR1cm5zIHRydWUgKGdyYWNlZnVsIHNodXRkb3duKSwgc28gaXQgbmV2ZXIga2VlcHMgYSBjbG9zaW5nXG4gKiBwcm9jZXNzIGFsaXZlLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdXBlcnZpc2VEZXBlbmRlbmNpZXMoXG4gIG5hbWU6IHN0cmluZyxcbiAgb25CZWZvcmVTdGFydDogKCgpID0+IFByb21pc2U8dm9pZD4pIHwgdW5kZWZpbmVkLFxuICB0ZXN0RGF0YWJhc2U6ICgoKSA9PiBQcm9taXNlPGJvb2xlYW4+KSB8IGZhbHNlIHwgdW5kZWZpbmVkLFxuICBhYm9ydGVkOiAoKSA9PiBib29sZWFuLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChvbkJlZm9yZVN0YXJ0KSB7XG4gICAgYXdhaXQgcmV0cnlGb3JldmVyKG9uQmVmb3JlU3RhcnQsIHtcbiAgICAgIGJhc2VNczogUkVBRFlfUkVUUllfQkFTRV9NUyxcbiAgICAgIG1heE1zOiBSRUFEWV9SRVRSWV9NQVhfTVMsXG4gICAgICBvbkF0dGVtcHRGYWlsZWQ6IChlcnJvciwgZGVsYXlNcykgPT4gbG9nZ2VyLndhcm4oXG4gICAgICAgIGAke25hbWV9OiBkZXBlbmRlbmN5IGluaXQgZmFpbGVkLCByZXRyeWluZyBpbiAke2RlbGF5TXN9bXNgLFxuICAgICAgICB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpIH0sXG4gICAgICApLFxuICAgICAgc2hvdWxkQ29udGludWU6ICgpID0+ICFhYm9ydGVkKCksXG4gICAgfSk7XG4gIH1cblxuICAvLyBObyBkYXRhc3RvcmUgdG8gZ2F0ZSBvbiDihpIgcmVhZHkgYXMgc29vbiBhcyB3ZSBhcmUgbGlzdGVuaW5nLlxuICBpZiAodGVzdERhdGFiYXNlID09PSBmYWxzZSkge1xuICAgIGlmIChhYm9ydGVkKCkpIHJldHVybjsgLy8gc2h1dGRvd24gYmVnYW4gd2hpbGUgd2Ugd2VyZSBpbml0aWFsaXppbmdcbiAgICBzZXRSZWFkeSh0cnVlKTtcbiAgICBsb2dnZXIuaW5mbyhgJHtuYW1lfSByZWFkeSAobm8gZGF0YXN0b3JlIGRlcGVuZGVuY3kpYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcHJvYmUgPSB0ZXN0RGF0YWJhc2UgPz8gKCgpID0+IGdldENvbm5lY3Rpb24oKS50ZXN0Q29ubmVjdGlvbigpKTtcbiAgbGV0IHdhaXREZWxheSA9IFJFQURZX1JFVFJZX0JBU0VfTVM7XG4gIHdoaWxlICghYWJvcnRlZCgpKSB7XG4gICAgbGV0IG9rID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIG9rID0gYXdhaXQgcHJvYmUoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIG9rID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQSBwcm9iZSB0aGF0IHdhcyBpbiBmbGlnaHQgd2hlbiBzaHV0ZG93biBiZWdhbiBtdXN0IG5vdCBmbGlwIHRoZVxuICAgIC8vIGRyYWluaW5nIGluc3RhbmNlIGJhY2sgdG8gcmVhZHkuXG4gICAgaWYgKGFib3J0ZWQoKSkgYnJlYWs7XG4gICAgaWYgKG9rICYmICFpc1JlYWR5KCkpIHtcbiAgICAgIHNldFJlYWR5KHRydWUpO1xuICAgICAgd2FpdERlbGF5ID0gUkVBRFlfUkVUUllfQkFTRV9NUztcbiAgICAgIGxvZ2dlci5pbmZvKGAke25hbWV9IHJlYWR5IOKAlCBkZXBlbmRlbmNpZXMgY29ubmVjdGVkYCk7XG4gICAgfSBlbHNlIGlmICghb2sgJiYgaXNSZWFkeSgpKSB7XG4gICAgICBzZXRSZWFkeShmYWxzZSk7XG4gICAgICBsb2dnZXIud2FybihgJHtuYW1lfSBkZWdyYWRlZCDigJQgZGVwZW5kZW5jeSBjaGVjayBmYWlsaW5nIChub3cgTm90UmVhZHkpYCk7XG4gICAgfVxuXG4gICAgLy8gU3RlYWR5IGNhZGVuY2Ugb25jZSByZWFkeTsgZmFzdGVyIGJhY2tvZmYgd2hpbGUgd2FpdGluZyBzbyB3ZSBmbGlwIHRvXG4gICAgLy8gcmVhZHkgcHJvbXB0bHkgd2hlbiB0aGUgZGF0YXN0b3JlIGNvbWVzIHVwLlxuICAgIGlmIChpc1JlYWR5KCkpIHtcbiAgICAgIGF3YWl0IHNsZWVwKFJFQURZX01PTklUT1JfSU5URVJWQUxfTVMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzbGVlcCh3YWl0RGVsYXkpO1xuICAgICAgd2FpdERlbGF5ID0gbmV4dEJhY2tvZmZNcyh3YWl0RGVsYXksIFJFQURZX1JFVFJZX01BWF9NUyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgYSBzZXJ2ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydFNlcnZlck9wdGlvbnMge1xuICAvKiogU2VydmljZSBuYW1lIGZvciBsb2dnaW5nICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBQb3J0IHRvIGxpc3RlbiBvbiAoZGVmYXVsdDogZnJvbSBjb25maWcpICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBTU0UgbWFuYWdlciBmb3IgZ3JhY2VmdWwgc2h1dGRvd24gKi9cbiAgc3NlTWFuYWdlcj86IFNTRU1hbmFnZXI7XG4gIC8qKiBTaHV0ZG93biB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMTUwMDApICovXG4gIHNodXRkb3duVGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogQ2FsbGJhY2sgYWZ0ZXIgc2VydmVyIHN0YXJ0cyAqL1xuICBvblN0YXJ0PzogKHBvcnQ6IG51bWJlcikgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIGJlZm9yZSBzaHV0ZG93biAqL1xuICBvblNodXRkb3duPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJ1bnMgYmVmb3JlIGRhdGFiYXNlIGNoZWNrIChlLmcuLCBpbml0aWFsaXplIGV4dGVybmFsIGNvbm5lY3Rpb25zKSAqL1xuICBvbkJlZm9yZVN0YXJ0PzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEN1c3RvbSBkYXRhYmFzZSBoZWFsdGggY2hlY2ssIG9yIGZhbHNlIHRvIHNraXAuIERlZmF1bHQ6IFBvc3RncmVTUUwgdGVzdENvbm5lY3Rpb24gKi9cbiAgdGVzdERhdGFiYXNlPzogKCgpID0+IFByb21pc2U8Ym9vbGVhbj4pIHwgZmFsc2U7XG4gIC8qKiBDdXN0b20gZGF0YWJhc2UgY2xvc2UsIG9yIGZhbHNlIHRvIHNraXAuIERlZmF1bHQ6IFBvc3RncmVTUUwgY2xvc2VDb25uZWN0aW9uICovXG4gIGNsb3NlRGF0YWJhc2U/OiAoKCkgPT4gUHJvbWlzZTx2b2lkPikgfCBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Ygc3RhcnRpbmcgYSBzZXJ2ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydFNlcnZlclJlc3VsdCB7XG4gIC8qKiBIVFRQIHNlcnZlciBpbnN0YW5jZSAqL1xuICBzZXJ2ZXI6IFNlcnZlcjtcbiAgLyoqIFBvcnQgdGhlIHNlcnZlciBpcyBsaXN0ZW5pbmcgb24gKi9cbiAgcG9ydDogbnVtYmVyO1xuICAvKiogRnVuY3Rpb24gdG8gbWFudWFsbHkgdHJpZ2dlciBzaHV0ZG93biAqL1xuICBzaHV0ZG93bjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBTdGFydCBhbiBFeHByZXNzIHNlcnZlciB3aXRoIGdyYWNlZnVsIHNodXRkb3duIGhhbmRsaW5nXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBkYXRhYmFzZSBjb25uZWN0aW9uIHRlc3RpbmdcbiAqIC0gR3JhY2VmdWwgc2h1dGRvd24gb24gU0lHSU5UL1NJR1RFUk1cbiAqIC0gU1NFIGNvbm5lY3Rpb24gY2xlYW51cFxuICogLSBDb25maWd1cmFibGUgc2h1dGRvd24gdGltZW91dFxuICpcbiAqIEBwYXJhbSBhcHAgLSBFeHByZXNzIGFwcGxpY2F0aW9uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFNlcnZlciBvcHRpb25zXG4gKiBAcmV0dXJucyBTZXJ2ZXIgaW5zdGFuY2UgYW5kIGNvbnRyb2wgZnVuY3Rpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHsgYXBwLCBzc2VNYW5hZ2VyIH0gPSBjcmVhdGVBcHAoKTtcbiAqXG4gKiBhcHAucG9zdCgnL2FwaS9yZXNvdXJjZScsIHJlcXVpcmVBdXRoLCBoYW5kbGVyKTtcbiAqXG4gKiBhd2FpdCBzdGFydFNlcnZlcihhcHAsIHtcbiAqICAgbmFtZTogJ015IE1pY3Jvc2VydmljZScsXG4gKiAgIHNzZU1hbmFnZXIsXG4gKiAgIG9uU3RhcnQ6IChwb3J0KSA9PiBjb25zb2xlLmxvZyhgTGlzdGVuaW5nIG9uICR7cG9ydH1gKSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFNlcnZlcihcbiAgYXBwOiBFeHByZXNzLFxuICBvcHRpb25zOiBTdGFydFNlcnZlck9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8U3RhcnRTZXJ2ZXJSZXN1bHQ+IHtcbiAgY29uc3Qgc2VydmVyQ29uZmlnID0gQ29uZmlnLmdldCgnc2VydmVyJyk7XG4gIGNvbnN0IHtcbiAgICBuYW1lID0gJ01pY3Jvc2VydmljZScsXG4gICAgc3NlTWFuYWdlcixcbiAgICBzaHV0ZG93blRpbWVvdXRNcyA9IDE1MDAwLFxuICAgIG9uU3RhcnQsXG4gICAgb25TaHV0ZG93bixcbiAgICBvbkJlZm9yZVN0YXJ0LFxuICAgIHRlc3REYXRhYmFzZSxcbiAgICBjbG9zZURhdGFiYXNlLFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgcG9ydCA9IG9wdGlvbnMucG9ydCA/PyBzZXJ2ZXJDb25maWcucG9ydDtcblxuICAvLyBWYWxpZGF0ZSBhdXRoIGNvbmZpZ3VyYXRpb24gYXQgc2VydmVyIHN0YXJ0dXAgKG5vdCBkdXJpbmcgQ0RLIHN5bnRoZXNpcylcbiAgQ29uZmlnLnZhbGlkYXRlQXV0aCgpO1xuICAvLyBGYWlsIGZhc3QgaWYgdGhpcyBzZXJ2aWNlIGhhcyBubyBpbnRlcm5hbCBzaWduaW5nIGtleSBvZiBpdHMgb3duLCBvciBub1xuICAvLyBwdWJsaWMgYnVuZGxlIHRvIHZlcmlmeSBpdHMgcGVlcnMgd2l0aC4gV2l0aG91dCB0aGVtIGl0IHdvdWxkIG1pbnRcbiAgLy8gdG9rZW5zIG9uIGFuIEVQSEVNRVJBTCBpbi1wcm9jZXNzIGtleSB0aGF0IG5vIHBlZXIgYWNjZXB0cywgYW5kIHJlamVjdCBldmVyeVxuICAvLyBwZWVyJ3MgdG9rZW4g4oCUIGkuZS4gc2lsZW50bHkgbG9zZSBhbGwgc2VydmljZS10by1zZXJ2aWNlIHRyYWZmaWMuIENoZWNrZWRcbiAgLy8gSEVSRSByYXRoZXIgdGhhbiBpbiBgY3JlYXRlQXBwYCBiZWNhdXNlIGl0IGlzIGEgcHJvcGVydHkgb2YgdGhlIHJ1bm5pbmdcbiAgLy8gZGVwbG95bWVudCwgbm90IG9mIHRoZSBhcHAgb2JqZWN0OiByb3V0ZS10YWJsZSBidWlsZGVycyBhbmQgdGVzdCBzdWl0ZXNcbiAgLy8gYXNzZW1ibGUgYW4gYXBwIHdpdGhvdXQgZXZlciBzaWduaW5nIGFueXRoaW5nLlxuICBmb3IgKGNvbnN0IGVudlZhciBvZiBbJ1NFUlZJQ0VfU0lHTklOR19LRVlfRklMRScsICdTRVJWSUNFX0tFWV9CVU5ETEVfRklMRSddIGFzIGNvbnN0KSB7XG4gICAgaWYgKCFwcm9jZXNzLmVudltlbnZWYXJdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW52VmFyfSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyByZXF1aXJlZCAoZ2VuZXJhdGUgd2l0aCBkZXBsb3kvYmluL3NlcnZpY2Utc2lnbmluZy1rZXlzLnNoKS4gU2V0IGl0IGJlZm9yZSBzdGFydGluZyB0aGUgc2VydmVyLmApO1xuICAgIH1cbiAgfVxuICAvLyBGYWlsIGZhc3Qgb24gYW4gdW51c2FibGUgUmVkaXMgY29uZmlndXJhdGlvbiAodGhyb3dzIFJlZGlzQ29uZmlnRXJyb3IpIOKAlCBhXG4gIC8vIFJlZGlzIGNsaWVudCBpcyBjcmVhdGVkIGxhemlseSBvbiBmaXJzdCB1c2UsIHNvIHdpdGhvdXQgdGhpcyBhIGJhZCBjb25maWdcbiAgLy8gd291bGQgc3VyZmFjZSBhcyByZXF1ZXN0LXRpbWUgZXJyb3JzIGluc3RlYWQgb2YgYSBmYWlsZWQgc3RhcnQuXG4gIHJlc29sdmVSZWRpc0Nvbm5lY3Rpb24oKTtcblxuICBsb2dnZXIuaW5mbyhgU3RhcnRpbmcgJHtuYW1lfS4uLmApO1xuXG4gIC8vIE1hcmsgTm90UmVhZHkgc3luY2hyb25vdXNseSwgQkVGT1JFIHRoZSBwb3J0IG9wZW5zLCBzbyBubyByZXF1ZXN0IHNsaXBzXG4gIC8vIHRocm91Z2ggdGhlIHJlYWRpbmVzcyBndWFyZCBiZWZvcmUgdGhlIHN1cGVydmlzb3IgaGFzIHJ1bi4gVGhlIHN1cGVydmlzb3JcbiAgLy8gZmxpcHMgaXQgdHJ1ZSBvbmNlIGRlcGVuZGVuY2llcyBjb25uZWN0LlxuICBzZXRSZWFkeShmYWxzZSk7XG5cbiAgLy8gTGlzdGVuIEZJUlNULCB0aGVuIGVzdGFibGlzaCArIG1vbml0b3IgdGhlIGRhdGFzdG9yZSBpbiB0aGUgYmFja2dyb3VuZCxcbiAgLy8gcmVwb3J0aW5nIE5vdFJlYWR5IHVudGlsIGl0IGNvbm5lY3RzLiBUZXN0aW5nIHRoZSBEQiBiZWZvcmUgbGlzdGVuIGFuZFxuICAvLyBleGl0aW5nIG9uIGZhaWx1cmUgY3Jhc2gtbG9vcHMgdGhlIHdob2xlIGZsZWV0IGR1cmluZyBhIGNvbGQtREIgc3RhbXBlZGU6XG4gIC8vIHRoZSBwcm9jZXNzIG5ldmVyIG9wZW5zIGl0cyBwb3J0LCBzbyAvaGVhbHRoIChsaXZlbmVzcyksIC9yZWFkeSBhbmQgdGhlXG4gIC8vIHJlYWRpbmVzcyBndWFyZCBjYW4ndCBhbnN3ZXIgYW5kIHRoZSBvcmNoZXN0cmF0b3Igb25seSBzZWVzIGEgZGVhZCBwb2QuXG4gIC8vIE9wZW5pbmcgdGhlIHBvcnQgZmlyc3QgbWFrZXMgXCJkZXBlbmRlbmN5IGRvd25cIiBhbiBvYnNlcnZhYmxlIHN0YXRlLlxuICBjb25zdCBzZXJ2ZXIgPSBhcHAubGlzdGVuKHBvcnQsICgpID0+IHtcbiAgICBsb2dnZXIuaW5mbyhgJHtuYW1lfSBsaXN0ZW5pbmcgb24gcG9ydDogJHtwb3J0fWApO1xuICAgIGxvZ2dlci5pbmZvKGBQbGF0Zm9ybSBVUkw6ICR7c2VydmVyQ29uZmlnLnBsYXRmb3JtVXJsfWApO1xuICAgIG9uU3RhcnQ/Lihwb3J0KTtcbiAgfSk7XG5cbiAgLy8gU2h1dGRvd24gaGFuZGxlciAoZ3VhcmRlZCBhZ2FpbnN0IGNvbmN1cnJlbnQgc2lnbmFscylcbiAgbGV0IHNodXR0aW5nRG93biA9IGZhbHNlO1xuXG4gIC8vIEJhY2tncm91bmQgZGVwZW5kZW5jeSBzdXBlcnZpc29yIOKAlCBlc3RhYmxpc2hlZCArIG1vbml0b3JlZCBhZnRlciBsaXN0ZW4sXG4gIC8vIHN0b3BwZWQgb24gc2h1dGRvd24gc28gaXQgbmV2ZXIga2VlcHMgYSBjbG9zaW5nIHByb2Nlc3MgYWxpdmUuIEd1YXJkIHRoZVxuICAvLyBmbG9hdGluZyBwcm9taXNlOiBldmVyeSBleHBlY3RlZCBmYWlsdXJlIGlzIGhhbmRsZWQgaW5zaWRlLCBzbyBhIHJlamVjdGlvblxuICAvLyBoZXJlIG1lYW5zIGEgcHJvZ3JhbW1pbmcgZXJyb3Ig4oCUIGxvZyBpdCBhbmQgbGVhdmUgdGhlIHNlcnZpY2UgTm90UmVhZHlcbiAgLy8gcmF0aGVyIHRoYW4gbGV0dGluZyBpdCBiZWNvbWUgYW4gdW5oYW5kbGVkUmVqZWN0aW9uIHRoYXQgY3Jhc2gtZXhpdHMgdGhlXG4gIC8vIHByb2Nlc3MgKHdoaWNoIHdvdWxkIGRlZmVhdCB0aGUgd2hvbGUgXCJuZXZlciBleGl0IG9uIGRlcGVuZGVuY3kgdHJvdWJsZVwiXG4gIC8vIGdvYWwpLlxuICBzdXBlcnZpc2VEZXBlbmRlbmNpZXMobmFtZSwgb25CZWZvcmVTdGFydCwgdGVzdERhdGFiYXNlLCAoKSA9PiBzaHV0dGluZ0Rvd24pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgIGxvZ2dlci5lcnJvcignRGVwZW5kZW5jeSBzdXBlcnZpc29yIGNyYXNoZWQ7IHNlcnZpY2Ugd2lsbCByZW1haW4gTm90UmVhZHknLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpIH0pO1xuICB9KTtcblxuICBjb25zdCBzaHV0ZG93biA9IGFzeW5jIChzaWduYWw/OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoc2h1dHRpbmdEb3duKSByZXR1cm47XG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcblxuICAgIC8vIERyYWluIEZJUlNUOiByZXBvcnQgTm90UmVhZHkgYmVmb3JlIGFueXRoaW5nIGVsc2UsIHNvIHRoZSBsb2FkIGJhbGFuY2VyIC9cbiAgICAvLyByZWFkaW5lc3MgcHJvYmUgc3RvcHMgc2VuZGluZyBuZXcgd29yayB3aGlsZSB0aGUgcmVzdCBvZiBzaHV0ZG93biBydW5zLlxuICAgIC8vIGBvblNodXRkb3duYCBjYW4gdGFrZSBzZWNvbmRzOyByZWFkaW5lc3MgbGVmdCBncmVlbiBhY3Jvc3MgaXQga2VlcHMgbmV3XG4gICAgLy8gcmVxdWVzdHMgYXJyaXZpbmcgYXQgYSBwcm9jZXNzIHRoYXQgaXMgYWxyZWFkeSB0ZWFyaW5nIGl0c2VsZiBkb3duLlxuICAgIHNldFJlYWR5KGZhbHNlKTtcblxuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGAke3NpZ25hbH0gcmVjZWl2ZWQsIHNodXR0aW5nIGRvd24gZ3JhY2VmdWxseS4uLmApO1xuICAgIH1cblxuICAgIC8vIEFybSB0aGUgZm9yY2UtZXhpdCBCRUZPUkUgYXdhaXRpbmcgYW55dGhpbmc6IGEgaHVuZyBvblNodXRkb3duIChhIHN0dWNrXG4gICAgLy8gcXVldWUgY2xvc2UsIGEgUmVkaXMgcXVpdCB0aGF0IG5ldmVyIGFuc3dlcnMpIHdvdWxkIG90aGVyd2lzZSBibG9jayBmb3JldmVyXG4gICAgLy8gd2l0aCB0aGUgdGltZXIgbmV2ZXIgc3RhcnRlZCwgc28gdGhlIHBvZCB3b3VsZCBpZ25vcmUgU0lHVEVSTSB1bnRpbCBTSUdLSUxMLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGb3JjZWQgc2h1dGRvd24gYWZ0ZXIgdGltZW91dCcpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH0sIHNodXRkb3duVGltZW91dE1zKS51bnJlZigpO1xuXG4gICAgLy8gQ3VzdG9tIHNodXRkb3duIGNhbGxiYWNrXG4gICAgaWYgKG9uU2h1dGRvd24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9uU2h1dGRvd24oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgaW4gb25TaHV0ZG93biBjYWxsYmFjaycsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgU1NFIGNvbm5lY3Rpb25zXG4gICAgaWYgKHNzZU1hbmFnZXIpIHtcbiAgICAgIHNzZU1hbmFnZXIuc2h1dGRvd24oKTtcbiAgICAgIGxvZ2dlci5pbmZvKCdTU0UgY29ubmVjdGlvbnMgY2xvc2VkJyk7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgSFRUUCBzZXJ2ZXJcbiAgICBzZXJ2ZXIuY2xvc2UoYXN5bmMgKCkgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oJ0hUVFAgc2VydmVyIGNsb3NlZCcpO1xuXG4gICAgICAvLyBTaHV0ZG93biBPcGVuVGVsZW1ldHJ5IHRyYWNpbmdcbiAgICAgIGF3YWl0IHNodXRkb3duVHJhY2luZygpLmNhdGNoKGVyciA9PiBsb2dnZXIuZXJyb3IoJ0Vycm9yIHNodXR0aW5nIGRvd24gdHJhY2luZycsIHsgZXJyb3I6IGVyciB9KSk7XG5cbiAgICAgIC8vIENsb3NlIGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAgICAgIGlmIChjbG9zZURhdGFiYXNlICE9PSBmYWxzZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChjbG9zZURhdGFiYXNlKSB7XG4gICAgICAgICAgICBhd2FpdCBjbG9zZURhdGFiYXNlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IGNsb3NlQ29ubmVjdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsb2dnZXIuaW5mbygnRGF0YWJhc2UgY29ubmVjdGlvbiBjbG9zZWQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGNsb3NpbmcgZGF0YWJhc2UnLCB7IGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBSZWdpc3RlciBzaWduYWwgaGFuZGxlcnNcbiAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCAoKSA9PiB2b2lkIHNodXRkb3duKCdTSUdJTlQnKSk7XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsICgpID0+IHZvaWQgc2h1dGRvd24oJ1NJR1RFUk0nKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzZXJ2ZXIsXG4gICAgcG9ydCxcbiAgICBzaHV0ZG93bjogKCkgPT4gc2h1dGRvd24oKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgc2VydmVyIHN0YXJ0IHdyYXBwZXIgd2l0aCBlcnJvciBoYW5kbGluZ1xuICpcbiAqIEBwYXJhbSBhcHAgLSBFeHByZXNzIGFwcGxpY2F0aW9uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFNlcnZlciBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHsgYXBwLCBzc2VNYW5hZ2VyIH0gPSBjcmVhdGVBcHAoKTtcbiAqIGFwcC5wb3N0KCcvYXBpL3Jlc291cmNlJywgaGFuZGxlcik7XG4gKlxuICogdm9pZCBydW5TZXJ2ZXIoYXBwLCB7IG5hbWU6ICdNeSBTZXJ2aWNlJywgc3NlTWFuYWdlciB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuU2VydmVyKGFwcDogRXhwcmVzcywgb3B0aW9uczogU3RhcnRTZXJ2ZXJPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgLy8gUm91dGUgdGFibGUgb2YgdGhlIGZ1bGx5IGFzc2VtYmxlZCBhcHAgKHNlZSBhcGktY29yZSdzIHJvdXRlLXRhYmxlLnRzKTogdGhlXG4gIC8vIHNhbWUgaW50cm9zcGVjdGlvbiB0aGUgcGVyLXNlcnZpY2UgY292ZXJhZ2UgdGVzdCBhc3NlcnRzIG9uLCBsb2dnZWQgb25jZSBhdFxuICAvLyBib290IHNvIGFuIHVuZ2F0ZWQgb3IgdW5hdWRpdGVkIHdyaXRlIHJvdXRlIGlzIHZpc2libGUgaW4gdGhlIHJ1bm5pbmdcbiAgLy8gc2VydmljZSwgbm90IG9ubHkgaW4gQ0kuXG4gIGxvZ2dlci5pbmZvKCdSb3V0ZSB0YWJsZSBidWlsdCcsIHN1bW1hcml6ZVJvdXRlVGFibGUoYnVpbGRSb3V0ZVRhYmxlKGFwcCkpKTtcblxuICAvLyBMYXN0LXJlc29ydCBmYXVsdCBoYW5kbGVycyBmb3IgdGhlIHByb2R1Y3Rpb24gZW50cnlwb2ludDogYW4gdW5oYW5kbGVkXG4gIC8vIHJlamVjdGlvbiAvIHVuY2F1Z2h0IGV4Y2VwdGlvbiBpcyBsb2dnZWQgKG5vdCBzaWxlbnRseSBmYXRhbCkgdGhlbiB0aGVcbiAgLy8gcHJvY2VzcyBleGl0cyBmb3IgdGhlIG9yY2hlc3RyYXRvciB0byByZXN0YXJ0LiBOby1vcCB1bmRlciBOT0RFX0VOVj10ZXN0LlxuICBpbnN0YWxsQ3Jhc2hIYW5kbGVycyhsb2dnZXIpO1xuICBzdGFydFNlcnZlcihhcHAsIG9wdGlvbnMpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgIC8vIHN0YXJ0U2VydmVyIG5vdyBsaXN0ZW5zLWZpcnN0IGFuZCBzdXBlcnZpc2VzIHRoZSBEQiBpbiB0aGUgYmFja2dyb3VuZCwgc29cbiAgICAvLyBpdCBvbmx5IHJlamVjdHMgb24gYSBnZW51aW5lbHkgZmF0YWwgU0VUVVAgZXJyb3IgKGludmFsaWQgYXV0aCBjb25maWcsIGFcbiAgICAvLyBmYWlsZWQgb25TdGFydCwgdGhlIHBvcnQgYWxyZWFkeSBpbiB1c2UpLiBMb2cgbWVzc2FnZSArIHN0YWNrIGV4cGxpY2l0bHk6XG4gICAgLy8gYW4gRXJyb3IgaW4gd2luc3RvbiBtZXRhZGF0YSBzZXJpYWxpemVzIHRvIGB7fWAgKG1lc3NhZ2Uvc3RhY2sgYXJlXG4gICAgLy8gbm9uLWVudW1lcmFibGUpLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgaGlkZSB0aGUgY2F1c2UgYmVoaW5kIGB7ZXJyb3I6e319YC5cbiAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBzZXJ2ZXInLCB7XG4gICAgICBlcnJvcjogZXJyb3JNZXNzYWdlKGVycm9yKSxcbiAgICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcbn1cbiJdfQ==
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsc0JBQXNCLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5TixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRixPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRS9ELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUd0Qyw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSx5Q0FBeUM7QUFDekMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDakMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFDakMsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsK0JBQStCLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFOUY7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILEtBQUssVUFBVSxxQkFBcUIsQ0FDbEMsSUFBWSxFQUNaLGFBQWdELEVBQ2hELFlBQTBELEVBQzFELE9B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OlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IFNlcnZlciB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgYnVpbGRSb3V0ZVRhYmxlLCBjcmVhdGVMb2dnZXIsIGVycm9yTWVzc2FnZSwgZmx1c2hRdW90YUluY3JlbWVudHMsIGluc3RhbGxDcmFzaEhhbmRsZXJzLCBuZXh0QmFja29mZk1zLCByZXNvbHZlUmVkaXNDb25uZWN0aW9uLCByZXRyeUZvcmV2ZXIsIHN1bW1hcml6ZVJvdXRlVGFibGUsIHNsZWVwLCBlbnZJbnQgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJztcbmltcG9ydCB7IGdldENvbm5lY3Rpb24sIGNsb3NlQ29ubmVjdGlvbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuaW1wb3J0IHR5cGUgeyBFeHByZXNzIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBzZXRSZWFkeSwgaXNSZWFkeSB9IGZyb20gJy4vcmVhZGluZXNzLmpzJztcbmltcG9ydCB7IHNodXRkb3duVHJhY2luZyB9IGZyb20gJy4vdHJhY2luZy5qcyc7XG5pbXBvcnQgeyBTU0VNYW5hZ2VyIH0gZnJvbSAnLi4vaHR0cC9zc2UtY29ubmVjdGlvbi1tYW5hZ2VyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdzZXJ2ZXInKTtcblxuXG4vLyBEZXBlbmRlbmN5LXN1cGVydmlzb3IgY2FkZW5jZS4gSW5pdGlhbCBjb25uZWN0IHJldHJpZXMgd2l0aCBjYXBwZWQgYmFja29mZjtcbi8vIG9uY2UgY29ubmVjdGVkLCByZS1jaGVja3MgYXQgYSBzdGVhZHkgaW50ZXJ2YWwgc28gYSBsYXRlciBvdXRhZ2UgZmxpcHMgdGhlXG4vLyBzZXJ2aWNlIE5vdFJlYWR5IChkcmFpbmluZyB0cmFmZmljKSBhbmQgYSByZWNvdmVyeSBmbGlwcyBpdCBiYWNrIOKAlCB3aXRob3V0XG4vLyBldmVyIGV4aXRpbmcgLyByZXN0YXJ0aW5nIHRoZSBwcm9jZXNzLlxuY29uc3QgUkVBRFlfUkVUUllfQkFTRV9NUyA9IDEwMDA7XG5jb25zdCBSRUFEWV9SRVRSWV9NQVhfTVMgPSAxMDAwMDtcbmNvbnN0IFJFQURZX01PTklUT1JfSU5URVJWQUxfTVMgPSBlbnZJbnQoJ1JFQURJTkVTU19NT05JVE9SX0lOVEVSVkFMX01TJywgMTVfMDAwLCB7IG1pbjogMSB9KTtcblxuLyoqXG4gKiBFc3RhYmxpc2ggYW5kIGNvbnRpbnVvdXNseSBtb25pdG9yIHRoZSBzZXJ2aWNlJ3MgZGF0YXN0b3JlIGRlcGVuZGVuY3ksXG4gKiBmbGlwcGluZyByZWFkaW5lc3Mgc3RhdGUgaW5zdGVhZCBvZiBjcmFzaC1sb29waW5nLlxuICpcbiAqIC0gRXN0YWJsaXNoIHBoYXNlOiByZXRyeSBgb25CZWZvcmVTdGFydGAgKGUuZy4gY29ubmVjdE1vbmdvKSB3aXRoIGNhcHBlZFxuICogICBiYWNrb2ZmIHVudGlsIGl0IHN1Y2NlZWRzIOKAlCBhIGNvbGQgZGF0YXN0b3JlIG11c3QgbmV2ZXIgZXhpdCB0aGUgcHJvY2Vzcy5cbiAqIC0gTW9uaXRvciBwaGFzZTogcG9sbCBgdGVzdERhdGFiYXNlYCBmb3IgdGhlIGxpZmUgb2YgdGhlIHByb2Nlc3M7IGZsaXBcbiAqICAgcmVhZHkvTm90UmVhZHkgb24gdHJhbnNpdGlvbnMuIFdoaWxlIE5vdFJlYWR5IHRoZSByZWFkaW5lc3MgZ3VhcmQgNTAzc1xuICogICBidXNpbmVzcyB0cmFmZmljIGFuZCBvcmNoZXN0cmF0b3IgcmVhZGluZXNzIHByb2JlcyBkcmFpbiB0aGUgaW5zdGFuY2UuXG4gKlxuICogUnVucyBpbiB0aGUgYmFja2dyb3VuZCAodGhlIEhUVFAgc2VydmVyIGlzIGFscmVhZHkgbGlzdGVuaW5nKS4gU3RvcHMgd2hlblxuICogYGFib3J0ZWQoKWAgcmV0dXJucyB0cnVlIChncmFjZWZ1bCBzaHV0ZG93biksIHNvIGl0IG5ldmVyIGtlZXBzIGEgY2xvc2luZ1xuICogcHJvY2VzcyBhbGl2ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3VwZXJ2aXNlRGVwZW5kZW5jaWVzKFxuICBuYW1lOiBzdHJpbmcsXG4gIG9uQmVmb3JlU3RhcnQ6ICgoKSA9PiBQcm9taXNlPHZvaWQ+KSB8IHVuZGVmaW5lZCxcbiAgdGVzdERhdGFiYXNlOiAoKCkgPT4gUHJvbWlzZTxib29sZWFuPikgfCBmYWxzZSB8IHVuZGVmaW5lZCxcbiAgYWJvcnRlZDogKCkgPT4gYm9vbGVhbixcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAob25CZWZvcmVTdGFydCkge1xuICAgIGF3YWl0IHJldHJ5Rm9yZXZlcihvbkJlZm9yZVN0YXJ0LCB7XG4gICAgICBiYXNlTXM6IFJFQURZX1JFVFJZX0JBU0VfTVMsXG4gICAgICBtYXhNczogUkVBRFlfUkVUUllfTUFYX01TLFxuICAgICAgb25BdHRlbXB0RmFpbGVkOiAoZXJyb3IsIGRlbGF5TXMpID0+IGxvZ2dlci53YXJuKFxuICAgICAgICBgJHtuYW1lfTogZGVwZW5kZW5jeSBpbml0IGZhaWxlZCwgcmV0cnlpbmcgaW4gJHtkZWxheU1zfW1zYCxcbiAgICAgICAgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycm9yKSB9LFxuICAgICAgKSxcbiAgICAgIHNob3VsZENvbnRpbnVlOiAoKSA9PiAhYWJvcnRlZCgpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gTm8gZGF0YXN0b3JlIHRvIGdhdGUgb24g4oaSIHJlYWR5IGFzIHNvb24gYXMgd2UgYXJlIGxpc3RlbmluZy5cbiAgaWYgKHRlc3REYXRhYmFzZSA9PT0gZmFsc2UpIHtcbiAgICBpZiAoYWJvcnRlZCgpKSByZXR1cm47IC8vIHNodXRkb3duIGJlZ2FuIHdoaWxlIHdlIHdlcmUgaW5pdGlhbGl6aW5nXG4gICAgc2V0UmVhZHkodHJ1ZSk7XG4gICAgbG9nZ2VyLmluZm8oYCR7bmFtZX0gcmVhZHkgKG5vIGRhdGFzdG9yZSBkZXBlbmRlbmN5KWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHByb2JlID0gdGVzdERhdGFiYXNlID8/ICgoKSA9PiBnZXRDb25uZWN0aW9uKCkudGVzdENvbm5lY3Rpb24oKSk7XG4gIGxldCB3YWl0RGVsYXkgPSBSRUFEWV9SRVRSWV9CQVNFX01TO1xuICB3aGlsZSAoIWFib3J0ZWQoKSkge1xuICAgIGxldCBvayA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBvayA9IGF3YWl0IHByb2JlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBvayA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEEgcHJvYmUgdGhhdCB3YXMgaW4gZmxpZ2h0IHdoZW4gc2h1dGRvd24gYmVnYW4gbXVzdCBub3QgZmxpcCB0aGVcbiAgICAvLyBkcmFpbmluZyBpbnN0YW5jZSBiYWNrIHRvIHJlYWR5LlxuICAgIGlmIChhYm9ydGVkKCkpIGJyZWFrO1xuICAgIGlmIChvayAmJiAhaXNSZWFkeSgpKSB7XG4gICAgICBzZXRSZWFkeSh0cnVlKTtcbiAgICAgIHdhaXREZWxheSA9IFJFQURZX1JFVFJZX0JBU0VfTVM7XG4gICAgICBsb2dnZXIuaW5mbyhgJHtuYW1lfSByZWFkeSDigJQgZGVwZW5kZW5jaWVzIGNvbm5lY3RlZGApO1xuICAgIH0gZWxzZSBpZiAoIW9rICYmIGlzUmVhZHkoKSkge1xuICAgICAgc2V0UmVhZHkoZmFsc2UpO1xuICAgICAgbG9nZ2VyLndhcm4oYCR7bmFtZX0gZGVncmFkZWQg4oCUIGRlcGVuZGVuY3kgY2hlY2sgZmFpbGluZyAobm93IE5vdFJlYWR5KWApO1xuICAgIH1cblxuICAgIC8vIFN0ZWFkeSBjYWRlbmNlIG9uY2UgcmVhZHk7IGZhc3RlciBiYWNrb2ZmIHdoaWxlIHdhaXRpbmcgc28gd2UgZmxpcCB0b1xuICAgIC8vIHJlYWR5IHByb21wdGx5IHdoZW4gdGhlIGRhdGFzdG9yZSBjb21lcyB1cC5cbiAgICBpZiAoaXNSZWFkeSgpKSB7XG4gICAgICBhd2FpdCBzbGVlcChSRUFEWV9NT05JVE9SX0lOVEVSVkFMX01TKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc2xlZXAod2FpdERlbGF5KTtcbiAgICAgIHdhaXREZWxheSA9IG5leHRCYWNrb2ZmTXMod2FpdERlbGF5LCBSRUFEWV9SRVRSWV9NQVhfTVMpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIGEgc2VydmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRTZXJ2ZXJPcHRpb25zIHtcbiAgLyoqIFNlcnZpY2UgbmFtZSBmb3IgbG9nZ2luZyAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogUG9ydCB0byBsaXN0ZW4gb24gKGRlZmF1bHQ6IGZyb20gY29uZmlnKSAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogU1NFIG1hbmFnZXIgZm9yIGdyYWNlZnVsIHNodXRkb3duICovXG4gIHNzZU1hbmFnZXI/OiBTU0VNYW5hZ2VyO1xuICAvKiogU2h1dGRvd24gdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDE1MDAwKSAqL1xuICBzaHV0ZG93blRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqIENhbGxiYWNrIGFmdGVyIHNlcnZlciBzdGFydHMgKi9cbiAgb25TdGFydD86IChwb3J0OiBudW1iZXIpID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayBiZWZvcmUgc2h1dGRvd24gKi9cbiAgb25TaHV0ZG93bj86ICgpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKiBSdW5zIGJlZm9yZSBkYXRhYmFzZSBjaGVjayAoZS5nLiwgaW5pdGlhbGl6ZSBleHRlcm5hbCBjb25uZWN0aW9ucykgKi9cbiAgb25CZWZvcmVTdGFydD86ICgpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKiBDdXN0b20gZGF0YWJhc2UgaGVhbHRoIGNoZWNrLCBvciBmYWxzZSB0byBza2lwLiBEZWZhdWx0OiBQb3N0Z3JlU1FMIHRlc3RDb25uZWN0aW9uICovXG4gIHRlc3REYXRhYmFzZT86ICgoKSA9PiBQcm9taXNlPGJvb2xlYW4+KSB8IGZhbHNlO1xuICAvKiogQ3VzdG9tIGRhdGFiYXNlIGNsb3NlLCBvciBmYWxzZSB0byBza2lwLiBEZWZhdWx0OiBQb3N0Z3JlU1FMIGNsb3NlQ29ubmVjdGlvbiAqL1xuICBjbG9zZURhdGFiYXNlPzogKCgpID0+IFByb21pc2U8dm9pZD4pIHwgZmFsc2U7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHN0YXJ0aW5nIGEgc2VydmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRTZXJ2ZXJSZXN1bHQge1xuICAvKiogSFRUUCBzZXJ2ZXIgaW5zdGFuY2UgKi9cbiAgc2VydmVyOiBTZXJ2ZXI7XG4gIC8qKiBQb3J0IHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uICovXG4gIHBvcnQ6IG51bWJlcjtcbiAgLyoqIEZ1bmN0aW9uIHRvIG1hbnVhbGx5IHRyaWdnZXIgc2h1dGRvd24gKi9cbiAgc2h1dGRvd246ICgpID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogU3RhcnQgYW4gRXhwcmVzcyBzZXJ2ZXIgd2l0aCBncmFjZWZ1bCBzaHV0ZG93biBoYW5kbGluZ1xuICpcbiAqIEZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgZGF0YWJhc2UgY29ubmVjdGlvbiB0ZXN0aW5nXG4gKiAtIEdyYWNlZnVsIHNodXRkb3duIG9uIFNJR0lOVC9TSUdURVJNXG4gKiAtIFNTRSBjb25uZWN0aW9uIGNsZWFudXBcbiAqIC0gQ29uZmlndXJhYmxlIHNodXRkb3duIHRpbWVvdXRcbiAqXG4gKiBAcGFyYW0gYXBwIC0gRXhwcmVzcyBhcHBsaWNhdGlvblxuICogQHBhcmFtIG9wdGlvbnMgLSBTZXJ2ZXIgb3B0aW9uc1xuICogQHJldHVybnMgU2VydmVyIGluc3RhbmNlIGFuZCBjb250cm9sIGZ1bmN0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB7IGFwcCwgc3NlTWFuYWdlciB9ID0gY3JlYXRlQXBwKCk7XG4gKlxuICogYXBwLnBvc3QoJy9hcGkvcmVzb3VyY2UnLCByZXF1aXJlQXV0aCwgaGFuZGxlcik7XG4gKlxuICogYXdhaXQgc3RhcnRTZXJ2ZXIoYXBwLCB7XG4gKiAgIG5hbWU6ICdNeSBNaWNyb3NlcnZpY2UnLFxuICogICBzc2VNYW5hZ2VyLFxuICogICBvblN0YXJ0OiAocG9ydCkgPT4gY29uc29sZS5sb2coYExpc3RlbmluZyBvbiAke3BvcnR9YCksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRTZXJ2ZXIoXG4gIGFwcDogRXhwcmVzcyxcbiAgb3B0aW9uczogU3RhcnRTZXJ2ZXJPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFN0YXJ0U2VydmVyUmVzdWx0PiB7XG4gIGNvbnN0IHNlcnZlckNvbmZpZyA9IENvbmZpZy5nZXQoJ3NlcnZlcicpO1xuICBjb25zdCB7XG4gICAgbmFtZSA9ICdNaWNyb3NlcnZpY2UnLFxuICAgIHNzZU1hbmFnZXIsXG4gICAgc2h1dGRvd25UaW1lb3V0TXMgPSAxNTAwMCxcbiAgICBvblN0YXJ0LFxuICAgIG9uU2h1dGRvd24sXG4gICAgb25CZWZvcmVTdGFydCxcbiAgICB0ZXN0RGF0YWJhc2UsXG4gICAgY2xvc2VEYXRhYmFzZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHBvcnQgPSBvcHRpb25zLnBvcnQgPz8gc2VydmVyQ29uZmlnLnBvcnQ7XG5cbiAgLy8gVmFsaWRhdGUgYXV0aCBjb25maWd1cmF0aW9uIGF0IHNlcnZlciBzdGFydHVwIChub3QgZHVyaW5nIENESyBzeW50aGVzaXMpXG4gIENvbmZpZy52YWxpZGF0ZUF1dGgoKTtcbiAgLy8gRmFpbCBmYXN0IGlmIHRoaXMgc2VydmljZSBoYXMgbm8gaW50ZXJuYWwgc2lnbmluZyBrZXkgb2YgaXRzIG93biwgb3Igbm9cbiAgLy8gcHVibGljIGJ1bmRsZSB0byB2ZXJpZnkgaXRzIHBlZXJzIHdpdGguIFdpdGhvdXQgdGhlbSBpdCB3b3VsZCBtaW50XG4gIC8vIHRva2VucyBvbiBhbiBFUEhFTUVSQUwgaW4tcHJvY2VzcyBrZXkgdGhhdCBubyBwZWVyIGFjY2VwdHMsIGFuZCByZWplY3QgZXZlcnlcbiAgLy8gcGVlcidzIHRva2VuIOKAlCBpLmUuIHNpbGVudGx5IGxvc2UgYWxsIHNlcnZpY2UtdG8tc2VydmljZSB0cmFmZmljLiBDaGVja2VkXG4gIC8vIEhFUkUgcmF0aGVyIHRoYW4gaW4gYGNyZWF0ZUFwcGAgYmVjYXVzZSBpdCBpcyBhIHByb3BlcnR5IG9mIHRoZSBydW5uaW5nXG4gIC8vIGRlcGxveW1lbnQsIG5vdCBvZiB0aGUgYXBwIG9iamVjdDogcm91dGUtdGFibGUgYnVpbGRlcnMgYW5kIHRlc3Qgc3VpdGVzXG4gIC8vIGFzc2VtYmxlIGFuIGFwcCB3aXRob3V0IGV2ZXIgc2lnbmluZyBhbnl0aGluZy5cbiAgZm9yIChjb25zdCBlbnZWYXIgb2YgWydTRVJWSUNFX1NJR05JTkdfS0VZX0ZJTEUnLCAnU0VSVklDRV9LRVlfQlVORExFX0ZJTEUnXSBhcyBjb25zdCkge1xuICAgIGlmICghcHJvY2Vzcy5lbnZbZW52VmFyXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudlZhcn0gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQgKGdlbmVyYXRlIHdpdGggZGVwbG95L2Jpbi9zZXJ2aWNlLXNpZ25pbmcta2V5cy5zaCkuIFNldCBpdCBiZWZvcmUgc3RhcnRpbmcgdGhlIHNlcnZlci5gKTtcbiAgICB9XG4gIH1cbiAgLy8gRmFpbCBmYXN0IG9uIGFuIHVudXNhYmxlIFJlZGlzIGNvbmZpZ3VyYXRpb24gKHRocm93cyBSZWRpc0NvbmZpZ0Vycm9yKSDigJQgYVxuICAvLyBSZWRpcyBjbGllbnQgaXMgY3JlYXRlZCBsYXppbHkgb24gZmlyc3QgdXNlLCBzbyB3aXRob3V0IHRoaXMgYSBiYWQgY29uZmlnXG4gIC8vIHdvdWxkIHN1cmZhY2UgYXMgcmVxdWVzdC10aW1lIGVycm9ycyBpbnN0ZWFkIG9mIGEgZmFpbGVkIHN0YXJ0LlxuICByZXNvbHZlUmVkaXNDb25uZWN0aW9uKCk7XG5cbiAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nICR7bmFtZX0uLi5gKTtcblxuICAvLyBNYXJrIE5vdFJlYWR5IHN5bmNocm9ub3VzbHksIEJFRk9SRSB0aGUgcG9ydCBvcGVucywgc28gbm8gcmVxdWVzdCBzbGlwc1xuICAvLyB0aHJvdWdoIHRoZSByZWFkaW5lc3MgZ3VhcmQgYmVmb3JlIHRoZSBzdXBlcnZpc29yIGhhcyBydW4uIFRoZSBzdXBlcnZpc29yXG4gIC8vIGZsaXBzIGl0IHRydWUgb25jZSBkZXBlbmRlbmNpZXMgY29ubmVjdC5cbiAgc2V0UmVhZHkoZmFsc2UpO1xuXG4gIC8vIExpc3RlbiBGSVJTVCwgdGhlbiBlc3RhYmxpc2ggKyBtb25pdG9yIHRoZSBkYXRhc3RvcmUgaW4gdGhlIGJhY2tncm91bmQsXG4gIC8vIHJlcG9ydGluZyBOb3RSZWFkeSB1bnRpbCBpdCBjb25uZWN0cy4gVGVzdGluZyB0aGUgREIgYmVmb3JlIGxpc3RlbiBhbmRcbiAgLy8gZXhpdGluZyBvbiBmYWlsdXJlIGNyYXNoLWxvb3BzIHRoZSB3aG9sZSBmbGVldCBkdXJpbmcgYSBjb2xkLURCIHN0YW1wZWRlOlxuICAvLyB0aGUgcHJvY2VzcyBuZXZlciBvcGVucyBpdHMgcG9ydCwgc28gL2hlYWx0aCAobGl2ZW5lc3MpLCAvcmVhZHkgYW5kIHRoZVxuICAvLyByZWFkaW5lc3MgZ3VhcmQgY2FuJ3QgYW5zd2VyIGFuZCB0aGUgb3JjaGVzdHJhdG9yIG9ubHkgc2VlcyBhIGRlYWQgcG9kLlxuICAvLyBPcGVuaW5nIHRoZSBwb3J0IGZpcnN0IG1ha2VzIFwiZGVwZW5kZW5jeSBkb3duXCIgYW4gb2JzZXJ2YWJsZSBzdGF0ZS5cbiAgY29uc3Qgc2VydmVyID0gYXBwLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gICAgbG9nZ2VyLmluZm8oYCR7bmFtZX0gbGlzdGVuaW5nIG9uIHBvcnQ6ICR7cG9ydH1gKTtcbiAgICBsb2dnZXIuaW5mbyhgUGxhdGZvcm0gVVJMOiAke3NlcnZlckNvbmZpZy5wbGF0Zm9ybVVybH1gKTtcbiAgICBvblN0YXJ0Py4ocG9ydCk7XG4gIH0pO1xuXG4gIC8vIFNodXRkb3duIGhhbmRsZXIgKGd1YXJkZWQgYWdhaW5zdCBjb25jdXJyZW50IHNpZ25hbHMpXG4gIGxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcblxuICAvLyBCYWNrZ3JvdW5kIGRlcGVuZGVuY3kgc3VwZXJ2aXNvciDigJQgZXN0YWJsaXNoZWQgKyBtb25pdG9yZWQgYWZ0ZXIgbGlzdGVuLFxuICAvLyBzdG9wcGVkIG9uIHNodXRkb3duIHNvIGl0IG5ldmVyIGtlZXBzIGEgY2xvc2luZyBwcm9jZXNzIGFsaXZlLiBHdWFyZCB0aGVcbiAgLy8gZmxvYXRpbmcgcHJvbWlzZTogZXZlcnkgZXhwZWN0ZWQgZmFpbHVyZSBpcyBoYW5kbGVkIGluc2lkZSwgc28gYSByZWplY3Rpb25cbiAgLy8gaGVyZSBtZWFucyBhIHByb2dyYW1taW5nIGVycm9yIOKAlCBsb2cgaXQgYW5kIGxlYXZlIHRoZSBzZXJ2aWNlIE5vdFJlYWR5XG4gIC8vIHJhdGhlciB0aGFuIGxldHRpbmcgaXQgYmVjb21lIGFuIHVuaGFuZGxlZFJlamVjdGlvbiB0aGF0IGNyYXNoLWV4aXRzIHRoZVxuICAvLyBwcm9jZXNzICh3aGljaCB3b3VsZCBkZWZlYXQgdGhlIHdob2xlIFwibmV2ZXIgZXhpdCBvbiBkZXBlbmRlbmN5IHRyb3VibGVcIlxuICAvLyBnb2FsKS5cbiAgc3VwZXJ2aXNlRGVwZW5kZW5jaWVzKG5hbWUsIG9uQmVmb3JlU3RhcnQsIHRlc3REYXRhYmFzZSwgKCkgPT4gc2h1dHRpbmdEb3duKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICBsb2dnZXIuZXJyb3IoJ0RlcGVuZGVuY3kgc3VwZXJ2aXNvciBjcmFzaGVkOyBzZXJ2aWNlIHdpbGwgcmVtYWluIE5vdFJlYWR5JywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycm9yKSB9KTtcbiAgfSk7XG5cbiAgY29uc3Qgc2h1dGRvd24gPSBhc3luYyAoc2lnbmFsPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHNodXR0aW5nRG93bikgcmV0dXJuO1xuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG5cbiAgICAvLyBEcmFpbiBGSVJTVDogcmVwb3J0IE5vdFJlYWR5IGJlZm9yZSBhbnl0aGluZyBlbHNlLCBzbyB0aGUgbG9hZCBiYWxhbmNlciAvXG4gICAgLy8gcmVhZGluZXNzIHByb2JlIHN0b3BzIHNlbmRpbmcgbmV3IHdvcmsgd2hpbGUgdGhlIHJlc3Qgb2Ygc2h1dGRvd24gcnVucy5cbiAgICAvLyBgb25TaHV0ZG93bmAgY2FuIHRha2Ugc2Vjb25kczsgcmVhZGluZXNzIGxlZnQgZ3JlZW4gYWNyb3NzIGl0IGtlZXBzIG5ld1xuICAgIC8vIHJlcXVlc3RzIGFycml2aW5nIGF0IGEgcHJvY2VzcyB0aGF0IGlzIGFscmVhZHkgdGVhcmluZyBpdHNlbGYgZG93bi5cbiAgICBzZXRSZWFkeShmYWxzZSk7XG5cbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgJHtzaWduYWx9IHJlY2VpdmVkLCBzaHV0dGluZyBkb3duIGdyYWNlZnVsbHkuLi5gKTtcbiAgICB9XG5cbiAgICAvLyBBcm0gdGhlIGZvcmNlLWV4aXQgQkVGT1JFIGF3YWl0aW5nIGFueXRoaW5nOiBhIGh1bmcgb25TaHV0ZG93biAoYSBzdHVja1xuICAgIC8vIHF1ZXVlIGNsb3NlLCBhIFJlZGlzIHF1aXQgdGhhdCBuZXZlciBhbnN3ZXJzKSB3b3VsZCBvdGhlcndpc2UgYmxvY2sgZm9yZXZlclxuICAgIC8vIHdpdGggdGhlIHRpbWVyIG5ldmVyIHN0YXJ0ZWQsIHNvIHRoZSBwb2Qgd291bGQgaWdub3JlIFNJR1RFUk0gdW50aWwgU0lHS0lMTC5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcignRm9yY2VkIHNodXRkb3duIGFmdGVyIHRpbWVvdXQnKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9LCBzaHV0ZG93blRpbWVvdXRNcykudW5yZWYoKTtcblxuICAgIC8vIEN1c3RvbSBzaHV0ZG93biBjYWxsYmFja1xuICAgIGlmIChvblNodXRkb3duKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBvblNodXRkb3duKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGluIG9uU2h1dGRvd24gY2FsbGJhY2snLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsb3NlIFNTRSBjb25uZWN0aW9uc1xuICAgIGlmIChzc2VNYW5hZ2VyKSB7XG4gICAgICBzc2VNYW5hZ2VyLnNodXRkb3duKCk7XG4gICAgICBsb2dnZXIuaW5mbygnU1NFIGNvbm5lY3Rpb25zIGNsb3NlZCcpO1xuICAgIH1cblxuICAgIC8vIENsb3NlIEhUVFAgc2VydmVyXG4gICAgc2VydmVyLmNsb3NlKGFzeW5jICgpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKCdIVFRQIHNlcnZlciBjbG9zZWQnKTtcblxuICAgICAgLy8gRXZlcnkgaW4tZmxpZ2h0IHJlcXVlc3QgaGFzIG5vdyBmaW5pc2hlZCBhbmQgYnVmZmVyZWQgaXRzIG1ldGVyaW5nIHVuaXQ7XG4gICAgICAvLyBzZW5kIHRoZW0gYmVmb3JlIGV4aXRpbmcgKGFwaS1jb3JlIHF1b3RhLWluY3JlbWVudC1iYXRjaGVyKS4gTmV2ZXIgcmVqZWN0cy5cbiAgICAgIGF3YWl0IGZsdXNoUXVvdGFJbmNyZW1lbnRzKCk7XG5cbiAgICAgIC8vIFNodXRkb3duIE9wZW5UZWxlbWV0cnkgdHJhY2luZ1xuICAgICAgYXdhaXQgc2h1dGRvd25UcmFjaW5nKCkuY2F0Y2goZXJyID0+IGxvZ2dlci5lcnJvcignRXJyb3Igc2h1dHRpbmcgZG93biB0cmFjaW5nJywgeyBlcnJvcjogZXJyIH0pKTtcblxuICAgICAgLy8gQ2xvc2UgZGF0YWJhc2UgY29ubmVjdGlvblxuICAgICAgaWYgKGNsb3NlRGF0YWJhc2UgIT09IGZhbHNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKGNsb3NlRGF0YWJhc2UpIHtcbiAgICAgICAgICAgIGF3YWl0IGNsb3NlRGF0YWJhc2UoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgY2xvc2VDb25uZWN0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZ2dlci5pbmZvKCdEYXRhYmFzZSBjb25uZWN0aW9uIGNsb3NlZCcpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgY2xvc2luZyBkYXRhYmFzZScsIHsgZXJyb3IgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIFJlZ2lzdGVyIHNpZ25hbCBoYW5kbGVyc1xuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsICgpID0+IHZvaWQgc2h1dGRvd24oJ1NJR0lOVCcpKTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgKCkgPT4gdm9pZCBzaHV0ZG93bignU0lHVEVSTScpKTtcblxuICByZXR1cm4ge1xuICAgIHNlcnZlcixcbiAgICBwb3J0LFxuICAgIHNodXRkb3duOiAoKSA9PiBzaHV0ZG93bigpLFxuICB9O1xufVxuXG4vKipcbiAqIFNpbXBsZSBzZXJ2ZXIgc3RhcnQgd3JhcHBlciB3aXRoIGVycm9yIGhhbmRsaW5nXG4gKlxuICogQHBhcmFtIGFwcCAtIEV4cHJlc3MgYXBwbGljYXRpb25cbiAqIEBwYXJhbSBvcHRpb25zIC0gU2VydmVyIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgeyBhcHAsIHNzZU1hbmFnZXIgfSA9IGNyZWF0ZUFwcCgpO1xuICogYXBwLnBvc3QoJy9hcGkvcmVzb3VyY2UnLCBoYW5kbGVyKTtcbiAqXG4gKiB2b2lkIHJ1blNlcnZlcihhcHAsIHsgbmFtZTogJ015IFNlcnZpY2UnLCBzc2VNYW5hZ2VyIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5TZXJ2ZXIoYXBwOiBFeHByZXNzLCBvcHRpb25zOiBTdGFydFNlcnZlck9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAvLyBSb3V0ZSB0YWJsZSBvZiB0aGUgZnVsbHkgYXNzZW1ibGVkIGFwcCAoc2VlIGFwaS1jb3JlJ3Mgcm91dGUtdGFibGUudHMpOiB0aGVcbiAgLy8gc2FtZSBpbnRyb3NwZWN0aW9uIHRoZSBwZXItc2VydmljZSBjb3ZlcmFnZSB0ZXN0IGFzc2VydHMgb24sIGxvZ2dlZCBvbmNlIGF0XG4gIC8vIGJvb3Qgc28gYW4gdW5nYXRlZCBvciB1bmF1ZGl0ZWQgd3JpdGUgcm91dGUgaXMgdmlzaWJsZSBpbiB0aGUgcnVubmluZ1xuICAvLyBzZXJ2aWNlLCBub3Qgb25seSBpbiBDSS5cbiAgbG9nZ2VyLmluZm8oJ1JvdXRlIHRhYmxlIGJ1aWx0Jywgc3VtbWFyaXplUm91dGVUYWJsZShidWlsZFJvdXRlVGFibGUoYXBwKSkpO1xuXG4gIC8vIExhc3QtcmVzb3J0IGZhdWx0IGhhbmRsZXJzIGZvciB0aGUgcHJvZHVjdGlvbiBlbnRyeXBvaW50OiBhbiB1bmhhbmRsZWRcbiAgLy8gcmVqZWN0aW9uIC8gdW5jYXVnaHQgZXhjZXB0aW9uIGlzIGxvZ2dlZCAobm90IHNpbGVudGx5IGZhdGFsKSB0aGVuIHRoZVxuICAvLyBwcm9jZXNzIGV4aXRzIGZvciB0aGUgb3JjaGVzdHJhdG9yIHRvIHJlc3RhcnQuIE5vLW9wIHVuZGVyIE5PREVfRU5WPXRlc3QuXG4gIGluc3RhbGxDcmFzaEhhbmRsZXJzKGxvZ2dlcik7XG4gIHN0YXJ0U2VydmVyKGFwcCwgb3B0aW9ucykuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgLy8gc3RhcnRTZXJ2ZXIgbm93IGxpc3RlbnMtZmlyc3QgYW5kIHN1cGVydmlzZXMgdGhlIERCIGluIHRoZSBiYWNrZ3JvdW5kLCBzb1xuICAgIC8vIGl0IG9ubHkgcmVqZWN0cyBvbiBhIGdlbnVpbmVseSBmYXRhbCBTRVRVUCBlcnJvciAoaW52YWxpZCBhdXRoIGNvbmZpZywgYVxuICAgIC8vIGZhaWxlZCBvblN0YXJ0LCB0aGUgcG9ydCBhbHJlYWR5IGluIHVzZSkuIExvZyBtZXNzYWdlICsgc3RhY2sgZXhwbGljaXRseTpcbiAgICAvLyBhbiBFcnJvciBpbiB3aW5zdG9uIG1ldGFkYXRhIHNlcmlhbGl6ZXMgdG8gYHt9YCAobWVzc2FnZS9zdGFjayBhcmVcbiAgICAvLyBub24tZW51bWVyYWJsZSksIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBoaWRlIHRoZSBjYXVzZSBiZWhpbmQgYHtlcnJvcjp7fX1gLlxuICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcicsIHtcbiAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpLFxuICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH0pO1xufVxuIl19
@@ -50,7 +50,7 @@
50
50
  * when no read replica is configured, so a deploy with `DB_READ_HOST` unset —
51
51
  * which is how all four targets ship — never touches Redis on the request path.
52
52
  */
53
- import { createEnvRedisClient, createLogger, createRedisReadyGate, envInt, isReadReplicaConfigured } from '@pipeline-builder/api-core';
53
+ import { createEnvRedisClient, createLogger, createRedisReadyGate, emitCounter, envInt, isReadReplicaConfigured } from '@pipeline-builder/api-core';
54
54
  const logger = createLogger('write-pin');
55
55
  /**
56
56
  * How long a write keeps its org on the primary.
@@ -115,6 +115,12 @@ export function createEnvRedisWritePinStore() {
115
115
  return (await redis.exists(key(orgId))) === 1;
116
116
  }
117
117
  catch (err) {
118
+ // Counted under the same metric with a different `op`: this half is
119
+ // SAFE (it fails closed to the primary) but it runs on every request, so
120
+ // it is the half that actually reports Redis health — and a deployment
121
+ // silently serving every read from the primary has lost the whole
122
+ // benefit of the replica it is paying for.
123
+ emitCounter('postgres_write_pin_errors_total', { op: 'lookup' });
118
124
  logger.warn('Write-pin lookup failed; routing reads to the primary', {
119
125
  error: err instanceof Error ? err.message : String(err),
120
126
  });
@@ -134,9 +140,27 @@ export function createEnvRedisWritePinStore() {
134
140
  }
135
141
  catch (err) {
136
142
  // A failed pin is the dangerous direction — the NEXT request may read a
137
- // stale replica — but there is nothing useful to do about it here, and
138
- // throwing would fail a request whose write already committed. Log it
139
- // loudly; `postgres_write_pin_errors_total` is the thing to alert on.
143
+ // stale replica and the user loses sight of their own write — but there
144
+ // is nothing useful to do about it here, and throwing would fail a
145
+ // request whose write already COMMITTED.
146
+ //
147
+ // Counted through api-core's `emitCounter` SEAM rather than api-server's
148
+ // own `incCounter`, although this file lives in api-server. Importing
149
+ // `./metrics.js` here puts it in the module graph of every service's
150
+ // request path, and it reads `Config.getAny('observability')` at module
151
+ // load — which broke api/message's index-wiring suite with
152
+ // `Config.getAny is not a function` the moment this import was added.
153
+ // The seam is a no-op until api-server's app factory calls
154
+ // `setCounterEmitter(incCounter)` at startup, so production counts and
155
+ // nothing else has to load the registry to do it.
156
+ //
157
+ // So it is counted as well as logged, and the counter is the point: the
158
+ // symptom is a row that is briefly missing, which no error rate and no
159
+ // log search will attribute back to here. `PostgresWritePinErrors` in
160
+ // the deploy alert rules watches it. The series is absent on every
161
+ // deploy that has not enabled read-splitting, which is correct — with no
162
+ // replica there is nothing to be stale.
163
+ emitCounter('postgres_write_pin_errors_total', { op: 'set' });
140
164
  logger.warn('Failed to set the read-after-write pin; a subsequent read may hit a stale replica', {
141
165
  orgId,
142
166
  error: err instanceof Error ? err.message : String(err),
@@ -190,4 +214,4 @@ export function recordWriteForPin(scope) {
190
214
  return;
191
215
  void getWritePinStore().pin(scope.orgId);
192
216
  }
193
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGUtcGluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS93cml0ZS1waW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlERztBQUVILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNdkksTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRXpDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsK0JBQStCLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFckUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLFVBQVUsS0FBSyxFQUFFLENBQUM7QUE4QmpELGtGQUFrRjtBQUNsRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWtCO0lBQ3pDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUN0QyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtDQUM3QixDQUFDO0FBRUYsSUFBSSxLQUFnQyxDQUFDO0FBRXJDLGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBK0I7SUFDOUQsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNmLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLElBQUksQ0FBQyxLQUFLO1FBQUUsS0FBSyxHQUFHLDJCQUEyQixFQUFFLENBQUM7SUFDbEQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsTUFBTSxVQUFVLDJCQUEy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LEtBQW9CO0lBQ3RELElBQUksQ0FBQyx1QkFBdUIsRUFBRTtRQUFFLE9BQU87SUFDdkMsSUFBSSxLQUFLLENBQUMsY0FBYztRQUFFLE9BQU8sQ0FBQyxnQ0FBZ0M7SUFDbEUsSUFBSSxNQUFNLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFBRSxLQUFLLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztBQUNsRixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBb0I7SUFDcEQsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1FBQUUsT0FBTztJQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWM7UUFBRSxPQUFPO0lBQ2xDLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgY3Jvc3MtcmVxdWVzdCB3cml0ZSBwaW4g4oCUIHJlYWQtYWZ0ZXItd3JpdGUgZm9yIGEgdXNlcidzIE5FWFQgcmVxdWVzdC5cbiAqXG4gKiBUSEUgUFJPQkxFTSBUSElTIFNPTFZFUywgd2hpY2ggaXMgdGhlIGNvbW1vbiBjYXNlIGFuZCBub3QgYW4gZWRnZSBjYXNlOlxuICogYFBPU1QgL3BpcGVsaW5lc2AgcmV0dXJucywgdGhlIHBhZ2UgcmVsb2FkcywgYEdFVCAvcGlwZWxpbmVzYCBydW5zLiBUaGF0IEdFVFxuICogaXMgYSBkaWZmZXJlbnQgcmVxdWVzdCB3aXRoIG5vIG1lbW9yeSBvZiB0aGUgUE9TVCwgc28gd2l0aG91dCBzb21ldGhpbmdcbiAqIGNhcnJpZWQgYmV0d2VlbiB0aGVtIGl0IHJvdXRlcyB0byBhIHJlcGxpY2EgdGhhdCBtYXkgbm90IGhhdmUgcmVwbGF5ZWQgdGhlXG4gKiBjb21taXQsIGFuZCB0aGUgcGlwZWxpbmUgdGhlIHVzZXIganVzdCBjcmVhdGVkIGlzIHNpbXBseSBtaXNzaW5nLiBObyBlcnJvcixcbiAqIG5vIHJldHJ5LCBhbmQgbm90IHJlcHJvZHVjaWJsZSBvbiBkZW1hbmQuXG4gKlxuICogYHRlbmFuY3kudHNgIGFscmVhZHkgc29sdmVzIHRoZSBXSVRISU4tYS1yZXF1ZXN0IGhhbGY6IGB3aXRoVGVuYW50VHhgIHNldHNcbiAqIGBtYXlIYXZlV3JpdHRlbmAgb24gdGhlIHJlcXVlc3QncyB0ZW5hbnQgY29udGV4dCwgYW5kIHRoZSByZWFkIGhlbHBlciBrZWVwc1xuICogdGhhdCByZXF1ZXN0IG9uIHRoZSBwcmltYXJ5IGFmdGVyd2FyZHMuIFRoaXMgbW9kdWxlIGV4dGVuZHMgdGhlIHNhbWUgZmxhZ1xuICogQUNST1NTIHJlcXVlc3RzIGJ5IHJlbWVtYmVyaW5nLCBpbiBSZWRpcywgdGhhdCBhbiBvcmcgd3JvdGUgcmVjZW50bHkg4oCUIGFuZCBpdFxuICogc2V0cyB0aGUgdmVyeSBzYW1lIGBtYXlIYXZlV3JpdHRlbmAgZmxhZywgc28gdGhlcmUgaXMgb25lIG1lY2hhbmlzbSBhbmQgb25lXG4gKiBjb2RlIHBhdGgsIG5vdCB0d28uXG4gKlxuICogV0hZIFJFRElTIEFORCBOT1QgQU4gTFNOLiBUaGUgYWx0ZXJuYXRpdmUgaXMgZXhhY3Q6IGNhcHR1cmVcbiAqIGBwZ19jdXJyZW50X3dhbF9sc24oKWAgYXQgY29tbWl0LCBjYXJyeSBpdCB3aXRoIHRoZSBjbGllbnQsIGFuZCBoYXZlIHRoZSByZWFkXG4gKiBwYXRoIHdhaXQgZm9yIHRoZSBzdGFuZGJ5IHRvIHJlcGxheSBhdCBsZWFzdCB0aGF0IGZhci4gSXQgd2FzIHJlamVjdGVkIGZvclxuICogcmVhc29ucyB0aGF0IGFyZSBhYm91dCB0aGlzIHN5c3RlbSByYXRoZXIgdGhhbiBhYm91dCBlbGVnYW5jZTpcbiAqXG4gKiAgIDEuIFNoYXJlZCBzdGF0ZSBpcyBtYW5kYXRvcnkgYW55d2F5IOKAlCB0aGUgYXBwIHRpZXIgaXMgMiByZXBsaWNhcyB3aWRlIG9uXG4gKiAgICAgIGVrcywgc28gYW4gaW4tcHJvY2VzcyBtYXAgbWlzc2VzIGV2ZXJ5IHJlcXVlc3QgdGhhdCBsYW5kcyBvbiB0aGUgb3RoZXJcbiAqICAgICAgcG9kLiBMU04gdHJhY2tpbmcgYXZvaWRzIHNoYXJlZCBzdGF0ZSBvbmx5IGJ5IGNhcnJ5aW5nIHRoZSB2YWx1ZSBvbiB0aGVcbiAqICAgICAgQ0xJRU5ULCBhbmQgdGhpcyBwcm9kdWN0J3Mgb3duIHBpdGNoIGlzIGZpdmUgd2F5cyBpbiAoZGFzaGJvYXJkLCBDTEksXG4gKiAgICAgIFJFU1QsIENESywgQUkpLiBBIENMSSBvciBDREsgY2FsbGVyIHdpbGwgbm90IGVjaG8gYW4gTFNOIGJhY2ssIHNvIHRoYXRcbiAqICAgICAgYXBwcm9hY2ggZGVncmFkZXMgdG8gXCJwcmltYXJ5IGZvciBldmVyeSBub24tYnJvd3NlciBjbGllbnRcIiBvciBuZWVkc1xuICogICAgICBzZXJ2ZXItc2lkZSBzdG9yYWdlIOKAlCB3aGljaCBpcyB0aGlzLCB3aXRoIGV4dHJhIHN0ZXBzLlxuICogICAyLiBBIGNsaWVudC1zdXBwbGllZCBMU04gaXMgYXR0YWNrZXItY29udHJvbGxlZCBpbnB1dCwgYW5kIGFuIHVuYm91bmRlZFxuICogICAgICB3YWl0IG9uIGEgcmVwbGljYSB0aGF0IG5ldmVyIGNhdGNoZXMgdXAgdHVybnMgYSBib2d1cyB2YWx1ZSBpbnRvIGEgaGFuZy5cbiAqICAgICAgVGhhdCBpcyBhIGRlbmlhbCBvZiBzZXJ2aWNlIHdlYXJpbmcgYSBjb3JyZWN0bmVzcyBjb3N0dW1lLCBhbmQgYm91bmRpbmdcbiAqICAgICAgaXQgY29ycmVjdGx5IGlzIGEgc2Vjb25kIHNlY3VyaXR5IHN1cmZhY2UgdG8gZ2V0IHJpZ2h0LlxuICpcbiAqIFRoZSBwaW4gaXMgQ09BUlNFIGFuZCB0aGF0IGlzIHRoZSBhY2NlcHRlZCB0cmFkZTogaXQgaXMga2V5ZWQgcGVyIE9SRywgbm90XG4gKiBwZXIgdXNlciwgYmVjYXVzZSBhIHVzZXIgbWF5IHJlYWQgdGhyb3VnaCBhIGRpZmZlcmVudCBzZXNzaW9uIHRoYW4gdGhlIG9uZVxuICogdGhhdCB3cm90ZS4gU28gb25lIG1lbWJlcidzIHdyaXRlIGJyaWVmbHkgc2VuZHMgdGhlIHdob2xlIG9yZydzIHJlYWRzIHRvIHRoZVxuICogcHJpbWFyeS4gVGhhdCBjYW4gb25seSByZW1vdmUgYSBiZW5lZml0LCBuZXZlciBpbnRyb2R1Y2UgYSByZWdyZXNzaW9uIOKAlFxuICogcmVhZGluZyBmcm9tIHRoZSBwcmltYXJ5IGlzIGV4YWN0bHkgd2hhdCBoYXBwZW5zIHRvZGF5LlxuICpcbiAqIEZBSUwgQ0xPU0VELiBObyBSZWRpcyBjb25maWd1cmVkLCBhbiB1bnJlYWNoYWJsZSBSZWRpcywgb3IgYSBmYWlsZWQgcmVhZCBhbGxcbiAqIHJlc29sdmUgdG8gXCJhc3N1bWUgdGhpcyBvcmcgd3JvdGVcIiwgd2hpY2ggcm91dGVzIHJlYWRzIHRvIHRoZSBwcmltYXJ5LiBUaGF0XG4gKiBpcyB0aGUgc2FtZSBmYWlsLWNsb3NlZC13aXRob3V0LVJlZGlzIHBvc3R1cmUgdGhlIGxlYWRlciBsb2NrIHRha2VzLCBhbmQgaXRcbiAqIGlzIHRoZSBvbmx5IHNhZmUgZGlyZWN0aW9uOiBndWVzc2luZyBcIm5vIHJlY2VudCB3cml0ZVwiIHdoZW4gdGhlIGFuc3dlciBpc1xuICogdW5rbm93biBpcyBob3cgYSB1c2VyIGxvc2VzIHNpZ2h0IG9mIHRoZWlyIG93biBkYXRhLlxuICpcbiAqIENPU1RTIE5PVEhJTkcgVU5USUwgUkVBRC1TUExJVFRJTkcgSVMgT04uIEV2ZXJ5IGVudHJ5IHBvaW50IHNob3J0LWNpcmN1aXRzXG4gKiB3aGVuIG5vIHJlYWQgcmVwbGljYSBpcyBjb25maWd1cmVkLCBzbyBhIGRlcGxveSB3aXRoIGBEQl9SRUFEX0hPU1RgIHVuc2V0IOKAlFxuICogd2hpY2ggaXMgaG93IGFsbCBmb3VyIHRhcmdldHMgc2hpcCDigJQgbmV2ZXIgdG91Y2hlcyBSZWRpcyBvbiB0aGUgcmVxdWVzdCBwYXRoLlxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQ2xpZW50LCBjcmVhdGVMb2dnZXIsIGNyZWF0ZVJlZGlzUmVhZHlHYXRlLCBlbnZJbnQsIGlzUmVhZFJlcGxpY2FDb25maWd1cmVkIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuLy8gVFlQRS1PTkxZLCBhbmQgdGhhdCBpcyBkZWxpYmVyYXRlOiBhIHR5cGUgaW1wb3J0IGlzIGVyYXNlZCBhdCBjb21waWxlIHRpbWUsIHNvXG4vLyBpdCBuZXZlciB0b3VjaGVzIHBpcGVsaW5lLWRhdGEncyBgc3R1Yk1vZHVsZWAgYXQgcnVudGltZS4gQSBWQUxVRSBpbXBvcnQgaGVyZVxuLy8gdHVybmVkIGFsbCA5MSBzdWl0ZXMgdGhhdCBzdHViIHRoYXQgcGFja2FnZSBpbnRvIGEgNTAwLlxuaW1wb3J0IHR5cGUgeyBUZW5hbnRDb250ZXh0IH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignd3JpdGUtcGluJyk7XG5cbi8qKlxuICogSG93IGxvbmcgYSB3cml0ZSBrZWVwcyBpdHMgb3JnIG9uIHRoZSBwcmltYXJ5LlxuICpcbiAqIFNob3VsZCBzaXQgY29tZm9ydGFibHkgYWJvdmUgb2JzZXJ2ZWQgcDk5IHJlcGxpY2F0aW9uIGxhZy4gVGVuIHNlY29uZHMgaXNcbiAqIGRlbGliZXJhdGVseSBnZW5lcm91cyBmb3IgYSBkZWZhdWx0OiB0b28gc2hvcnQgc2lsZW50bHkgcmVpbnRyb2R1Y2VzIHRoZVxuICogbWlzc2luZy1yb3cgYnVnLCB3aGlsZSB0b28gbG9uZyBvbmx5IGNvc3RzIG9mZmxvYWQuIFRoZSBhc3ltbWV0cnkgc2F5cyB3aGljaFxuICogd2F5IHRvIGVyci5cbiAqL1xuY29uc3QgdHRsU2Vjb25kcyA9ICgpID0+IGVudkludCgnREJfUkVBRF9XUklURV9QSU5fVFRMX1NFQ09ORFMnLCAxMCk7XG5cbmNvbnN0IGtleSA9IChvcmdJZDogc3RyaW5nKSA9PiBgcnctcGluOiR7b3JnSWR9YDtcblxuLyoqXG4gKiBUaGUgdHdvIGlvcmVkaXMgY2FsbHMgdGhpcyBuZWVkcywgcGx1cyB0aGUgdGhyZWUgbWVtYmVyc1xuICogYGNyZWF0ZVJlZGlzUmVhZHlHYXRlYCByZWFkcy5cbiAqXG4gKiBEZWNsYXJlZCBzdHJ1Y3R1cmFsbHkgcmF0aGVyIHRoYW4gYnkgZXh0ZW5kaW5nIGFwaS1jb3JlJ3MgYFJlYWR5QXdhcmVSZWRpc2AsXG4gKiB3aGljaCBpcyBpbnRlcm5hbCB0byB0aGF0IHBhY2thZ2UgYW5kIG5vdCBwYXJ0IG9mIGl0cyBwdWJsaWMgc3VyZmFjZS4gVGhlXG4gKiByZWFkaW5lc3MgZ2F0ZSBpcyBub3Qgb3B0aW9uYWw6IHRoZSBlbnYgY2xpZW50IGhhcyBubyBvZmZsaW5lIHF1ZXVlLCBzbyBhXG4gKiBjb21tYW5kIGlzc3VlZCBiZWZvcmUgdGhlIGZpcnN0IGNvbm5lY3Rpb24gY29tcGxldGVzIGlzIHJlamVjdGVkIG91dHJpZ2h0IOKAlFxuICogd2hpY2ggd291bGQgbWFrZSB0aGUgRklSU1QgcmVhZCBvZiBldmVyeSBwb2QgZmFpbCBjbG9zZWQgdG8gdGhlIHByaW1hcnkuXG4gKi9cbmludGVyZmFjZSBQaW5SZWRpcyB7XG4gIGV4aXN0cyhrZXk6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtb2RlOiAnRVgnLCB0dGw6IG51bWJlcik6IFByb21pc2U8dW5rbm93bj47XG4gIHN0YXR1cz86IHN0cmluZztcbiAgb25jZT8oZXZlbnQ6IHN0cmluZywgY2I6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQpOiB1bmtub3duO1xuICBvZmY/KGV2ZW50OiBzdHJpbmcsIGNiOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkKTogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXcml0ZVBpblN0b3JlIHtcbiAgLyoqXG4gICAqIEhhcyB0aGlzIG9yZyB3cml0dGVuIHJlY2VudGx5PyBSZXR1cm5zIFRSVUUgd2hlbiB0aGUgYW5zd2VyIGlzIHVua25vd25cbiAgICogKG5vIFJlZGlzLCB1bnJlYWNoYWJsZSwgcmVhZCBmYWlsZWQpIOKAlCBzZWUgRkFJTCBDTE9TRUQgYWJvdmUuXG4gICAqL1xuICBpc1Bpbm5lZChvcmdJZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxib29sZWFuPjtcbiAgLyoqIFJlY29yZCB0aGF0IHRoaXMgb3JnIGp1c3Qgd3JvdGUuIE5ldmVyIHRocm93cy4gKi9cbiAgcGluKG9yZ0lkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogQSBzdG9yZSB0aGF0IHJlcG9ydHMgbm90aGluZyBwaW5uZWQg4oCUIGZvciB0ZXN0cyBhbmQgZm9yIHNpbmdsZS1wcm9jZXNzIHVzZS4gKi9cbmV4cG9ydCBjb25zdCBOT19XUklURV9QSU46IFdyaXRlUGluU3RvcmUgPSB7XG4gIGlzUGlubmVkOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpLFxuICBwaW46ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLFxufTtcblxubGV0IHN0b3JlOiBXcml0ZVBpblN0b3JlIHwgdW5kZWZpbmVkO1xuXG4vKiogUmVwbGFjZSB0aGUgc3RvcmUuIEZvciB0ZXN0cywgYW5kIGZvciBhIHNlcnZpY2UgdGhhdCBvd25zIGl0cyBvd24gY2xpZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdyaXRlUGluU3RvcmUobmV4dDogV3JpdGVQaW5TdG9yZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBzdG9yZSA9IG5leHQ7XG59XG5cbi8qKlxuICogVGhlIHByb2Nlc3Mtd2lkZSBzdG9yZSwgYnVpbHQgb24gZmlyc3QgdXNlIGZyb20gYFJFRElTX1VSTGAgL1xuICogYFJFRElTX1NFTlRJTkVMU2AgZXhhY3RseSBsaWtlIHRoZSBvdGhlciBlbnYtUmVkaXMgY29uc3VtZXJzIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXcml0ZVBpblN0b3JlKCk6IFdyaXRlUGluU3RvcmUge1xuICBpZiAoIXN0b3JlKSBzdG9yZSA9IGNyZWF0ZUVudlJlZGlzV3JpdGVQaW5TdG9yZSgpO1xuICByZXR1cm4gc3RvcmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZSZWRpc1dyaXRlUGluU3RvcmUoKTogV3JpdGVQaW5TdG9yZSB7XG4gIC8vIHVuZGVmaW5lZCA9IG5vdCB5ZXQgYXR0ZW1wdGVkOyBudWxsID0gYXR0ZW1wdGVkIGFuZCB1bmF2YWlsYWJsZS5cbiAgbGV0IGNhY2hlZDogUGluUmVkaXMgfCBudWxsIHwgdW5kZWZpbmVkO1xuICBsZXQgcmVhZHk6ICgoKSA9PiBQcm9taXNlPHZvaWQ+KSB8IHVuZGVmaW5lZDtcbiAgbGV0IHdhcm5lZCA9IGZhbHNlO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGNsaWVudCgpOiBQcm9taXNlPFBpblJlZGlzIHwgbnVsbD4ge1xuICAgIGlmIChjYWNoZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY2FjaGVkID0gY3JlYXRlRW52UmVkaXNDbGllbnQ8UGluUmVkaXM+KCd3cml0ZS1waW4nKTtcbiAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1JlZGlzIHdyaXRlLXBpbiBzdG9yZSBpbml0aWFsaXplZCcsIHsgdHRsU2Vjb25kczogdHRsU2Vjb25kcygpIH0pO1xuICAgICAgICByZWFkeSA9IGNyZWF0ZVJlZGlzUmVhZHlHYXRlKGNhY2hlZCk7XG4gICAgICB9IGVsc2UgaWYgKCF3YXJuZWQpIHtcbiAgICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICAgICAgLy8gT25seSB3b3J0aCBzYXlpbmcgd2hlbiBhIHJlcGxpY2EgYWN0dWFsbHkgZXhpc3RzOiB3aXRob3V0IG9uZSBldmVyeVxuICAgICAgICAvLyByZWFkIGdvZXMgdG8gdGhlIHByaW1hcnkgcmVnYXJkbGVzcyBhbmQgdGhlIHBpbiBpcyBpcnJlbGV2YW50LlxuICAgICAgICBsb2dnZXIud2FybignTm8gUmVkaXMgY29uZmlndXJlZCBmb3IgdGhlIHJlYWQtYWZ0ZXItd3JpdGUgcGluOyBldmVyeSByZWFkIHdpbGwgdXNlIHRoZSBwcmltYXJ5Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWFkeSkgYXdhaXQgcmVhZHkoKTtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBpc1Bpbm5lZChvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBpZiAoIW9yZ0lkKSByZXR1cm4gdHJ1ZTsgLy8gbm8gb3JnIHRvIGtleSBvbiAtPiBhc3N1bWUgd3JpdHRlblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVkaXMgPSBhd2FpdCBjbGllbnQoKTtcbiAgICAgICAgaWYgKCFyZWRpcykgcmV0dXJuIHRydWU7IC8vIGZhaWwgY2xvc2VkXG4gICAgICAgIHJldHVybiAoYXdhaXQgcmVkaXMuZXhpc3RzKGtleShvcmdJZCkpKSA9PT0gMTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybignV3JpdGUtcGluIGxvb2t1cCBmYWlsZWQ7IHJvdXRpbmcgcmVhZHMgdG8gdGhlIHByaW1hcnknLCB7XG4gICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBmYWlsIGNsb3NlZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBwaW4ob3JnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgLy8gTm90aGluZyB0byBrZXkgb24sIHNvIG5vdGhpbmcgdG8gcGluLiBUaGUgcmVhZCBzaWRlIGZhaWxzIGNsb3NlZCBmb3JcbiAgICAgIC8vIHRoZSBzYW1lIHNjb3BlIGFueXdheS5cbiAgICAgIGlmICghb3JnSWQpIHJldHVybjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlZGlzID0gYXdhaXQgY2xpZW50KCk7XG4gICAgICAgIGlmICghcmVkaXMpIHJldHVybjtcbiAgICAgICAgYXdhaXQgcmVkaXMuc2V0KGtleShvcmdJZCksICcxJywgJ0VYJywgdHRsU2Vjb25kcygpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBBIGZhaWxlZCBwaW4gaXMgdGhlIGRhbmdlcm91cyBkaXJlY3Rpb24g4oCUIHRoZSBORVhUIHJlcXVlc3QgbWF5IHJlYWQgYVxuICAgICAgICAvLyBzdGFsZSByZXBsaWNhIOKAlCBidXQgdGhlcmUgaXMgbm90aGluZyB1c2VmdWwgdG8gZG8gYWJvdXQgaXQgaGVyZSwgYW5kXG4gICAgICAgIC8vIHRocm93aW5nIHdvdWxkIGZhaWwgYSByZXF1ZXN0IHdob3NlIHdyaXRlIGFscmVhZHkgY29tbWl0dGVkLiBMb2cgaXRcbiAgICAgICAgLy8gbG91ZGx5OyBgcG9zdGdyZXNfd3JpdGVfcGluX2Vycm9yc190b3RhbGAgaXMgdGhlIHRoaW5nIHRvIGFsZXJ0IG9uLlxuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHNldCB0aGUgcmVhZC1hZnRlci13cml0ZSBwaW47IGEgc3Vic2VxdWVudCByZWFkIG1heSBoaXQgYSBzdGFsZSByZXBsaWNhJywge1xuICAgICAgICAgIG9yZ0lkLFxuICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogSXMgdGhlIHBpbiBpbiBwbGF5IGF0IGFsbD9cbiAqXG4gKiBGYWxzZSB3aGVuZXZlciBubyByZWFkIHJlcGxpY2EgaXMgY29uZmlndXJlZCDigJQgd2hpY2ggaXMgaG93IGFsbCBmb3VyIHRhcmdldHNcbiAqIHNoaXAuIFRoZSBtaWRkbGV3YXJlIHVzZXMgdGhpcyBhcyBhIGhhcmQgZ2F0ZSBzbyB0aGF0IHdpdGggbm8gcmVwbGljYSBpdCBkb2VzXG4gKiBub3QgcmVnaXN0ZXIgYSByZXNwb25zZSBsaXN0ZW5lciwgZG9lcyBub3QgdG91Y2ggUmVkaXMsIGFuZCBjYWxscyBgbmV4dCgpYFxuICogU1lOQ0hST05PVVNMWSwgZXhhY3RseSBhcyBpdCBkaWQgYmVmb3JlIGFueSBvZiB0aGlzIGV4aXN0ZWQuIE1ha2luZyB0aGVcbiAqIHJlcXVlc3QgcGF0aCBhc3luY2hyb25vdXMgZm9yIGEgZmVhdHVyZSBub2JvZHkgaGFzIGVuYWJsZWQgd291bGQgYmUgYVxuICogYmVoYXZpb3VyIGNoYW5nZSBwYWlkIGJ5IGV2ZXJ5IHJvdXRlIG9uIGV2ZXJ5IHRhcmdldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUGluQWN0aXZlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNSZWFkUmVwbGljYUNvbmZpZ3VyZWQoKTtcbn1cblxuLyoqXG4gKiBCZWZvcmUgdGhlIHJlcXVlc3QgcnVuczogaWYgdGhpcyBvcmcgd3JvdGUgcmVjZW50bHksIHByZS1zZXQgdGhlIHNhbWVcbiAqIGBtYXlIYXZlV3JpdHRlbmAgZmxhZyBgd2l0aFRlbmFudFR4YCB3b3VsZCBoYXZlIHNldCwgc28gdGhlIHJlYWQgaGVscGVyIGtlZXBzXG4gKiB0aGUgcmVxdWVzdCBvbiB0aGUgcHJpbWFyeS5cbiAqXG4gKiBOby1vcHMgZW50aXJlbHkgd2hlbiBubyByZXBsaWNhIGlzIGNvbmZpZ3VyZWQg4oCUIHdoaWNoIGtlZXBzIFJlZGlzIG9mZiB0aGVcbiAqIHJlcXVlc3QgcGF0aCBmb3IgZXZlcnkgZGVwbG95IHRoYXQgaGFzIG5vdCBlbmFibGVkIHJlYWQtc3BsaXR0aW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlXcml0ZVBpbihzY29wZTogVGVuYW50Q29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzUmVhZFJlcGxpY2FDb25maWd1cmVkKCkpIHJldHVybjtcbiAgaWYgKHNjb3BlLm1heUhhdmVXcml0dGVuKSByZXR1cm47IC8vIGFscmVhZHkga25vd24gdG8gaGF2ZSB3cml0dGVuXG4gIGlmIChhd2FpdCBnZXRXcml0ZVBpblN0b3JlKCkuaXNQaW5uZWQoc2NvcGUub3JnSWQpKSBzY29wZS5tYXlIYXZlV3JpdHRlbiA9IHRydWU7XG59XG5cbi8qKlxuICogQWZ0ZXIgdGhlIHJlc3BvbnNlOiBpZiBhbnl0aGluZyBpbiB0aGlzIHJlcXVlc3Qgb3BlbmVkIGEgcHJpbWFyeSB0cmFuc2FjdGlvbixcbiAqIHBpbiB0aGUgb3JnIHNvIGl0cyBuZXh0IHJlcXVlc3QgcmVhZHMgZnJvbSB0aGUgcHJpbWFyeSB0b28uXG4gKlxuICogUmVhZHMgYG1heUhhdmVXcml0dGVuYCByYXRoZXIgdGhhbiB0aGUgSFRUUCBtZXRob2Qgb24gcHVycG9zZS4gQSBQT1NUIHRoYXRcbiAqIG9ubHkgdmFsaWRhdGVzIGhhcyBub3RoaW5nIHRvIHBpbiBmb3IsIGFuZCDigJQgbW9yZSBpbXBvcnRhbnRseSDigJQgYSBHRVQgdGhhdFxuICogd3JpdGVzIChhIGxhenkgYmFja2ZpbGwsIGEgbGFzdC1zZWVuIHN0YW1wKSBhYnNvbHV0ZWx5IGRvZXMuIFRoZSBmbGFnIGZvbGxvd3NcbiAqIHdoYXQgYWN0dWFsbHkgdG91Y2hlZCB0aGUgcHJpbWFyeSwgd2hpY2ggdGhlIG1ldGhvZCBjYW5ub3QgdGVsbCB5b3UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRXcml0ZUZvclBpbihzY29wZTogVGVuYW50Q29udGV4dCk6IHZvaWQge1xuICBpZiAoIWlzUmVhZFJlcGxpY2FDb25maWd1cmVkKCkpIHJldHVybjtcbiAgaWYgKCFzY29wZS5tYXlIYXZlV3JpdHRlbikgcmV0dXJuO1xuICB2b2lkIGdldFdyaXRlUGluU3RvcmUoKS5waW4oc2NvcGUub3JnSWQpO1xufVxuIl19
217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGUtcGluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS93cml0ZS1waW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlERztBQUVILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBTXBKLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV6Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLCtCQUErQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRXJFLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEtBQUssRUFBRSxDQUFDO0FBOEJqRCxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFrQjtJQUN6QyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDdEMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Q0FDN0IsQ0FBQztBQUVGLElBQUksS0FBZ0MsQ0FBQztBQUVyQyxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQStCO0lBQzlELEtBQUssR0FBRyxJQUFJLENBQUM7QUFDZixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQjtJQUM5QixJQUFJLENBQUMsS0FBSztRQUFFLEtBQUssR0FBRywyQkFBMkIsRUFBRSxDQUFDO0lBQ2xELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELE1BQU0sVUFBVSwyQkFBMkI7SUFDekMsbUVBQW1FO0lBQ25FLElBQUksTUFBbUMsQ0FBQztJQUN4QyxJQUFJLEtBQXdDLENBQUM7SUFDN0MsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRW5CLEtBQUssVUFBVSxNQUFNO1FBQ25CLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sR0FBRyxvQkFBb0IsQ0FBVyxXQUFXLENBQUMsQ0FBQztZQUNyRCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMvRSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkMsQ0FBQztpQkFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ2Qsc0VBQXNFO2dCQUN0RSxpRUFBaUU7Z0JBQ2pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUZBQW1GLENBQUMsQ0FBQztZQUNuRyxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksS0FBSztZQUFFLE1BQU0sS0FBSyxFQUFFLENBQUM7UUFDekIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE9BQU87UUFDTCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQWE7WUFDMUIsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxxQ0FBcUM7WUFDOUQsSUFBSSxDQUFDO2dCQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxLQUFLO29CQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsY0FBYztnQkFDdkMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixvRUFBb0U7Z0JBQ3BFLHlFQUF5RTtnQkFDekUsdUVBQXVFO2dCQUN2RSxrRUFBa0U7Z0JBQ2xFLDJDQUEyQztnQkFDM0MsV0FBVyxDQUFDLGlDQUFpQyxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ2pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsdURBQXVELEVBQUU7b0JBQ25FLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN4RCxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxJQUFJLENBQUMsQ0FBQyxjQUFjO1lBQzdCLENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUF5QjtZQUNqQyx1RUFBdUU7WUFDdkUseUJBQXlCO1lBQ3pCLElBQUksQ0FBQyxLQUFLO2dCQUFFLE9BQU87WUFDbkIsSUFBSSxDQUFDO2dCQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxLQUFLO29CQUFFLE9BQU87Z0JBQ25CLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLHdFQUF3RTtnQkFDeEUsd0VBQXdFO2dCQUN4RSxtRUFBbUU7Z0JBQ25FLHlDQUF5QztnQkFDekMsRUFBRTtnQkFDRix5RUFBeUU7Z0JBQ3pFLHNFQUFzRTtnQkFDdEUscUVBQXFFO2dCQUNyRSx3RUFBd0U7Z0JBQ3hFLDJEQUEyRDtnQkFDM0Qsc0VBQXNFO2dCQUN0RSwyREFBMkQ7Z0JBQzNELHVFQUF1RTtnQkFDdkUsa0RBQWtEO2dCQUNsRCxFQUFFO2dCQUNGLHdFQUF3RTtnQkFDeEUsdUVBQXVFO2dCQUN2RSxzRUFBc0U7Z0JBQ3RFLG1FQUFtRTtnQkFDbkUseUVBQXlFO2dCQUN6RSx3Q0FBd0M7Z0JBQ3hDLFdBQVcsQ0FBQyxpQ0FBaUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLENBQUMsSUFBSSxDQUFDLG1GQUFtRixFQUFFO29CQUMvRixLQUFLO29CQUNMLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN4RCxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGNBQWM7SUFDNUIsT0FBTyx1QkFBdUIsRUFBRSxDQUFDO0FBQ25DLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxhQUFhLENBQUMsS0FBb0I7SUFDdEQsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1FBQUUsT0FBTztJQUN2QyxJQUFJLEtBQUssQ0FBQyxjQUFjO1FBQUUsT0FBTyxDQUFDLGdDQUFnQztJQUNsRSxJQUFJLE1BQU0sZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUFFLEtBQUssQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBQ2xGLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFvQjtJQUNwRCxJQUFJLENBQUMsdUJBQXVCLEVBQUU7UUFBRSxPQUFPO0lBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYztRQUFFLE9BQU87SUFDbEMsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBjcm9zcy1yZXF1ZXN0IHdyaXRlIHBpbiDigJQgcmVhZC1hZnRlci13cml0ZSBmb3IgYSB1c2VyJ3MgTkVYVCByZXF1ZXN0LlxuICpcbiAqIFRIRSBQUk9CTEVNIFRISVMgU09MVkVTLCB3aGljaCBpcyB0aGUgY29tbW9uIGNhc2UgYW5kIG5vdCBhbiBlZGdlIGNhc2U6XG4gKiBgUE9TVCAvcGlwZWxpbmVzYCByZXR1cm5zLCB0aGUgcGFnZSByZWxvYWRzLCBgR0VUIC9waXBlbGluZXNgIHJ1bnMuIFRoYXQgR0VUXG4gKiBpcyBhIGRpZmZlcmVudCByZXF1ZXN0IHdpdGggbm8gbWVtb3J5IG9mIHRoZSBQT1NULCBzbyB3aXRob3V0IHNvbWV0aGluZ1xuICogY2FycmllZCBiZXR3ZWVuIHRoZW0gaXQgcm91dGVzIHRvIGEgcmVwbGljYSB0aGF0IG1heSBub3QgaGF2ZSByZXBsYXllZCB0aGVcbiAqIGNvbW1pdCwgYW5kIHRoZSBwaXBlbGluZSB0aGUgdXNlciBqdXN0IGNyZWF0ZWQgaXMgc2ltcGx5IG1pc3NpbmcuIE5vIGVycm9yLFxuICogbm8gcmV0cnksIGFuZCBub3QgcmVwcm9kdWNpYmxlIG9uIGRlbWFuZC5cbiAqXG4gKiBgdGVuYW5jeS50c2AgYWxyZWFkeSBzb2x2ZXMgdGhlIFdJVEhJTi1hLXJlcXVlc3QgaGFsZjogYHdpdGhUZW5hbnRUeGAgc2V0c1xuICogYG1heUhhdmVXcml0dGVuYCBvbiB0aGUgcmVxdWVzdCdzIHRlbmFudCBjb250ZXh0LCBhbmQgdGhlIHJlYWQgaGVscGVyIGtlZXBzXG4gKiB0aGF0IHJlcXVlc3Qgb24gdGhlIHByaW1hcnkgYWZ0ZXJ3YXJkcy4gVGhpcyBtb2R1bGUgZXh0ZW5kcyB0aGUgc2FtZSBmbGFnXG4gKiBBQ1JPU1MgcmVxdWVzdHMgYnkgcmVtZW1iZXJpbmcsIGluIFJlZGlzLCB0aGF0IGFuIG9yZyB3cm90ZSByZWNlbnRseSDigJQgYW5kIGl0XG4gKiBzZXRzIHRoZSB2ZXJ5IHNhbWUgYG1heUhhdmVXcml0dGVuYCBmbGFnLCBzbyB0aGVyZSBpcyBvbmUgbWVjaGFuaXNtIGFuZCBvbmVcbiAqIGNvZGUgcGF0aCwgbm90IHR3by5cbiAqXG4gKiBXSFkgUkVESVMgQU5EIE5PVCBBTiBMU04uIFRoZSBhbHRlcm5hdGl2ZSBpcyBleGFjdDogY2FwdHVyZVxuICogYHBnX2N1cnJlbnRfd2FsX2xzbigpYCBhdCBjb21taXQsIGNhcnJ5IGl0IHdpdGggdGhlIGNsaWVudCwgYW5kIGhhdmUgdGhlIHJlYWRcbiAqIHBhdGggd2FpdCBmb3IgdGhlIHN0YW5kYnkgdG8gcmVwbGF5IGF0IGxlYXN0IHRoYXQgZmFyLiBJdCB3YXMgcmVqZWN0ZWQgZm9yXG4gKiByZWFzb25zIHRoYXQgYXJlIGFib3V0IHRoaXMgc3lzdGVtIHJhdGhlciB0aGFuIGFib3V0IGVsZWdhbmNlOlxuICpcbiAqICAgMS4gU2hhcmVkIHN0YXRlIGlzIG1hbmRhdG9yeSBhbnl3YXkg4oCUIHRoZSBhcHAgdGllciBpcyAyIHJlcGxpY2FzIHdpZGUgb25cbiAqICAgICAgZWtzLCBzbyBhbiBpbi1wcm9jZXNzIG1hcCBtaXNzZXMgZXZlcnkgcmVxdWVzdCB0aGF0IGxhbmRzIG9uIHRoZSBvdGhlclxuICogICAgICBwb2QuIExTTiB0cmFja2luZyBhdm9pZHMgc2hhcmVkIHN0YXRlIG9ubHkgYnkgY2FycnlpbmcgdGhlIHZhbHVlIG9uIHRoZVxuICogICAgICBDTElFTlQsIGFuZCB0aGlzIHByb2R1Y3QncyBvd24gcGl0Y2ggaXMgZml2ZSB3YXlzIGluIChkYXNoYm9hcmQsIENMSSxcbiAqICAgICAgUkVTVCwgQ0RLLCBBSSkuIEEgQ0xJIG9yIENESyBjYWxsZXIgd2lsbCBub3QgZWNobyBhbiBMU04gYmFjaywgc28gdGhhdFxuICogICAgICBhcHByb2FjaCBkZWdyYWRlcyB0byBcInByaW1hcnkgZm9yIGV2ZXJ5IG5vbi1icm93c2VyIGNsaWVudFwiIG9yIG5lZWRzXG4gKiAgICAgIHNlcnZlci1zaWRlIHN0b3JhZ2Ug4oCUIHdoaWNoIGlzIHRoaXMsIHdpdGggZXh0cmEgc3RlcHMuXG4gKiAgIDIuIEEgY2xpZW50LXN1cHBsaWVkIExTTiBpcyBhdHRhY2tlci1jb250cm9sbGVkIGlucHV0LCBhbmQgYW4gdW5ib3VuZGVkXG4gKiAgICAgIHdhaXQgb24gYSByZXBsaWNhIHRoYXQgbmV2ZXIgY2F0Y2hlcyB1cCB0dXJucyBhIGJvZ3VzIHZhbHVlIGludG8gYSBoYW5nLlxuICogICAgICBUaGF0IGlzIGEgZGVuaWFsIG9mIHNlcnZpY2Ugd2VhcmluZyBhIGNvcnJlY3RuZXNzIGNvc3R1bWUsIGFuZCBib3VuZGluZ1xuICogICAgICBpdCBjb3JyZWN0bHkgaXMgYSBzZWNvbmQgc2VjdXJpdHkgc3VyZmFjZSB0byBnZXQgcmlnaHQuXG4gKlxuICogVGhlIHBpbiBpcyBDT0FSU0UgYW5kIHRoYXQgaXMgdGhlIGFjY2VwdGVkIHRyYWRlOiBpdCBpcyBrZXllZCBwZXIgT1JHLCBub3RcbiAqIHBlciB1c2VyLCBiZWNhdXNlIGEgdXNlciBtYXkgcmVhZCB0aHJvdWdoIGEgZGlmZmVyZW50IHNlc3Npb24gdGhhbiB0aGUgb25lXG4gKiB0aGF0IHdyb3RlLiBTbyBvbmUgbWVtYmVyJ3Mgd3JpdGUgYnJpZWZseSBzZW5kcyB0aGUgd2hvbGUgb3JnJ3MgcmVhZHMgdG8gdGhlXG4gKiBwcmltYXJ5LiBUaGF0IGNhbiBvbmx5IHJlbW92ZSBhIGJlbmVmaXQsIG5ldmVyIGludHJvZHVjZSBhIHJlZ3Jlc3Npb24g4oCUXG4gKiByZWFkaW5nIGZyb20gdGhlIHByaW1hcnkgaXMgZXhhY3RseSB3aGF0IGhhcHBlbnMgdG9kYXkuXG4gKlxuICogRkFJTCBDTE9TRUQuIE5vIFJlZGlzIGNvbmZpZ3VyZWQsIGFuIHVucmVhY2hhYmxlIFJlZGlzLCBvciBhIGZhaWxlZCByZWFkIGFsbFxuICogcmVzb2x2ZSB0byBcImFzc3VtZSB0aGlzIG9yZyB3cm90ZVwiLCB3aGljaCByb3V0ZXMgcmVhZHMgdG8gdGhlIHByaW1hcnkuIFRoYXRcbiAqIGlzIHRoZSBzYW1lIGZhaWwtY2xvc2VkLXdpdGhvdXQtUmVkaXMgcG9zdHVyZSB0aGUgbGVhZGVyIGxvY2sgdGFrZXMsIGFuZCBpdFxuICogaXMgdGhlIG9ubHkgc2FmZSBkaXJlY3Rpb246IGd1ZXNzaW5nIFwibm8gcmVjZW50IHdyaXRlXCIgd2hlbiB0aGUgYW5zd2VyIGlzXG4gKiB1bmtub3duIGlzIGhvdyBhIHVzZXIgbG9zZXMgc2lnaHQgb2YgdGhlaXIgb3duIGRhdGEuXG4gKlxuICogQ09TVFMgTk9USElORyBVTlRJTCBSRUFELVNQTElUVElORyBJUyBPTi4gRXZlcnkgZW50cnkgcG9pbnQgc2hvcnQtY2lyY3VpdHNcbiAqIHdoZW4gbm8gcmVhZCByZXBsaWNhIGlzIGNvbmZpZ3VyZWQsIHNvIGEgZGVwbG95IHdpdGggYERCX1JFQURfSE9TVGAgdW5zZXQg4oCUXG4gKiB3aGljaCBpcyBob3cgYWxsIGZvdXIgdGFyZ2V0cyBzaGlwIOKAlCBuZXZlciB0b3VjaGVzIFJlZGlzIG9uIHRoZSByZXF1ZXN0IHBhdGguXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNDbGllbnQsIGNyZWF0ZUxvZ2dlciwgY3JlYXRlUmVkaXNSZWFkeUdhdGUsIGVtaXRDb3VudGVyLCBlbnZJbnQsIGlzUmVhZFJlcGxpY2FDb25maWd1cmVkIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuLy8gVFlQRS1PTkxZLCBhbmQgdGhhdCBpcyBkZWxpYmVyYXRlOiBhIHR5cGUgaW1wb3J0IGlzIGVyYXNlZCBhdCBjb21waWxlIHRpbWUsIHNvXG4vLyBpdCBuZXZlciB0b3VjaGVzIHBpcGVsaW5lLWRhdGEncyBgc3R1Yk1vZHVsZWAgYXQgcnVudGltZS4gQSBWQUxVRSBpbXBvcnQgaGVyZVxuLy8gdHVybmVkIGFsbCA5MSBzdWl0ZXMgdGhhdCBzdHViIHRoYXQgcGFja2FnZSBpbnRvIGEgNTAwLlxuaW1wb3J0IHR5cGUgeyBUZW5hbnRDb250ZXh0IH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignd3JpdGUtcGluJyk7XG5cbi8qKlxuICogSG93IGxvbmcgYSB3cml0ZSBrZWVwcyBpdHMgb3JnIG9uIHRoZSBwcmltYXJ5LlxuICpcbiAqIFNob3VsZCBzaXQgY29tZm9ydGFibHkgYWJvdmUgb2JzZXJ2ZWQgcDk5IHJlcGxpY2F0aW9uIGxhZy4gVGVuIHNlY29uZHMgaXNcbiAqIGRlbGliZXJhdGVseSBnZW5lcm91cyBmb3IgYSBkZWZhdWx0OiB0b28gc2hvcnQgc2lsZW50bHkgcmVpbnRyb2R1Y2VzIHRoZVxuICogbWlzc2luZy1yb3cgYnVnLCB3aGlsZSB0b28gbG9uZyBvbmx5IGNvc3RzIG9mZmxvYWQuIFRoZSBhc3ltbWV0cnkgc2F5cyB3aGljaFxuICogd2F5IHRvIGVyci5cbiAqL1xuY29uc3QgdHRsU2Vjb25kcyA9ICgpID0+IGVudkludCgnREJfUkVBRF9XUklURV9QSU5fVFRMX1NFQ09ORFMnLCAxMCk7XG5cbmNvbnN0IGtleSA9IChvcmdJZDogc3RyaW5nKSA9PiBgcnctcGluOiR7b3JnSWR9YDtcblxuLyoqXG4gKiBUaGUgdHdvIGlvcmVkaXMgY2FsbHMgdGhpcyBuZWVkcywgcGx1cyB0aGUgdGhyZWUgbWVtYmVyc1xuICogYGNyZWF0ZVJlZGlzUmVhZHlHYXRlYCByZWFkcy5cbiAqXG4gKiBEZWNsYXJlZCBzdHJ1Y3R1cmFsbHkgcmF0aGVyIHRoYW4gYnkgZXh0ZW5kaW5nIGFwaS1jb3JlJ3MgYFJlYWR5QXdhcmVSZWRpc2AsXG4gKiB3aGljaCBpcyBpbnRlcm5hbCB0byB0aGF0IHBhY2thZ2UgYW5kIG5vdCBwYXJ0IG9mIGl0cyBwdWJsaWMgc3VyZmFjZS4gVGhlXG4gKiByZWFkaW5lc3MgZ2F0ZSBpcyBub3Qgb3B0aW9uYWw6IHRoZSBlbnYgY2xpZW50IGhhcyBubyBvZmZsaW5lIHF1ZXVlLCBzbyBhXG4gKiBjb21tYW5kIGlzc3VlZCBiZWZvcmUgdGhlIGZpcnN0IGNvbm5lY3Rpb24gY29tcGxldGVzIGlzIHJlamVjdGVkIG91dHJpZ2h0IOKAlFxuICogd2hpY2ggd291bGQgbWFrZSB0aGUgRklSU1QgcmVhZCBvZiBldmVyeSBwb2QgZmFpbCBjbG9zZWQgdG8gdGhlIHByaW1hcnkuXG4gKi9cbmludGVyZmFjZSBQaW5SZWRpcyB7XG4gIGV4aXN0cyhrZXk6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtb2RlOiAnRVgnLCB0dGw6IG51bWJlcik6IFByb21pc2U8dW5rbm93bj47XG4gIHN0YXR1cz86IHN0cmluZztcbiAgb25jZT8oZXZlbnQ6IHN0cmluZywgY2I6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQpOiB1bmtub3duO1xuICBvZmY/KGV2ZW50OiBzdHJpbmcsIGNiOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkKTogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXcml0ZVBpblN0b3JlIHtcbiAgLyoqXG4gICAqIEhhcyB0aGlzIG9yZyB3cml0dGVuIHJlY2VudGx5PyBSZXR1cm5zIFRSVUUgd2hlbiB0aGUgYW5zd2VyIGlzIHVua25vd25cbiAgICogKG5vIFJlZGlzLCB1bnJlYWNoYWJsZSwgcmVhZCBmYWlsZWQpIOKAlCBzZWUgRkFJTCBDTE9TRUQgYWJvdmUuXG4gICAqL1xuICBpc1Bpbm5lZChvcmdJZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxib29sZWFuPjtcbiAgLyoqIFJlY29yZCB0aGF0IHRoaXMgb3JnIGp1c3Qgd3JvdGUuIE5ldmVyIHRocm93cy4gKi9cbiAgcGluKG9yZ0lkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogQSBzdG9yZSB0aGF0IHJlcG9ydHMgbm90aGluZyBwaW5uZWQg4oCUIGZvciB0ZXN0cyBhbmQgZm9yIHNpbmdsZS1wcm9jZXNzIHVzZS4gKi9cbmV4cG9ydCBjb25zdCBOT19XUklURV9QSU46IFdyaXRlUGluU3RvcmUgPSB7XG4gIGlzUGlubmVkOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpLFxuICBwaW46ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLFxufTtcblxubGV0IHN0b3JlOiBXcml0ZVBpblN0b3JlIHwgdW5kZWZpbmVkO1xuXG4vKiogUmVwbGFjZSB0aGUgc3RvcmUuIEZvciB0ZXN0cywgYW5kIGZvciBhIHNlcnZpY2UgdGhhdCBvd25zIGl0cyBvd24gY2xpZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdyaXRlUGluU3RvcmUobmV4dDogV3JpdGVQaW5TdG9yZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBzdG9yZSA9IG5leHQ7XG59XG5cbi8qKlxuICogVGhlIHByb2Nlc3Mtd2lkZSBzdG9yZSwgYnVpbHQgb24gZmlyc3QgdXNlIGZyb20gYFJFRElTX1VSTGAgL1xuICogYFJFRElTX1NFTlRJTkVMU2AgZXhhY3RseSBsaWtlIHRoZSBvdGhlciBlbnYtUmVkaXMgY29uc3VtZXJzIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXcml0ZVBpblN0b3JlKCk6IFdyaXRlUGluU3RvcmUge1xuICBpZiAoIXN0b3JlKSBzdG9yZSA9IGNyZWF0ZUVudlJlZGlzV3JpdGVQaW5TdG9yZSgpO1xuICByZXR1cm4gc3RvcmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZSZWRpc1dyaXRlUGluU3RvcmUoKTogV3JpdGVQaW5TdG9yZSB7XG4gIC8vIHVuZGVmaW5lZCA9IG5vdCB5ZXQgYXR0ZW1wdGVkOyBudWxsID0gYXR0ZW1wdGVkIGFuZCB1bmF2YWlsYWJsZS5cbiAgbGV0IGNhY2hlZDogUGluUmVkaXMgfCBudWxsIHwgdW5kZWZpbmVkO1xuICBsZXQgcmVhZHk6ICgoKSA9PiBQcm9taXNlPHZvaWQ+KSB8IHVuZGVmaW5lZDtcbiAgbGV0IHdhcm5lZCA9IGZhbHNlO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGNsaWVudCgpOiBQcm9taXNlPFBpblJlZGlzIHwgbnVsbD4ge1xuICAgIGlmIChjYWNoZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY2FjaGVkID0gY3JlYXRlRW52UmVkaXNDbGllbnQ8UGluUmVkaXM+KCd3cml0ZS1waW4nKTtcbiAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1JlZGlzIHdyaXRlLXBpbiBzdG9yZSBpbml0aWFsaXplZCcsIHsgdHRsU2Vjb25kczogdHRsU2Vjb25kcygpIH0pO1xuICAgICAgICByZWFkeSA9IGNyZWF0ZVJlZGlzUmVhZHlHYXRlKGNhY2hlZCk7XG4gICAgICB9IGVsc2UgaWYgKCF3YXJuZWQpIHtcbiAgICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICAgICAgLy8gT25seSB3b3J0aCBzYXlpbmcgd2hlbiBhIHJlcGxpY2EgYWN0dWFsbHkgZXhpc3RzOiB3aXRob3V0IG9uZSBldmVyeVxuICAgICAgICAvLyByZWFkIGdvZXMgdG8gdGhlIHByaW1hcnkgcmVnYXJkbGVzcyBhbmQgdGhlIHBpbiBpcyBpcnJlbGV2YW50LlxuICAgICAgICBsb2dnZXIud2FybignTm8gUmVkaXMgY29uZmlndXJlZCBmb3IgdGhlIHJlYWQtYWZ0ZXItd3JpdGUgcGluOyBldmVyeSByZWFkIHdpbGwgdXNlIHRoZSBwcmltYXJ5Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWFkeSkgYXdhaXQgcmVhZHkoKTtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBpc1Bpbm5lZChvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBpZiAoIW9yZ0lkKSByZXR1cm4gdHJ1ZTsgLy8gbm8gb3JnIHRvIGtleSBvbiAtPiBhc3N1bWUgd3JpdHRlblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVkaXMgPSBhd2FpdCBjbGllbnQoKTtcbiAgICAgICAgaWYgKCFyZWRpcykgcmV0dXJuIHRydWU7IC8vIGZhaWwgY2xvc2VkXG4gICAgICAgIHJldHVybiAoYXdhaXQgcmVkaXMuZXhpc3RzKGtleShvcmdJZCkpKSA9PT0gMTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBDb3VudGVkIHVuZGVyIHRoZSBzYW1lIG1ldHJpYyB3aXRoIGEgZGlmZmVyZW50IGBvcGA6IHRoaXMgaGFsZiBpc1xuICAgICAgICAvLyBTQUZFIChpdCBmYWlscyBjbG9zZWQgdG8gdGhlIHByaW1hcnkpIGJ1dCBpdCBydW5zIG9uIGV2ZXJ5IHJlcXVlc3QsIHNvXG4gICAgICAgIC8vIGl0IGlzIHRoZSBoYWxmIHRoYXQgYWN0dWFsbHkgcmVwb3J0cyBSZWRpcyBoZWFsdGgg4oCUIGFuZCBhIGRlcGxveW1lbnRcbiAgICAgICAgLy8gc2lsZW50bHkgc2VydmluZyBldmVyeSByZWFkIGZyb20gdGhlIHByaW1hcnkgaGFzIGxvc3QgdGhlIHdob2xlXG4gICAgICAgIC8vIGJlbmVmaXQgb2YgdGhlIHJlcGxpY2EgaXQgaXMgcGF5aW5nIGZvci5cbiAgICAgICAgZW1pdENvdW50ZXIoJ3Bvc3RncmVzX3dyaXRlX3Bpbl9lcnJvcnNfdG90YWwnLCB7IG9wOiAnbG9va3VwJyB9KTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1dyaXRlLXBpbiBsb29rdXAgZmFpbGVkOyByb3V0aW5nIHJlYWRzIHRvIHRoZSBwcmltYXJ5Jywge1xuICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZmFpbCBjbG9zZWRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcGluKG9yZ0lkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIC8vIE5vdGhpbmcgdG8ga2V5IG9uLCBzbyBub3RoaW5nIHRvIHBpbi4gVGhlIHJlYWQgc2lkZSBmYWlscyBjbG9zZWQgZm9yXG4gICAgICAvLyB0aGUgc2FtZSBzY29wZSBhbnl3YXkuXG4gICAgICBpZiAoIW9yZ0lkKSByZXR1cm47XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWRpcyA9IGF3YWl0IGNsaWVudCgpO1xuICAgICAgICBpZiAoIXJlZGlzKSByZXR1cm47XG4gICAgICAgIGF3YWl0IHJlZGlzLnNldChrZXkob3JnSWQpLCAnMScsICdFWCcsIHR0bFNlY29uZHMoKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQSBmYWlsZWQgcGluIGlzIHRoZSBkYW5nZXJvdXMgZGlyZWN0aW9uIOKAlCB0aGUgTkVYVCByZXF1ZXN0IG1heSByZWFkIGFcbiAgICAgICAgLy8gc3RhbGUgcmVwbGljYSBhbmQgdGhlIHVzZXIgbG9zZXMgc2lnaHQgb2YgdGhlaXIgb3duIHdyaXRlIOKAlCBidXQgdGhlcmVcbiAgICAgICAgLy8gaXMgbm90aGluZyB1c2VmdWwgdG8gZG8gYWJvdXQgaXQgaGVyZSwgYW5kIHRocm93aW5nIHdvdWxkIGZhaWwgYVxuICAgICAgICAvLyByZXF1ZXN0IHdob3NlIHdyaXRlIGFscmVhZHkgQ09NTUlUVEVELlxuICAgICAgICAvL1xuICAgICAgICAvLyBDb3VudGVkIHRocm91Z2ggYXBpLWNvcmUncyBgZW1pdENvdW50ZXJgIFNFQU0gcmF0aGVyIHRoYW4gYXBpLXNlcnZlcidzXG4gICAgICAgIC8vIG93biBgaW5jQ291bnRlcmAsIGFsdGhvdWdoIHRoaXMgZmlsZSBsaXZlcyBpbiBhcGktc2VydmVyLiBJbXBvcnRpbmdcbiAgICAgICAgLy8gYC4vbWV0cmljcy5qc2AgaGVyZSBwdXRzIGl0IGluIHRoZSBtb2R1bGUgZ3JhcGggb2YgZXZlcnkgc2VydmljZSdzXG4gICAgICAgIC8vIHJlcXVlc3QgcGF0aCwgYW5kIGl0IHJlYWRzIGBDb25maWcuZ2V0QW55KCdvYnNlcnZhYmlsaXR5JylgIGF0IG1vZHVsZVxuICAgICAgICAvLyBsb2FkIOKAlCB3aGljaCBicm9rZSBhcGkvbWVzc2FnZSdzIGluZGV4LXdpcmluZyBzdWl0ZSB3aXRoXG4gICAgICAgIC8vIGBDb25maWcuZ2V0QW55IGlzIG5vdCBhIGZ1bmN0aW9uYCB0aGUgbW9tZW50IHRoaXMgaW1wb3J0IHdhcyBhZGRlZC5cbiAgICAgICAgLy8gVGhlIHNlYW0gaXMgYSBuby1vcCB1bnRpbCBhcGktc2VydmVyJ3MgYXBwIGZhY3RvcnkgY2FsbHNcbiAgICAgICAgLy8gYHNldENvdW50ZXJFbWl0dGVyKGluY0NvdW50ZXIpYCBhdCBzdGFydHVwLCBzbyBwcm9kdWN0aW9uIGNvdW50cyBhbmRcbiAgICAgICAgLy8gbm90aGluZyBlbHNlIGhhcyB0byBsb2FkIHRoZSByZWdpc3RyeSB0byBkbyBpdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU28gaXQgaXMgY291bnRlZCBhcyB3ZWxsIGFzIGxvZ2dlZCwgYW5kIHRoZSBjb3VudGVyIGlzIHRoZSBwb2ludDogdGhlXG4gICAgICAgIC8vIHN5bXB0b20gaXMgYSByb3cgdGhhdCBpcyBicmllZmx5IG1pc3NpbmcsIHdoaWNoIG5vIGVycm9yIHJhdGUgYW5kIG5vXG4gICAgICAgIC8vIGxvZyBzZWFyY2ggd2lsbCBhdHRyaWJ1dGUgYmFjayB0byBoZXJlLiBgUG9zdGdyZXNXcml0ZVBpbkVycm9yc2AgaW5cbiAgICAgICAgLy8gdGhlIGRlcGxveSBhbGVydCBydWxlcyB3YXRjaGVzIGl0LiBUaGUgc2VyaWVzIGlzIGFic2VudCBvbiBldmVyeVxuICAgICAgICAvLyBkZXBsb3kgdGhhdCBoYXMgbm90IGVuYWJsZWQgcmVhZC1zcGxpdHRpbmcsIHdoaWNoIGlzIGNvcnJlY3Qg4oCUIHdpdGggbm9cbiAgICAgICAgLy8gcmVwbGljYSB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIHN0YWxlLlxuICAgICAgICBlbWl0Q291bnRlcigncG9zdGdyZXNfd3JpdGVfcGluX2Vycm9yc190b3RhbCcsIHsgb3A6ICdzZXQnIH0pO1xuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHNldCB0aGUgcmVhZC1hZnRlci13cml0ZSBwaW47IGEgc3Vic2VxdWVudCByZWFkIG1heSBoaXQgYSBzdGFsZSByZXBsaWNhJywge1xuICAgICAgICAgIG9yZ0lkLFxuICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogSXMgdGhlIHBpbiBpbiBwbGF5IGF0IGFsbD9cbiAqXG4gKiBGYWxzZSB3aGVuZXZlciBubyByZWFkIHJlcGxpY2EgaXMgY29uZmlndXJlZCDigJQgd2hpY2ggaXMgaG93IGFsbCBmb3VyIHRhcmdldHNcbiAqIHNoaXAuIFRoZSBtaWRkbGV3YXJlIHVzZXMgdGhpcyBhcyBhIGhhcmQgZ2F0ZSBzbyB0aGF0IHdpdGggbm8gcmVwbGljYSBpdCBkb2VzXG4gKiBub3QgcmVnaXN0ZXIgYSByZXNwb25zZSBsaXN0ZW5lciwgZG9lcyBub3QgdG91Y2ggUmVkaXMsIGFuZCBjYWxscyBgbmV4dCgpYFxuICogU1lOQ0hST05PVVNMWSwgZXhhY3RseSBhcyBpdCBkaWQgYmVmb3JlIGFueSBvZiB0aGlzIGV4aXN0ZWQuIE1ha2luZyB0aGVcbiAqIHJlcXVlc3QgcGF0aCBhc3luY2hyb25vdXMgZm9yIGEgZmVhdHVyZSBub2JvZHkgaGFzIGVuYWJsZWQgd291bGQgYmUgYVxuICogYmVoYXZpb3VyIGNoYW5nZSBwYWlkIGJ5IGV2ZXJ5IHJvdXRlIG9uIGV2ZXJ5IHRhcmdldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUGluQWN0aXZlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNSZWFkUmVwbGljYUNvbmZpZ3VyZWQoKTtcbn1cblxuLyoqXG4gKiBCZWZvcmUgdGhlIHJlcXVlc3QgcnVuczogaWYgdGhpcyBvcmcgd3JvdGUgcmVjZW50bHksIHByZS1zZXQgdGhlIHNhbWVcbiAqIGBtYXlIYXZlV3JpdHRlbmAgZmxhZyBgd2l0aFRlbmFudFR4YCB3b3VsZCBoYXZlIHNldCwgc28gdGhlIHJlYWQgaGVscGVyIGtlZXBzXG4gKiB0aGUgcmVxdWVzdCBvbiB0aGUgcHJpbWFyeS5cbiAqXG4gKiBOby1vcHMgZW50aXJlbHkgd2hlbiBubyByZXBsaWNhIGlzIGNvbmZpZ3VyZWQg4oCUIHdoaWNoIGtlZXBzIFJlZGlzIG9mZiB0aGVcbiAqIHJlcXVlc3QgcGF0aCBmb3IgZXZlcnkgZGVwbG95IHRoYXQgaGFzIG5vdCBlbmFibGVkIHJlYWQtc3BsaXR0aW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlXcml0ZVBpbihzY29wZTogVGVuYW50Q29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzUmVhZFJlcGxpY2FDb25maWd1cmVkKCkpIHJldHVybjtcbiAgaWYgKHNjb3BlLm1heUhhdmVXcml0dGVuKSByZXR1cm47IC8vIGFscmVhZHkga25vd24gdG8gaGF2ZSB3cml0dGVuXG4gIGlmIChhd2FpdCBnZXRXcml0ZVBpblN0b3JlKCkuaXNQaW5uZWQoc2NvcGUub3JnSWQpKSBzY29wZS5tYXlIYXZlV3JpdHRlbiA9IHRydWU7XG59XG5cbi8qKlxuICogQWZ0ZXIgdGhlIHJlc3BvbnNlOiBpZiBhbnl0aGluZyBpbiB0aGlzIHJlcXVlc3Qgb3BlbmVkIGEgcHJpbWFyeSB0cmFuc2FjdGlvbixcbiAqIHBpbiB0aGUgb3JnIHNvIGl0cyBuZXh0IHJlcXVlc3QgcmVhZHMgZnJvbSB0aGUgcHJpbWFyeSB0b28uXG4gKlxuICogUmVhZHMgYG1heUhhdmVXcml0dGVuYCByYXRoZXIgdGhhbiB0aGUgSFRUUCBtZXRob2Qgb24gcHVycG9zZS4gQSBQT1NUIHRoYXRcbiAqIG9ubHkgdmFsaWRhdGVzIGhhcyBub3RoaW5nIHRvIHBpbiBmb3IsIGFuZCDigJQgbW9yZSBpbXBvcnRhbnRseSDigJQgYSBHRVQgdGhhdFxuICogd3JpdGVzIChhIGxhenkgYmFja2ZpbGwsIGEgbGFzdC1zZWVuIHN0YW1wKSBhYnNvbHV0ZWx5IGRvZXMuIFRoZSBmbGFnIGZvbGxvd3NcbiAqIHdoYXQgYWN0dWFsbHkgdG91Y2hlZCB0aGUgcHJpbWFyeSwgd2hpY2ggdGhlIG1ldGhvZCBjYW5ub3QgdGVsbCB5b3UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRXcml0ZUZvclBpbihzY29wZTogVGVuYW50Q29udGV4dCk6IHZvaWQge1xuICBpZiAoIWlzUmVhZFJlcGxpY2FDb25maWd1cmVkKCkpIHJldHVybjtcbiAgaWYgKCFzY29wZS5tYXlIYXZlV3JpdHRlbikgcmV0dXJuO1xuICB2b2lkIGdldFdyaXRlUGluU3RvcmUoKS5waW4oc2NvcGUub3JnSWQpO1xufVxuIl19
@@ -2,9 +2,11 @@
2
2
  "package": "@pipeline-builder/api-server",
3
3
  "entries": {
4
4
  ".": {
5
+ "apiCallsQuota": "function",
5
6
  "applyWritePin": "function",
6
7
  "attachRequestContext": "function",
7
8
  "checkQuota": "function",
9
+ "clearQuotaCheckCache": "function",
8
10
  "combineHealthChecks": "function",
9
11
  "connectMongo": "function",
10
12
  "createApp": "function",
@@ -14,29 +16,40 @@
14
16
  "createProtectedRoute": "function",
15
17
  "createSharedRateLimitStore": "function",
16
18
  "currentTraceId": "function",
19
+ "deferredCheckQuota": "function",
17
20
  "getContext": "function",
18
21
  "getIdempotencyStore": "function",
19
22
  "getWritePinStore": "function",
23
+ "IDEMPOTENT_REPLAY_LOCAL": "value",
20
24
  "incCounter": "function",
25
+ "isIdempotentReplay": "function",
21
26
  "isReady": "function",
22
27
  "meterQuotaOnSuccess": "function",
23
28
  "mongoHealthCheck": "function",
24
29
  "NO_WRITE_PIN": "value",
25
30
  "observe": "function",
26
31
  "postgresHealthCheck": "function",
32
+ "QUOTA_CHECK_CACHE_TTL_MS": "value",
33
+ "QUOTA_CHECK_DENIED_CACHE_MS": "value",
27
34
  "rateLimitByOrg": "function",
28
35
  "readinessGuard": "function",
29
36
  "recordWriteForPin": "function",
30
37
  "redisHealthCheck": "function",
31
38
  "registerSecretRotationGauge": "function",
32
39
  "registerSseTicketChannel": "function",
40
+ "requestPath": "function",
33
41
  "requireOrgId": "function",
42
+ "reserveAiCallSlot": "function",
43
+ "reserveQuotaSlot": "function",
44
+ "resetGauge": "function",
34
45
  "runServer": "function",
46
+ "runWithSlot": "function",
35
47
  "setGauge": "function",
36
48
  "setReady": "function",
37
49
  "setWritePinStore": "function",
38
50
  "SSEManager": "class",
39
51
  "startServer": "function",
52
+ "withAiCallReservation": "function",
40
53
  "withQuotaReservation": "function",
41
54
  "withRoute": "function",
42
55
  "withSpan": "function",
package/package.json CHANGED
@@ -35,9 +35,9 @@
35
35
  "@opentelemetry/instrumentation": "0.300.0",
36
36
  "@opentelemetry/resources": "3.0.0",
37
37
  "@opentelemetry/sdk-node": "0.300.0",
38
- "@pipeline-builder/api-core": "5.2.2",
39
- "@pipeline-builder/pipeline-core": "4.4.2",
40
- "@pipeline-builder/pipeline-data": "4.3.2",
38
+ "@pipeline-builder/api-core": "5.2.4",
39
+ "@pipeline-builder/pipeline-core": "4.4.4",
40
+ "@pipeline-builder/pipeline-data": "4.3.4",
41
41
  "compression": "1.8.2",
42
42
  "cors": "2.8.6",
43
43
  "express": "5.3.0",
@@ -109,9 +109,10 @@
109
109
  "homepage": "https://mwashburn160.github.io/pipeline-builder/",
110
110
  "publishConfig": {
111
111
  "access": "public",
112
- "registry": "https://registry.npmjs.org/"
112
+ "registry": "https://registry.npmjs.org/",
113
+ "provenance": true
113
114
  },
114
- "version": "4.4.2",
115
+ "version": "4.4.4",
115
116
  "bugs": {
116
117
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
117
118
  },