@nauth-toolkit/client-angular 0.1.111 → 0.1.114

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.
@@ -188,7 +188,7 @@ export function createNAuthAuthHttpInterceptor(params) {
188
188
  // JSON mode: we need the new access token to retry + unblock queued requests.
189
189
  const newToken = tokenDelivery === 'json' ? response.accessToken : 'success';
190
190
  if (tokenDelivery === 'json' && (!newToken || newToken === 'success')) {
191
- // ⚠️ WARNING: Without an access token we cannot safely retry requests in JSON mode.
191
+ // WARNING: Without an access token we cannot safely retry requests in JSON mode.
192
192
  throw new Error('Token refresh did not return an access token');
193
193
  }
194
194
  refreshTokenSubject.next(newToken ?? 'success');
@@ -247,4 +247,4 @@ export function createNAuthAuthHttpInterceptor(params) {
247
247
  }));
248
248
  }))));
249
249
  }
250
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1pbnRlcmNlcHRvci5zaGFyZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F1dGgtaW50ZXJjZXB0b3Iuc2hhcmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxpQkFBaUIsRUFBeUMsTUFBTSxzQkFBc0IsQ0FBQztBQUU1RyxPQUFPLEVBQ0wsZUFBZSxFQUVmLFVBQVUsRUFDVixRQUFRLEVBQ1IsSUFBSSxFQUNKLEdBQUcsRUFDSCxFQUFFLEVBQ0YsV0FBVyxFQUNYLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7QUFJZDs7Ozs7Ozs7R0FRRztBQUVILCtFQUErRTtBQUMvRSwwQ0FBMEM7QUFDMUMsK0VBQStFO0FBQy9FLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztBQUN6QixNQUFNLG1CQUFtQixHQUFHLElBQUksZUFBZSxDQUFnQixJQUFJLENBQUMsQ0FBQztBQUNyRSxJQUFJLGdCQUFnQixHQUE4QixJQUFJLENBQUM7QUFDdkQsTUFBTSxlQUFlLEdBQUcsSUFBSSxPQUFPLEVBQXdCLENBQUM7QUFFNUQsK0VBQStFO0FBQy9FLHlCQUF5QjtBQUN6QiwrRUFBK0U7QUFFL0U7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLEtBQWM7SUFDbkMsSUFBSSxLQUFLLFlBQVksaUJBQWlCO1FBQUUsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksWUFBWSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pFLE1BQU0sVUFBVSxHQUFJLEtBQWtDLENBQUMsVUFBVSxDQUFDO1FBQ2xFLE9BQU8sT0FBTyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM1RCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxD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SyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FDekIsU0FBUyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FDeEIsVUFBVSxDQUFDLENBQUMsS0FBYyxFQUFFLEVBQUU7UUFDNUIsTUFBTSxZQUFZLEdBQ2hCLEtBQUssWUFBWSxpQkFBaUIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxlQUFlLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTdHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV6QixPQUFPLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUM5QixTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNsQixNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkYsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FDRixDQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBFdmVudCwgSHR0cEhhbmRsZXJGbiwgSHR0cFJlcXVlc3QgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBjYXRjaEVycm9yLFxuICBmaW5hbGl6ZSxcbiAgZnJvbSxcbiAgbWFwLFxuICBvZixcbiAgc2hhcmVSZXBsYXksXG4gIHN3aXRjaE1hcCxcbiAgdGhyb3dFcnJvcixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgdHlwZSB7IE5BdXRoQ2xpZW50Q29uZmlnIH0gZnJvbSAnQG5hdXRoLXRvb2xraXQvY2xpZW50JztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vbmdtb2R1bGUvYXV0aC5zZXJ2aWNlJztcblxuLyoqXG4gKiBTaGFyZWQgaW50ZXJjZXB0b3IgbG9naWMgZm9yIGJvdGg6XG4gKiAtIEZ1bmN0aW9uYWwgaW50ZXJjZXB0b3IgKEFuZ3VsYXIgMTcrIHN0YW5kYWxvbmUpXG4gKiAtIENsYXNzLWJhc2VkIGludGVyY2VwdG9yIChOZ01vZHVsZSBhcHBzKVxuICpcbiAqIFdIWTpcbiAqIC0gS2VlcCBvbmUgaW1wbGVtZW50YXRpb24gZm9yIGNvb2tpZXMgKyBqc29uIG1vZGUgYmVoYXZpb3IuXG4gKiAtIEF2b2lkIGRpdmVyZ2VuY2UgYmV0d2VlbiBzdGFuZGFsb25lIGFuZCBOZ01vZHVsZSBpbnRlZ3JhdGlvbnMuXG4gKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVmcmVzaCBzdGF0ZSBtYW5hZ2VtZW50IChtb2R1bGUtbGV2ZWwpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5sZXQgaXNSZWZyZXNoaW5nID0gZmFsc2U7XG5jb25zdCByZWZyZXNoVG9rZW5TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcbmxldCByZWZyZXNoSW5GbGlnaHQkOiBPYnNlcnZhYmxlPHN0cmluZz4gfCBudWxsID0gbnVsbDtcbmNvbnN0IHJldHJpZWRSZXF1ZXN0cyA9IG5ldyBXZWFrU2V0PEh0dHBSZXF1ZXN0PHVua25vd24+PigpO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFcnJvciArIGNvb2tpZSBoZWxwZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU2FmZWx5IGV4dHJhY3QgSFRUUCBzdGF0dXMgY29kZSBmcm9tIGVpdGhlcjpcbiAqIC0gQW5ndWxhciBIdHRwRXJyb3JSZXNwb25zZSAoSHR0cENsaWVudCBjYWxscylcbiAqIC0gU0RLIE5BdXRoQ2xpZW50RXJyb3IgKHRocm93biBieSB0aGUgU0RLJ3MgSHR0cEFkYXB0ZXIpXG4gKi9cbmZ1bmN0aW9uIGdldFN0YXR1c0NvZGUoZXJyb3I6IHVua25vd24pOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHJldHVybiBlcnJvci5zdGF0dXM7XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXNDb2RlJyBpbiBlcnJvcikge1xuICAgIGNvbnN0IHN0YXR1c0NvZGUgPSAoZXJyb3IgYXMgeyBzdGF0dXNDb2RlPzogdW5rbm93biB9KS5zdGF0dXNDb2RlO1xuICAgIHJldHVybiB0eXBlb2Ygc3RhdHVzQ29kZSA9PT0gJ251bWJlcicgPyBzdGF0dXNDb2RlIDogbnVsbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBDU1JGIGNvb2tpZSBjbGVhcmluZyAobm9uLWh0dHBPbmx5KS5cbiAqXG4gKiBXQVJOSU5HOiBUaGlzIGNhbm5vdCBjbGVhciBodHRwT25seSBhdXRoIGNvb2tpZXMgKGFjY2Vzcy9yZWZyZXNoL2RldmljZSkuXG4gKiBUaG9zZSBtdXN0IGJlIGNsZWFyZWQgYnkgdGhlIGJhY2tlbmQgb24gcmVmcmVzaC9sb2dvdXQuXG4gKi9cbmZ1bmN0aW9uIGNsZWFyQ3NyZkNvb2tpZShiYXNlVXJsOiBzdHJpbmcsIGNvb2tpZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuXG4gIC8vIFdIWTogQ29va2llIGRvbWFpbiBoYW5kbGluZyBkaWZmZXJzIGJldHdlZW4gbG9jYWxob3N0IGFuZCByZWFsIGRvbWFpbnMuXG4gIC8vIFdlIHRyeSB0byBjbGVhciB3aXRoIGFuIGV4cGxpY2l0IGRvbWFpbiAoaWYgYXZhaWxhYmxlKSwgdGhlbiB3aXRob3V0LlxuICB0cnkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYmFzZVVybCk7XG4gICAgZG9jdW1lbnQuY29va2llID0gYCR7Y29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS87IGRvbWFpbj0ke3VybC5ob3N0bmFtZX1gO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2Nvb2tpZU5hbWV9PTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQzsgcGF0aD0vYDtcbiAgfSBjYXRjaCB7XG4gICAgZG9jdW1lbnQuY29va2llID0gYCR7Y29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS9gO1xuICB9XG59XG5cbi8qKlxuICogR2V0IENTUkYgdG9rZW4gZnJvbSBjb29raWUuXG4gKlxuICogQHBhcmFtIGNvb2tpZU5hbWUgLSBOYW1lIG9mIHRoZSBDU1JGIGNvb2tpZSAoZnJvbSBjb25maWcuY3NyZi5jb29raWVOYW1lKVxuICogQHJldHVybnMgQ1NSRiB0b2tlbiB2YWx1ZSBvciBudWxsIGlmIG5vdCBmb3VuZFxuICovXG5mdW5jdGlvbiBnZXRDc3JmVG9rZW4oY29va2llTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gbnVsbDtcbiAgLy8gRXNjYXBlIHNwZWNpYWwgcmVnZXggY2hhcmFjdGVycyBpbiBjb29raWUgbmFtZSB0byBwcmV2ZW50IGluamVjdGlvblxuICBjb25zdCBlc2NhcGVkQ29va2llTmFtZSA9IGNvb2tpZU5hbWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcbiAgY29uc3QgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cChgKF58ICkke2VzY2FwZWRDb29raWVOYW1lfT0oW147XSspYCkpO1xuICByZXR1cm4gbWF0Y2ggPyBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbMl0pIDogbnVsbDtcbn1cblxuLyoqXG4gKiBCdWlsZCByZXRyeSByZXF1ZXN0IHdpdGggYXBwcm9wcmlhdGUgYXV0aC5cbiAqXG4gKiBJbiBjb29raWVzIG1vZGU6IEJyb3dzZXIgYXV0b21hdGljYWxseSBzZW5kcyB1cGRhdGVkIGh0dHBPbmx5IGNvb2tpZXMgKGFjY2Vzcy9yZWZyZXNoIHRva2VucykuXG4gKiBXZSBtdXN0IHJlLXJlYWQgQ1NSRiB0b2tlbiBhZnRlciByZWZyZXNoIHRvIGF2b2lkIHN0YWxlIGhlYWRlcnMuXG4gKlxuICogSW4gSlNPTiBtb2RlOiBDbG9uZXMgdGhlIHJlcXVlc3QgYW5kIGFkZHMgdGhlIG5ldyBCZWFyZXIgdG9rZW4uXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUmV0cnlSZXF1ZXN0KFxuICBvcmlnaW5hbFJlcTogSHR0cFJlcXVlc3Q8dW5rbm93bj4sXG4gIHRva2VuRGVsaXZlcnk6IHN0cmluZyxcbiAgbmV3VG9rZW4/OiBzdHJpbmcgfCBudWxsLFxuICBjc3JmQ29uZmlnPzogeyBjb29raWVOYW1lPzogc3RyaW5nOyBoZWFkZXJOYW1lPzogc3RyaW5nIH0sXG4pOiBIdHRwUmVxdWVzdDx1bmtub3duPiB7XG4gIGlmICh0b2tlbkRlbGl2ZXJ5ID09PSAnanNvbicgJiYgbmV3VG9rZW4gJiYgbmV3VG9rZW4gIT09ICdzdWNjZXNzJykge1xuICAgIHJldHVybiBvcmlnaW5hbFJlcS5jbG9uZSh7IHNldEhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke25ld1Rva2VufWAgfSB9KTtcbiAgfVxuXG4gIGlmICh0b2tlbkRlbGl2ZXJ5ID09PSAnY29va2llcycgJiYgWydQT1NUJywgJ1BVVCcsICdQQVRDSCcsICdERUxFVEUnXS5pbmNsdWRlcyhvcmlnaW5hbFJlcS5tZXRob2QpKSB7XG4gICAgY29uc3QgY3NyZkNvb2tpZU5hbWUgPSBjc3JmQ29uZmlnPy5jb29raWVOYW1lID8/ICduYXV0aF9jc3JmX3Rva2VuJztcbiAgICBjb25zdCBjc3JmSGVhZGVyTmFtZSA9IGNzcmZDb25maWc/LmhlYWRlck5hbWUgPz8gJ3gtY3NyZi10b2tlbic7XG4gICAgLy8gQWx3YXlzIHJlZnJlc2ggQ1NSRiB0b2tlbiBvbiByZXRyeSAoZXZlbiBpZiBpdCBleGlzdHMsIGdldCBmcmVzaCBvbmUpXG4gICAgY29uc3QgZnJlc2hDc3JmVG9rZW4gPSBnZXRDc3JmVG9rZW4oY3NyZkNvb2tpZU5hbWUpO1xuICAgIGlmIChmcmVzaENzcmZUb2tlbikge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsUmVxLmNsb25lKHsgc2V0SGVhZGVyczogeyBbY3NyZkhlYWRlck5hbWVdOiBmcmVzaENzcmZUb2tlbiB9IH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvcmlnaW5hbFJlcTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5BdXRoQXV0aEh0dHBJbnRlcmNlcHRvcihwYXJhbXM6IHtcbiAgY29uZmlnOiBOQXV0aENsaWVudENvbmZpZztcbiAgaHR0cDogSHR0cENsaWVudDtcbiAgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlO1xuICByb3V0ZXI6IFJvdXRlcjtcbiAgbmV4dDogSHR0cEhhbmRsZXJGbjtcbiAgcmVxOiBIdHRwUmVxdWVzdDx1bmtub3duPjtcbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xuICBjb25zdCB7IGNvbmZpZywgYXV0aFNlcnZpY2UsIHJvdXRlciwgbmV4dCwgcmVxIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgdG9rZW5EZWxpdmVyeSA9IGNvbmZpZy50b2tlbkRlbGl2ZXJ5O1xuICBjb25zdCBiYXNlVXJsID0gY29uZmlnLmJhc2VVcmw7XG4gIGNvbnN0IGVuZHBvaW50cyA9IGNvbmZpZy5lbmRwb2ludHMgPz8ge307XG4gIGNvbnN0IGF1dGhQYXRoUHJlZml4ID0gY29uZmlnLmF1dGhQYXRoUHJlZml4O1xuXG4gIC8vIEJ1aWxkIHJlZnJlc2ggcGF0aCB3aXRoIGF1dGhQYXRoUHJlZml4IGlmIGNvbmZpZ3VyZWQgKG1hdGNoZXMgY29yZSBjbGllbnQgYnVpbGRVcmwgbG9naWMgZXhhY3RseSlcbiAgLy8gVXNlIGRlZmF1bHQgJy9yZWZyZXNoJyBpZiBlbmRwb2ludHMucmVmcmVzaCBpcyBub3QgZGVmaW5lZFxuICBjb25zdCByZWZyZXNoUGF0aCA9IGVuZHBvaW50cz8ucmVmcmVzaCA/PyAnL3JlZnJlc2gnO1xuICBjb25zdCBub3JtYWxpemVkUmVmcmVzaFBhdGggPSByZWZyZXNoUGF0aC5zdGFydHNXaXRoKCcvJykgPyByZWZyZXNoUGF0aCA6IGAvJHtyZWZyZXNoUGF0aH1gO1xuXG4gIC8vIENoZWNrIGlmIGJhc2VVcmwgYWxyZWFkeSBlbmRzIHdpdGggYXV0aFBhdGhQcmVmaXggdG8gYXZvaWQgZG91YmxlLXByZWZpeGluZ1xuICAvLyBUaGlzIG11c3QgbWF0Y2ggdGhlIGNvcmUgY2xpZW50J3MgYnVpbGRVcmwgbG9naWMgZXhhY3RseVxuICBjb25zdCBiYXNlVXJsRW5kc1dpdGhQcmVmaXggPSBhdXRoUGF0aFByZWZpeCAmJiBiYXNlVXJsLmVuZHNXaXRoKGF1dGhQYXRoUHJlZml4KTtcblxuICBjb25zdCBzaG91bGRBZGRQcmVmaXggPSBhdXRoUGF0aFByZWZpeCAmJiAhYmFzZVVybEVuZHNXaXRoUHJlZml4ICYmICFub3JtYWxpemVkUmVmcmVzaFBhdGguc3RhcnRzV2l0aChhdXRoUGF0aFByZWZpeCk7XG4gIGNvbnN0IGVmZmVjdGl2ZVJlZnJlc2hQYXRoID0gc2hvdWxkQWRkUHJlZml4ID8gYCR7YXV0aFBhdGhQcmVmaXh9JHtub3JtYWxpemVkUmVmcmVzaFBhdGh9YCA6IG5vcm1hbGl6ZWRSZWZyZXNoUGF0aDtcblxuICBjb25zdCBsb2dpblBhdGggPSBlbmRwb2ludHMubG9naW4gPz8gJy9sb2dpbic7XG4gIGNvbnN0IHNpZ251cFBhdGggPSBlbmRwb2ludHMuc2lnbnVwID8/ICcvc2lnbnVwJztcbiAgY29uc3Qgc29jaWFsRXhjaGFuZ2VQYXRoID0gZW5kcG9pbnRzLnNvY2lhbEV4Y2hhbmdlID8/ICcvc29jaWFsL2V4Y2hhbmdlJztcblxuICBjb25zdCBpc0F1dGhBcGlSZXF1ZXN0ID0gcmVxLnVybC5pbmNsdWRlcyhiYXNlVXJsKTtcbiAgLy8gQ2hlY2sgaWYgcmVxdWVzdCBpcyB0byByZWZyZXNoIGVuZHBvaW50ICh1c2luZyBlZmZlY3RpdmUgcGF0aCB3aXRoIGF1dGhQYXRoUHJlZml4KVxuICBjb25zdCBpc1JlZnJlc2hFbmRwb2ludCA9IHJlcS51cmwuaW5jbHVkZXMoZWZmZWN0aXZlUmVmcmVzaFBhdGgpO1xuICBjb25zdCBpc1B1YmxpY0VuZHBvaW50ID1cbiAgICByZXEudXJsLmluY2x1ZGVzKGxvZ2luUGF0aCkgfHwgcmVxLnVybC5pbmNsdWRlcyhzaWdudXBQYXRoKSB8fCByZXEudXJsLmluY2x1ZGVzKHNvY2lhbEV4Y2hhbmdlUGF0aCk7XG4gIGNvbnN0IHNob3VsZEludGVyY2VwdCA9IGlzQXV0aEFwaVJlcXVlc3QgJiYgIWlzUmVmcmVzaEVuZHBvaW50ICYmICFpc1B1YmxpY0VuZHBvaW50O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQnVpbGQgcmVxdWVzdCBmb3IgY29va2llcyBtb2RlICh3aXRoQ3JlZGVudGlhbHMgKyBDU1JGKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElNUE9SVEFOVDogV2hlbiB1c2luZyBBbmd1bGFySHR0cEFkYXB0ZXIsIGhlYWRlcnMgZnJvbSBidWlsZEhlYWRlcnMoKSBhcmUgcGFzc2VkXG4gIC8vIHRvIEh0dHBDbGllbnQucmVxdWVzdCgpIGFzIGEgcGxhaW4gb2JqZWN0LiBBbmd1bGFyIGNvbnZlcnRzIHRoZXNlIHRvIEh0dHBIZWFkZXJzXG4gIC8vIGFuZCBjcmVhdGVzIGFuIEh0dHBSZXF1ZXN0LiBIb3dldmVyLCB3ZSBjYW5ub3QgcmVseSBvbiBidWlsZEhlYWRlcnMoKSB0byBhZGQgQ1NSRlxuICAvLyBpbiBBbmd1bGFyIGNvbnRleHQgYmVjYXVzZTpcbiAgLy8gMS4gaGFzV2luZG93KCkgbWlnaHQgcmV0dXJuIGZhbHNlIGluIFNTUiBjb250ZXh0c1xuICAvLyAyLiBIZWFkZXJzIG1pZ2h0IG5vdCBiZSBwcm9wZXJseSBtZXJnZWQgaW50byB0aGUgSHR0cFJlcXVlc3QgdGhhdCBpbnRlcmNlcHRvcnMgcmVjZWl2ZVxuICAvLyAzLiBUaGUgaW50ZXJjZXB0b3IgaXMgdGhlIGF1dGhvcml0YXRpdmUgcGxhY2UgZm9yIENTUkYgaW4gQW5ndWxhciBhcHBzXG4gIC8vXG4gIC8vIFRoZXJlZm9yZSwgdGhlIGludGVyY2VwdG9yIEFMV0FZUyBhZGRzIENTUkYgZm9yIG11dGF0aW5nIG1ldGhvZHMgaW4gY29va2llcyBtb2RlLFxuICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYnVpbGRIZWFkZXJzKCkgYWRkZWQgaXQgKGZvciB2YW5pbGxhIGNsaWVudHMpLlxuICBsZXQgYXV0aFJlcSA9IHJlcTtcbiAgaWYgKHRva2VuRGVsaXZlcnkgPT09ICdjb29raWVzJykge1xuICAgIGF1dGhSZXEgPSBhdXRoUmVxLmNsb25lKHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pO1xuICAgIC8vIEFkZCBDU1JGIHRva2VuIGZvciBtdXRhdGluZyBtZXRob2RzIChQT1NULCBQVVQsIFBBVENILCBERUxFVEUpXG4gICAgLy8gQWx3YXlzIGFkZCBpdCBoZXJlIC0gZG9uJ3QgcmVseSBvbiBidWlsZEhlYWRlcnMoKSBpbiBBbmd1bGFyIGNvbnRleHRcbiAgICAvLyBBZGQgQ1NSRiB0b2tlbiBmb3IgbXV0YXRpbmcgbWV0aG9kcyAoUE9TVCwgUFVULCBQQVRDSCwgREVMRVRFKVxuICAgIC8vIFRoaXMgcnVucyBmb3IgQUxMIHJlcXVlc3RzIGluIGNvb2tpZXMgbW9kZSwgbm90IGp1c3QgYXV0aCBBUEkgcmVxdWVzdHNcbiAgICAvLyBUaGlzIGVuc3VyZXMgQ1NSRiBwcm90ZWN0aW9uIGZvciBhbGwgbXV0YXRpbmcgb3BlcmF0aW9uc1xuICAgIGlmIChbJ1BPU1QnLCAnUFVUJywgJ1BBVENIJywgJ0RFTEVURSddLmluY2x1ZGVzKHJlcS5tZXRob2QpKSB7XG4gICAgICAvLyBSZXNwZWN0IHVzZXIncyBDU1JGIGNvbmZpZywgZmFsbGJhY2sgdG8gZGVmYXVsdHMgaWYgbm90IHByb3ZpZGVkXG4gICAgICAvLyBUaGVzZSBkZWZhdWx0cyBtdXN0IG1hdGNoIHRoZSBiYWNrZW5kJ3MgQ1NSRiBjb25maWd1cmF0aW9uXG4gICAgICBjb25zdCBjc3JmQ29va2llTmFtZSA9IGNvbmZpZy5jc3JmPy5jb29raWVOYW1lID8/ICduYXV0aF9jc3JmX3Rva2VuJztcbiAgICAgIGNvbnN0IGNzcmZIZWFkZXJOYW1lID0gY29uZmlnLmNzcmY/LmhlYWRlck5hbWUgPz8gJ3gtY3NyZi10b2tlbic7XG5cbiAgICAgIC8vIEdldCBDU1JGIHRva2VuIGZyb20gY29va2llIHVzaW5nIHRoZSBjb25maWd1cmVkIGNvb2tpZSBuYW1lXG4gICAgICBjb25zdCBjc3JmVG9rZW4gPSBnZXRDc3JmVG9rZW4oY3NyZkNvb2tpZU5hbWUpO1xuXG4gICAgICBpZiAoY3NyZlRva2VuKSB7XG4gICAgICAgIC8vIFVzZSBzZXRIZWFkZXJzIHdoaWNoIHdpbGwgb3ZlcnJpZGUgaWYgYWxyZWFkeSBleGlzdHMgKGZyb20gYnVpbGRIZWFkZXJzKVxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgQ1NSRiBpcyBhbHdheXMgcHJlc2VudCBmb3IgREVMRVRFIGFuZCBvdGhlciBtdXRhdGluZyBtZXRob2RzXG4gICAgICAgIGF1dGhSZXEgPSBhdXRoUmVxLmNsb25lKHsgc2V0SGVhZGVyczogeyBbY3NyZkhlYWRlck5hbWVdOiBjc3JmVG9rZW4gfSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENTUkYgdG9rZW4gbm90IGZvdW5kIC0gdGhpcyBjb3VsZCBoYXBwZW4gaWY6XG4gICAgICAgIC8vIDEuIENvb2tpZSBkb2Vzbid0IGV4aXN0IChiZWZvcmUgZmlyc3QgbG9naW4sIGFmdGVyIGxvZ291dCwgb3IgY29va2llIGV4cGlyZWQpXG4gICAgICAgIC8vIDIuIENvb2tpZSBuYW1lIG1pc21hdGNoIChjaGVjayBjb25maWcuY3NyZi5jb29raWVOYW1lIG1hdGNoZXMgYmFja2VuZClcbiAgICAgICAgLy8gMy4gQ29va2llIGlzIGh0dHBPbmx5IGFuZCBjYW4ndCBiZSByZWFkIChidXQgQ1NSRiBjb29raWVzIHNob3VsZCBiZSByZWFkYWJsZSlcbiAgICAgICAgLy8gVGhlIGJhY2tlbmQgc2hvdWxkIGhhbmRsZSBtaXNzaW5nIENTUkYgdG9rZW5zIGFwcHJvcHJpYXRlbHkgKHJldHVybiA0MDMgb3Igc2ltaWxhcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEpTT04gbW9kZTogYXR0YWNoIEF1dGhvcml6YXRpb24gaGVhZGVyIGZvciBIdHRwQ2xpZW50IGNhbGxzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU2ltcGxlIGFwcHJvYWNoOiBhdHRhY2ggdG9rZW4gaWYgYXZhaWxhYmxlLCBsZXQgYmFja2VuZCB2YWxpZGF0ZVxuICAvLyBIYW5kbGUgNDAxIHJlYWN0aXZlbHkgKG1hdGNoZXMgb2xkIHdvcmtpbmcgaW1wbGVtZW50YXRpb24pXG4gIGNvbnN0IGF0dGFjaEpzb25BdXRoJCA9XG4gICAgdG9rZW5EZWxpdmVyeSA9PT0gJ2pzb24nICYmIHNob3VsZEludGVyY2VwdCAmJiAhYXV0aFJlcS5oZWFkZXJzLmhhcygnQXV0aG9yaXphdGlvbicpXG4gICAgICA/IGZyb20oYXV0aFNlcnZpY2UuZ2V0QWNjZXNzVG9rZW4oKSkucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKHRva2VuKSA9PiB7XG4gICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKGF1dGhSZXEuY2xvbmUoeyBzZXRIZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gIH0gfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9mKGF1dGhSZXEpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IG9mKGF1dGhSZXEpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUmVmcmVzaCBjb29yZGluYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBnZXRPclN0YXJ0UmVmcmVzaCQgPSAoKTogT2JzZXJ2YWJsZTxzdHJpbmc+ID0+IHtcbiAgICBpZiAocmVmcmVzaEluRmxpZ2h0JCkgcmV0dXJuIHJlZnJlc2hJbkZsaWdodCQ7XG5cbiAgICAvLyBXSFk6IFdlIHdhbnQgdG8gZW5zdXJlIG9ubHkgb25lIHJlZnJlc2ggcmVxdWVzdCBpcyBpbiBmbGlnaHQgYXQgYW55IHRpbWUuXG4gICAgLy8gQWxsIHJlcXVlc3RzIChpbmNsdWRpbmcgdGhvc2UgdGhhdCBoYXZlbid0IGhpdCB0aGUgYmFja2VuZCB5ZXQpIHNob3VsZCB3YWl0IGZvclxuICAgIC8vIHRoZSBzYW1lIHJlZnJlc2ggcmVzdWx0IHRvIGF2b2lkIGEgYnVyc3Qgb2YgNDAxcyBhbmQgcG90ZW50aWFsIFdBRi9yYXRlLWxpbWl0IGlzc3Vlcy5cbiAgICBpc1JlZnJlc2hpbmcgPSB0cnVlO1xuICAgIHJlZnJlc2hUb2tlblN1YmplY3QubmV4dChudWxsKTtcblxuICAgIC8vIFdIWTogQWx3YXlzIHJlZnJlc2ggdmlhIHRoZSBjb3JlIGNsaWVudC5cbiAgICAvLyAtIEVuc3VyZXMgYXV0aFBhdGhQcmVmaXggKyBkZWZhdWx0IGVuZHBvaW50cyBhcmUgYXBwbGllZCBjb25zaXN0ZW50bHkgKGZpeGVzIC9yZWZyZXNoIHZzIC9hdXRoL3JlZnJlc2gpLlxuICAgIC8vIC0gQ2VudHJhbGl6ZXMgQ1NSRiArIGNyZWRlbnRpYWxzIGhhbmRsaW5nIGluIG9uZSBwbGFjZS5cbiAgICBjb25zdCByZWZyZXNoUmVxdWVzdCQgPSBmcm9tKGF1dGhTZXJ2aWNlLmdldENsaWVudCgpLnJlZnJlc2hUb2tlbnMoKSk7XG5cbiAgICByZWZyZXNoSW5GbGlnaHQkID0gcmVmcmVzaFJlcXVlc3QkLnBpcGUoXG4gICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIC8vIENvb2tpZXMgbW9kZTogc3VjY2VzcyBpcyBlbm91Z2ggKHRva2VucyBhcmUgaW4gaHR0cE9ubHkgY29va2llcykuXG4gICAgICAgIC8vIEpTT04gbW9kZTogd2UgbmVlZCB0aGUgbmV3IGFjY2VzcyB0b2tlbiB0byByZXRyeSArIHVuYmxvY2sgcXVldWVkIHJlcXVlc3RzLlxuICAgICAgICBjb25zdCBuZXdUb2tlbiA9IHRva2VuRGVsaXZlcnkgPT09ICdqc29uJyA/IHJlc3BvbnNlLmFjY2Vzc1Rva2VuIDogJ3N1Y2Nlc3MnO1xuXG4gICAgICAgIGlmICh0b2tlbkRlbGl2ZXJ5ID09PSAnanNvbicgJiYgKCFuZXdUb2tlbiB8fCBuZXdUb2tlbiA9PT0gJ3N1Y2Nlc3MnKSkge1xuICAgICAgICAgIC8vIOKaoO+4jyBXQVJOSU5HOiBXaXRob3V0IGFuIGFjY2VzcyB0b2tlbiB3ZSBjYW5ub3Qgc2FmZWx5IHJldHJ5IHJlcXVlc3RzIGluIEpTT04gbW9kZS5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rva2VuIHJlZnJlc2ggZGlkIG5vdCByZXR1cm4gYW4gYWNjZXNzIHRva2VuJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZWZyZXNoVG9rZW5TdWJqZWN0Lm5leHQobmV3VG9rZW4gPz8gJ3N1Y2Nlc3MnKTtcbiAgICAgICAgcmV0dXJuIG5ld1Rva2VuID8/ICdzdWNjZXNzJztcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgIHJlZnJlc2hUb2tlblN1YmplY3QubmV4dChudWxsKTtcblxuICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gZ2V0U3RhdHVzQ29kZShlcnIpO1xuXG4gICAgICAgIC8vIFJlZnJlc2ggZmFpbGVkIHdpdGggNDAxID0+IHNlc3Npb24gZXhwaXJlZC5cbiAgICAgICAgLy8gQ2xlYXIgKmxvY2FsKiBTREsgc3RhdGUgc28gZ3VhcmRzL3BhZ2VzIGRvbid0IHRoaW5rIHRoZSB1c2VyIGlzIHN0aWxsIGxvZ2dlZCBpbiBhZnRlciBuYXZpZ2F0aW9uL3JlbG9hZC5cbiAgICAgICAgLy8gSU1QT1JUQU5UOiBUaGlzIGFsc28gY2xlYXJzIGNoYWxsZW5nZSBzZXNzaW9ucyBhbmQgT0F1dGggc3RhdGUgdG8gcHJldmVudCBnaG9zdCBzdGF0ZXMuXG4gICAgICAgIGlmIChzdGF0dXNDb2RlID09PSA0MDEpIHtcbiAgICAgICAgICAvLyBCZXN0LWVmZm9ydDogYWxzbyBjbGVhciBDU1JGIGNvb2tpZSBpbiBjb29raWVzIG1vZGUgKG5vbi1odHRwT25seSkuXG4gICAgICAgICAgaWYgKHRva2VuRGVsaXZlcnkgPT09ICdjb29raWVzJykge1xuICAgICAgICAgICAgY29uc3QgY3NyZkNvb2tpZU5hbWUgPSBjb25maWcuY3NyZj8uY29va2llTmFtZSA/PyAnbmF1dGhfY3NyZl90b2tlbic7XG4gICAgICAgICAgICBjbGVhckNzcmZDb29raWUoY29uZmlnLmJhc2VVcmwsIGNzcmZDb29raWVOYW1lKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZnJvbShhdXRoU2VydmljZS5nZXRDbGllbnQoKS5jbGVhckxvY2FsQXV0aFN0YXRlKCkpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBDYWxsIG9uU2Vzc2lvbkV4cGlyZWQgY2FsbGJhY2sgaWYgY29uZmlndXJlZFxuICAgICAgICAgICAgICBjb25maWcub25TZXNzaW9uRXhwaXJlZD8uKCk7XG5cbiAgICAgICAgICAgICAgaWYgKGNvbmZpZy5yZWRpcmVjdHM/LnNlc3Npb25FeHBpcmVkKSB7XG4gICAgICAgICAgICAgICAgcm91dGVyLm5hdmlnYXRlQnlVcmwoY29uZmlnLnJlZGlyZWN0cy5zZXNzaW9uRXhwaXJlZCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIG5hdmlnYXRpb24gZXJyb3JzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnIpO1xuICAgICAgfSksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgIGlzUmVmcmVzaGluZyA9IGZhbHNlO1xuICAgICAgICByZWZyZXNoSW5GbGlnaHQkID0gbnVsbDtcbiAgICAgIH0pLFxuICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogZmFsc2UgfSksXG4gICAgKTtcblxuICAgIHJldHVybiByZWZyZXNoSW5GbGlnaHQkO1xuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHJlLXJlcXVlc3QgZ2F0aW5nOiBibG9jayByZXF1ZXN0cyB3aGlsZSByZWZyZXNoIGlzIGluLWZsaWdodFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFdIWTogUHJldmVudCBtdWx0aXBsZSByZXF1ZXN0cyBmcm9tIGhpdHRpbmcgdGhlIGJhY2tlbmQgd2l0aCBhbiBleHBpcmVkIHRva2VuIGFuZCByZXR1cm5pbmcgNDAxLlxuICAvLyBXZSBxdWV1ZSBhbGwgYXV0aCBBUEkgY2FsbHMgZHVyaW5nIHJlZnJlc2ggYW5kIHJlbGVhc2UgdGhlbSBvbmNlIHJlZnJlc2ggc3VjY2VlZHMuXG4gIGlmIChzaG91bGRJbnRlcmNlcHQgJiYgaXNSZWZyZXNoaW5nICYmIHJlZnJlc2hJbkZsaWdodCQpIHtcbiAgICByZXR1cm4gcmVmcmVzaEluRmxpZ2h0JC5waXBlKFxuICAgICAgc3dpdGNoTWFwKCh0b2tlbikgPT4ge1xuICAgICAgICBjb25zdCBnYXRlZFJlcSA9IGJ1aWxkUmV0cnlSZXF1ZXN0KGF1dGhSZXEsIHRva2VuRGVsaXZlcnksIHRva2VuLCBjb25maWcuY3NyZik7XG4gICAgICAgIHJldHVybiBuZXh0KGdhdGVkUmVxKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gYXR0YWNoSnNvbkF1dGgkLnBpcGUoXG4gICAgc3dpdGNoTWFwKChyZXF1ZXN0V2l0aEF1dGgpID0+XG4gICAgICBuZXh0KHJlcXVlc3RXaXRoQXV0aCkucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICBjb25zdCBzaG91bGRIYW5kbGUgPVxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiBlcnJvci5zdGF0dXMgPT09IDQwMSAmJiBzaG91bGRJbnRlcmNlcHQgJiYgIXJldHJpZWRSZXF1ZXN0cy5oYXMocmVxKTtcblxuICAgICAgICAgIGlmICghc2hvdWxkSGFuZGxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0cmllZFJlcXVlc3RzLmFkZChyZXEpO1xuXG4gICAgICAgICAgcmV0dXJuIGdldE9yU3RhcnRSZWZyZXNoJCgpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKHRva2VuKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJldHJ5UmVxID0gYnVpbGRSZXRyeVJlcXVlc3QocmVxdWVzdFdpdGhBdXRoLCB0b2tlbkRlbGl2ZXJ5LCB0b2tlbiwgY29uZmlnLmNzcmYpO1xuICAgICAgICAgICAgICByZXRyaWVkUmVxdWVzdHMuYWRkKHJldHJ5UmVxKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQocmV0cnlSZXEpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICksXG4gICk7XG59XG4iXX0=
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1pbnRlcmNlcHRvci5zaGFyZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F1dGgtaW50ZXJjZXB0b3Iuc2hhcmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxpQkFBaUIsRUFBeUMsTUFBTSxzQkFBc0IsQ0FBQztBQUU1RyxPQUFPLEVBQ0wsZUFBZSxFQUVmLFVBQVUsRUFDVixRQUFRLEVBQ1IsSUFBSSxFQUNKLEdBQUcsRUFDSCxFQUFFLEVBQ0YsV0FBVyxFQUNYLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7QUFJZDs7Ozs7Ozs7R0FRRztBQUVILCtFQUErRTtBQUMvRSwwQ0FBMEM7QUFDMUMsK0VBQStFO0FBQy9FLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztBQUN6QixNQUFNLG1CQUFtQixHQUFHLElBQUksZUFBZSxDQUFnQixJQUFJLENBQUMsQ0FBQztBQUNyRSxJQUFJLGdCQUFnQixHQUE4QixJQUFJLENBQUM7QUFDdkQsTUFBTSxlQUFlLEdBQUcsSUFBSSxPQUFPLEVBQXdCLENBQUM7QUFFNUQsK0VBQStFO0FBQy9FLHlCQUF5QjtBQUN6QiwrRUFBK0U7QUFFL0U7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLEtBQWM7SUFDbkMsSUFBSSxLQUFLLFlBQVksaUJBQWlCO1FBQUUsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksWUFBWSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pFLE1BQU0sVUFBVSxHQUFJLEtBQWtDLENBQUMsVUFBVSxDQUFDO1FBQ2xFLE9BQU8sT0FBTyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM1RCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxD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SyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FDekIsU0FBUyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FDeEIsVUFBVSxDQUFDLENBQUMsS0FBYyxFQUFFLEVBQUU7UUFDNUIsTUFBTSxZQUFZLEdBQ2hCLEtBQUssWUFBWSxpQkFBaUIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxlQUFlLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTdHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV6QixPQUFPLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUM5QixTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNsQixNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkYsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FDRixDQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBFdmVudCwgSHR0cEhhbmRsZXJGbiwgSHR0cFJlcXVlc3QgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBjYXRjaEVycm9yLFxuICBmaW5hbGl6ZSxcbiAgZnJvbSxcbiAgbWFwLFxuICBvZixcbiAgc2hhcmVSZXBsYXksXG4gIHN3aXRjaE1hcCxcbiAgdGhyb3dFcnJvcixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgdHlwZSB7IE5BdXRoQ2xpZW50Q29uZmlnIH0gZnJvbSAnQG5hdXRoLXRvb2xraXQvY2xpZW50JztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vbmdtb2R1bGUvYXV0aC5zZXJ2aWNlJztcblxuLyoqXG4gKiBTaGFyZWQgaW50ZXJjZXB0b3IgbG9naWMgZm9yIGJvdGg6XG4gKiAtIEZ1bmN0aW9uYWwgaW50ZXJjZXB0b3IgKEFuZ3VsYXIgMTcrIHN0YW5kYWxvbmUpXG4gKiAtIENsYXNzLWJhc2VkIGludGVyY2VwdG9yIChOZ01vZHVsZSBhcHBzKVxuICpcbiAqIFdIWTpcbiAqIC0gS2VlcCBvbmUgaW1wbGVtZW50YXRpb24gZm9yIGNvb2tpZXMgKyBqc29uIG1vZGUgYmVoYXZpb3IuXG4gKiAtIEF2b2lkIGRpdmVyZ2VuY2UgYmV0d2VlbiBzdGFuZGFsb25lIGFuZCBOZ01vZHVsZSBpbnRlZ3JhdGlvbnMuXG4gKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVmcmVzaCBzdGF0ZSBtYW5hZ2VtZW50IChtb2R1bGUtbGV2ZWwpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5sZXQgaXNSZWZyZXNoaW5nID0gZmFsc2U7XG5jb25zdCByZWZyZXNoVG9rZW5TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcbmxldCByZWZyZXNoSW5GbGlnaHQkOiBPYnNlcnZhYmxlPHN0cmluZz4gfCBudWxsID0gbnVsbDtcbmNvbnN0IHJldHJpZWRSZXF1ZXN0cyA9IG5ldyBXZWFrU2V0PEh0dHBSZXF1ZXN0PHVua25vd24+PigpO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFcnJvciArIGNvb2tpZSBoZWxwZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU2FmZWx5IGV4dHJhY3QgSFRUUCBzdGF0dXMgY29kZSBmcm9tIGVpdGhlcjpcbiAqIC0gQW5ndWxhciBIdHRwRXJyb3JSZXNwb25zZSAoSHR0cENsaWVudCBjYWxscylcbiAqIC0gU0RLIE5BdXRoQ2xpZW50RXJyb3IgKHRocm93biBieSB0aGUgU0RLJ3MgSHR0cEFkYXB0ZXIpXG4gKi9cbmZ1bmN0aW9uIGdldFN0YXR1c0NvZGUoZXJyb3I6IHVua25vd24pOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHJldHVybiBlcnJvci5zdGF0dXM7XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXNDb2RlJyBpbiBlcnJvcikge1xuICAgIGNvbnN0IHN0YXR1c0NvZGUgPSAoZXJyb3IgYXMgeyBzdGF0dXNDb2RlPzogdW5rbm93biB9KS5zdGF0dXNDb2RlO1xuICAgIHJldHVybiB0eXBlb2Ygc3RhdHVzQ29kZSA9PT0gJ251bWJlcicgPyBzdGF0dXNDb2RlIDogbnVsbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBDU1JGIGNvb2tpZSBjbGVhcmluZyAobm9uLWh0dHBPbmx5KS5cbiAqXG4gKiBXQVJOSU5HOiBUaGlzIGNhbm5vdCBjbGVhciBodHRwT25seSBhdXRoIGNvb2tpZXMgKGFjY2Vzcy9yZWZyZXNoL2RldmljZSkuXG4gKiBUaG9zZSBtdXN0IGJlIGNsZWFyZWQgYnkgdGhlIGJhY2tlbmQgb24gcmVmcmVzaC9sb2dvdXQuXG4gKi9cbmZ1bmN0aW9uIGNsZWFyQ3NyZkNvb2tpZShiYXNlVXJsOiBzdHJpbmcsIGNvb2tpZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuXG4gIC8vIFdIWTogQ29va2llIGRvbWFpbiBoYW5kbGluZyBkaWZmZXJzIGJldHdlZW4gbG9jYWxob3N0IGFuZCByZWFsIGRvbWFpbnMuXG4gIC8vIFdlIHRyeSB0byBjbGVhciB3aXRoIGFuIGV4cGxpY2l0IGRvbWFpbiAoaWYgYXZhaWxhYmxlKSwgdGhlbiB3aXRob3V0LlxuICB0cnkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYmFzZVVybCk7XG4gICAgZG9jdW1lbnQuY29va2llID0gYCR7Y29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS87IGRvbWFpbj0ke3VybC5ob3N0bmFtZX1gO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2Nvb2tpZU5hbWV9PTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQzsgcGF0aD0vYDtcbiAgfSBjYXRjaCB7XG4gICAgZG9jdW1lbnQuY29va2llID0gYCR7Y29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS9gO1xuICB9XG59XG5cbi8qKlxuICogR2V0IENTUkYgdG9rZW4gZnJvbSBjb29raWUuXG4gKlxuICogQHBhcmFtIGNvb2tpZU5hbWUgLSBOYW1lIG9mIHRoZSBDU1JGIGNvb2tpZSAoZnJvbSBjb25maWcuY3NyZi5jb29raWVOYW1lKVxuICogQHJldHVybnMgQ1NSRiB0b2tlbiB2YWx1ZSBvciBudWxsIGlmIG5vdCBmb3VuZFxuICovXG5mdW5jdGlvbiBnZXRDc3JmVG9rZW4oY29va2llTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gbnVsbDtcbiAgLy8gRXNjYXBlIHNwZWNpYWwgcmVnZXggY2hhcmFjdGVycyBpbiBjb29raWUgbmFtZSB0byBwcmV2ZW50IGluamVjdGlvblxuICBjb25zdCBlc2NhcGVkQ29va2llTmFtZSA9IGNvb2tpZU5hbWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcbiAgY29uc3QgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cChgKF58ICkke2VzY2FwZWRDb29raWVOYW1lfT0oW147XSspYCkpO1xuICByZXR1cm4gbWF0Y2ggPyBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbMl0pIDogbnVsbDtcbn1cblxuLyoqXG4gKiBCdWlsZCByZXRyeSByZXF1ZXN0IHdpdGggYXBwcm9wcmlhdGUgYXV0aC5cbiAqXG4gKiBJbiBjb29raWVzIG1vZGU6IEJyb3dzZXIgYXV0b21hdGljYWxseSBzZW5kcyB1cGRhdGVkIGh0dHBPbmx5IGNvb2tpZXMgKGFjY2Vzcy9yZWZyZXNoIHRva2VucykuXG4gKiBXZSBtdXN0IHJlLXJlYWQgQ1NSRiB0b2tlbiBhZnRlciByZWZyZXNoIHRvIGF2b2lkIHN0YWxlIGhlYWRlcnMuXG4gKlxuICogSW4gSlNPTiBtb2RlOiBDbG9uZXMgdGhlIHJlcXVlc3QgYW5kIGFkZHMgdGhlIG5ldyBCZWFyZXIgdG9rZW4uXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUmV0cnlSZXF1ZXN0KFxuICBvcmlnaW5hbFJlcTogSHR0cFJlcXVlc3Q8dW5rbm93bj4sXG4gIHRva2VuRGVsaXZlcnk6IHN0cmluZyxcbiAgbmV3VG9rZW4/OiBzdHJpbmcgfCBudWxsLFxuICBjc3JmQ29uZmlnPzogeyBjb29raWVOYW1lPzogc3RyaW5nOyBoZWFkZXJOYW1lPzogc3RyaW5nIH0sXG4pOiBIdHRwUmVxdWVzdDx1bmtub3duPiB7XG4gIGlmICh0b2tlbkRlbGl2ZXJ5ID09PSAnanNvbicgJiYgbmV3VG9rZW4gJiYgbmV3VG9rZW4gIT09ICdzdWNjZXNzJykge1xuICAgIHJldHVybiBvcmlnaW5hbFJlcS5jbG9uZSh7IHNldEhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke25ld1Rva2VufWAgfSB9KTtcbiAgfVxuXG4gIGlmICh0b2tlbkRlbGl2ZXJ5ID09PSAnY29va2llcycgJiYgWydQT1NUJywgJ1BVVCcsICdQQVRDSCcsICdERUxFVEUnXS5pbmNsdWRlcyhvcmlnaW5hbFJlcS5tZXRob2QpKSB7XG4gICAgY29uc3QgY3NyZkNvb2tpZU5hbWUgPSBjc3JmQ29uZmlnPy5jb29raWVOYW1lID8/ICduYXV0aF9jc3JmX3Rva2VuJztcbiAgICBjb25zdCBjc3JmSGVhZGVyTmFtZSA9IGNzcmZDb25maWc/LmhlYWRlck5hbWUgPz8gJ3gtY3NyZi10b2tlbic7XG4gICAgLy8gQWx3YXlzIHJlZnJlc2ggQ1NSRiB0b2tlbiBvbiByZXRyeSAoZXZlbiBpZiBpdCBleGlzdHMsIGdldCBmcmVzaCBvbmUpXG4gICAgY29uc3QgZnJlc2hDc3JmVG9rZW4gPSBnZXRDc3JmVG9rZW4oY3NyZkNvb2tpZU5hbWUpO1xuICAgIGlmIChmcmVzaENzcmZUb2tlbikge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsUmVxLmNsb25lKHsgc2V0SGVhZGVyczogeyBbY3NyZkhlYWRlck5hbWVdOiBmcmVzaENzcmZUb2tlbiB9IH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvcmlnaW5hbFJlcTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5BdXRoQXV0aEh0dHBJbnRlcmNlcHRvcihwYXJhbXM6IHtcbiAgY29uZmlnOiBOQXV0aENsaWVudENvbmZpZztcbiAgaHR0cDogSHR0cENsaWVudDtcbiAgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlO1xuICByb3V0ZXI6IFJvdXRlcjtcbiAgbmV4dDogSHR0cEhhbmRsZXJGbjtcbiAgcmVxOiBIdHRwUmVxdWVzdDx1bmtub3duPjtcbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xuICBjb25zdCB7IGNvbmZpZywgYXV0aFNlcnZpY2UsIHJvdXRlciwgbmV4dCwgcmVxIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgdG9rZW5EZWxpdmVyeSA9IGNvbmZpZy50b2tlbkRlbGl2ZXJ5O1xuICBjb25zdCBiYXNlVXJsID0gY29uZmlnLmJhc2VVcmw7XG4gIGNvbnN0IGVuZHBvaW50cyA9IGNvbmZpZy5lbmRwb2ludHMgPz8ge307XG4gIGNvbnN0IGF1dGhQYXRoUHJlZml4ID0gY29uZmlnLmF1dGhQYXRoUHJlZml4O1xuXG4gIC8vIEJ1aWxkIHJlZnJlc2ggcGF0aCB3aXRoIGF1dGhQYXRoUHJlZml4IGlmIGNvbmZpZ3VyZWQgKG1hdGNoZXMgY29yZSBjbGllbnQgYnVpbGRVcmwgbG9naWMgZXhhY3RseSlcbiAgLy8gVXNlIGRlZmF1bHQgJy9yZWZyZXNoJyBpZiBlbmRwb2ludHMucmVmcmVzaCBpcyBub3QgZGVmaW5lZFxuICBjb25zdCByZWZyZXNoUGF0aCA9IGVuZHBvaW50cz8ucmVmcmVzaCA/PyAnL3JlZnJlc2gnO1xuICBjb25zdCBub3JtYWxpemVkUmVmcmVzaFBhdGggPSByZWZyZXNoUGF0aC5zdGFydHNXaXRoKCcvJykgPyByZWZyZXNoUGF0aCA6IGAvJHtyZWZyZXNoUGF0aH1gO1xuXG4gIC8vIENoZWNrIGlmIGJhc2VVcmwgYWxyZWFkeSBlbmRzIHdpdGggYXV0aFBhdGhQcmVmaXggdG8gYXZvaWQgZG91YmxlLXByZWZpeGluZ1xuICAvLyBUaGlzIG11c3QgbWF0Y2ggdGhlIGNvcmUgY2xpZW50J3MgYnVpbGRVcmwgbG9naWMgZXhhY3RseVxuICBjb25zdCBiYXNlVXJsRW5kc1dpdGhQcmVmaXggPSBhdXRoUGF0aFByZWZpeCAmJiBiYXNlVXJsLmVuZHNXaXRoKGF1dGhQYXRoUHJlZml4KTtcblxuICBjb25zdCBzaG91bGRBZGRQcmVmaXggPSBhdXRoUGF0aFByZWZpeCAmJiAhYmFzZVVybEVuZHNXaXRoUHJlZml4ICYmICFub3JtYWxpemVkUmVmcmVzaFBhdGguc3RhcnRzV2l0aChhdXRoUGF0aFByZWZpeCk7XG4gIGNvbnN0IGVmZmVjdGl2ZVJlZnJlc2hQYXRoID0gc2hvdWxkQWRkUHJlZml4ID8gYCR7YXV0aFBhdGhQcmVmaXh9JHtub3JtYWxpemVkUmVmcmVzaFBhdGh9YCA6IG5vcm1hbGl6ZWRSZWZyZXNoUGF0aDtcblxuICBjb25zdCBsb2dpblBhdGggPSBlbmRwb2ludHMubG9naW4gPz8gJy9sb2dpbic7XG4gIGNvbnN0IHNpZ251cFBhdGggPSBlbmRwb2ludHMuc2lnbnVwID8/ICcvc2lnbnVwJztcbiAgY29uc3Qgc29jaWFsRXhjaGFuZ2VQYXRoID0gZW5kcG9pbnRzLnNvY2lhbEV4Y2hhbmdlID8/ICcvc29jaWFsL2V4Y2hhbmdlJztcblxuICBjb25zdCBpc0F1dGhBcGlSZXF1ZXN0ID0gcmVxLnVybC5pbmNsdWRlcyhiYXNlVXJsKTtcbiAgLy8gQ2hlY2sgaWYgcmVxdWVzdCBpcyB0byByZWZyZXNoIGVuZHBvaW50ICh1c2luZyBlZmZlY3RpdmUgcGF0aCB3aXRoIGF1dGhQYXRoUHJlZml4KVxuICBjb25zdCBpc1JlZnJlc2hFbmRwb2ludCA9IHJlcS51cmwuaW5jbHVkZXMoZWZmZWN0aXZlUmVmcmVzaFBhdGgpO1xuICBjb25zdCBpc1B1YmxpY0VuZHBvaW50ID1cbiAgICByZXEudXJsLmluY2x1ZGVzKGxvZ2luUGF0aCkgfHwgcmVxLnVybC5pbmNsdWRlcyhzaWdudXBQYXRoKSB8fCByZXEudXJsLmluY2x1ZGVzKHNvY2lhbEV4Y2hhbmdlUGF0aCk7XG4gIGNvbnN0IHNob3VsZEludGVyY2VwdCA9IGlzQXV0aEFwaVJlcXVlc3QgJiYgIWlzUmVmcmVzaEVuZHBvaW50ICYmICFpc1B1YmxpY0VuZHBvaW50O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQnVpbGQgcmVxdWVzdCBmb3IgY29va2llcyBtb2RlICh3aXRoQ3JlZGVudGlhbHMgKyBDU1JGKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElNUE9SVEFOVDogV2hlbiB1c2luZyBBbmd1bGFySHR0cEFkYXB0ZXIsIGhlYWRlcnMgZnJvbSBidWlsZEhlYWRlcnMoKSBhcmUgcGFzc2VkXG4gIC8vIHRvIEh0dHBDbGllbnQucmVxdWVzdCgpIGFzIGEgcGxhaW4gb2JqZWN0LiBBbmd1bGFyIGNvbnZlcnRzIHRoZXNlIHRvIEh0dHBIZWFkZXJzXG4gIC8vIGFuZCBjcmVhdGVzIGFuIEh0dHBSZXF1ZXN0LiBIb3dldmVyLCB3ZSBjYW5ub3QgcmVseSBvbiBidWlsZEhlYWRlcnMoKSB0byBhZGQgQ1NSRlxuICAvLyBpbiBBbmd1bGFyIGNvbnRleHQgYmVjYXVzZTpcbiAgLy8gMS4gaGFzV2luZG93KCkgbWlnaHQgcmV0dXJuIGZhbHNlIGluIFNTUiBjb250ZXh0c1xuICAvLyAyLiBIZWFkZXJzIG1pZ2h0IG5vdCBiZSBwcm9wZXJseSBtZXJnZWQgaW50byB0aGUgSHR0cFJlcXVlc3QgdGhhdCBpbnRlcmNlcHRvcnMgcmVjZWl2ZVxuICAvLyAzLiBUaGUgaW50ZXJjZXB0b3IgaXMgdGhlIGF1dGhvcml0YXRpdmUgcGxhY2UgZm9yIENTUkYgaW4gQW5ndWxhciBhcHBzXG4gIC8vXG4gIC8vIFRoZXJlZm9yZSwgdGhlIGludGVyY2VwdG9yIEFMV0FZUyBhZGRzIENTUkYgZm9yIG11dGF0aW5nIG1ldGhvZHMgaW4gY29va2llcyBtb2RlLFxuICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYnVpbGRIZWFkZXJzKCkgYWRkZWQgaXQgKGZvciB2YW5pbGxhIGNsaWVudHMpLlxuICBsZXQgYXV0aFJlcSA9IHJlcTtcbiAgaWYgKHRva2VuRGVsaXZlcnkgPT09ICdjb29raWVzJykge1xuICAgIGF1dGhSZXEgPSBhdXRoUmVxLmNsb25lKHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pO1xuICAgIC8vIEFkZCBDU1JGIHRva2VuIGZvciBtdXRhdGluZyBtZXRob2RzIChQT1NULCBQVVQsIFBBVENILCBERUxFVEUpXG4gICAgLy8gQWx3YXlzIGFkZCBpdCBoZXJlIC0gZG9uJ3QgcmVseSBvbiBidWlsZEhlYWRlcnMoKSBpbiBBbmd1bGFyIGNvbnRleHRcbiAgICAvLyBBZGQgQ1NSRiB0b2tlbiBmb3IgbXV0YXRpbmcgbWV0aG9kcyAoUE9TVCwgUFVULCBQQVRDSCwgREVMRVRFKVxuICAgIC8vIFRoaXMgcnVucyBmb3IgQUxMIHJlcXVlc3RzIGluIGNvb2tpZXMgbW9kZSwgbm90IGp1c3QgYXV0aCBBUEkgcmVxdWVzdHNcbiAgICAvLyBUaGlzIGVuc3VyZXMgQ1NSRiBwcm90ZWN0aW9uIGZvciBhbGwgbXV0YXRpbmcgb3BlcmF0aW9uc1xuICAgIGlmIChbJ1BPU1QnLCAnUFVUJywgJ1BBVENIJywgJ0RFTEVURSddLmluY2x1ZGVzKHJlcS5tZXRob2QpKSB7XG4gICAgICAvLyBSZXNwZWN0IHVzZXIncyBDU1JGIGNvbmZpZywgZmFsbGJhY2sgdG8gZGVmYXVsdHMgaWYgbm90IHByb3ZpZGVkXG4gICAgICAvLyBUaGVzZSBkZWZhdWx0cyBtdXN0IG1hdGNoIHRoZSBiYWNrZW5kJ3MgQ1NSRiBjb25maWd1cmF0aW9uXG4gICAgICBjb25zdCBjc3JmQ29va2llTmFtZSA9IGNvbmZpZy5jc3JmPy5jb29raWVOYW1lID8/ICduYXV0aF9jc3JmX3Rva2VuJztcbiAgICAgIGNvbnN0IGNzcmZIZWFkZXJOYW1lID0gY29uZmlnLmNzcmY/LmhlYWRlck5hbWUgPz8gJ3gtY3NyZi10b2tlbic7XG5cbiAgICAgIC8vIEdldCBDU1JGIHRva2VuIGZyb20gY29va2llIHVzaW5nIHRoZSBjb25maWd1cmVkIGNvb2tpZSBuYW1lXG4gICAgICBjb25zdCBjc3JmVG9rZW4gPSBnZXRDc3JmVG9rZW4oY3NyZkNvb2tpZU5hbWUpO1xuXG4gICAgICBpZiAoY3NyZlRva2VuKSB7XG4gICAgICAgIC8vIFVzZSBzZXRIZWFkZXJzIHdoaWNoIHdpbGwgb3ZlcnJpZGUgaWYgYWxyZWFkeSBleGlzdHMgKGZyb20gYnVpbGRIZWFkZXJzKVxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgQ1NSRiBpcyBhbHdheXMgcHJlc2VudCBmb3IgREVMRVRFIGFuZCBvdGhlciBtdXRhdGluZyBtZXRob2RzXG4gICAgICAgIGF1dGhSZXEgPSBhdXRoUmVxLmNsb25lKHsgc2V0SGVhZGVyczogeyBbY3NyZkhlYWRlck5hbWVdOiBjc3JmVG9rZW4gfSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENTUkYgdG9rZW4gbm90IGZvdW5kIC0gdGhpcyBjb3VsZCBoYXBwZW4gaWY6XG4gICAgICAgIC8vIDEuIENvb2tpZSBkb2Vzbid0IGV4aXN0IChiZWZvcmUgZmlyc3QgbG9naW4sIGFmdGVyIGxvZ291dCwgb3IgY29va2llIGV4cGlyZWQpXG4gICAgICAgIC8vIDIuIENvb2tpZSBuYW1lIG1pc21hdGNoIChjaGVjayBjb25maWcuY3NyZi5jb29raWVOYW1lIG1hdGNoZXMgYmFja2VuZClcbiAgICAgICAgLy8gMy4gQ29va2llIGlzIGh0dHBPbmx5IGFuZCBjYW4ndCBiZSByZWFkIChidXQgQ1NSRiBjb29raWVzIHNob3VsZCBiZSByZWFkYWJsZSlcbiAgICAgICAgLy8gVGhlIGJhY2tlbmQgc2hvdWxkIGhhbmRsZSBtaXNzaW5nIENTUkYgdG9rZW5zIGFwcHJvcHJpYXRlbHkgKHJldHVybiA0MDMgb3Igc2ltaWxhcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEpTT04gbW9kZTogYXR0YWNoIEF1dGhvcml6YXRpb24gaGVhZGVyIGZvciBIdHRwQ2xpZW50IGNhbGxzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU2ltcGxlIGFwcHJvYWNoOiBhdHRhY2ggdG9rZW4gaWYgYXZhaWxhYmxlLCBsZXQgYmFja2VuZCB2YWxpZGF0ZVxuICAvLyBIYW5kbGUgNDAxIHJlYWN0aXZlbHkgKG1hdGNoZXMgb2xkIHdvcmtpbmcgaW1wbGVtZW50YXRpb24pXG4gIGNvbnN0IGF0dGFjaEpzb25BdXRoJCA9XG4gICAgdG9rZW5EZWxpdmVyeSA9PT0gJ2pzb24nICYmIHNob3VsZEludGVyY2VwdCAmJiAhYXV0aFJlcS5oZWFkZXJzLmhhcygnQXV0aG9yaXphdGlvbicpXG4gICAgICA/IGZyb20oYXV0aFNlcnZpY2UuZ2V0QWNjZXNzVG9rZW4oKSkucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKHRva2VuKSA9PiB7XG4gICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKGF1dGhSZXEuY2xvbmUoeyBzZXRIZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gIH0gfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9mKGF1dGhSZXEpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IG9mKGF1dGhSZXEpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUmVmcmVzaCBjb29yZGluYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBnZXRPclN0YXJ0UmVmcmVzaCQgPSAoKTogT2JzZXJ2YWJsZTxzdHJpbmc+ID0+IHtcbiAgICBpZiAocmVmcmVzaEluRmxpZ2h0JCkgcmV0dXJuIHJlZnJlc2hJbkZsaWdodCQ7XG5cbiAgICAvLyBXSFk6IFdlIHdhbnQgdG8gZW5zdXJlIG9ubHkgb25lIHJlZnJlc2ggcmVxdWVzdCBpcyBpbiBmbGlnaHQgYXQgYW55IHRpbWUuXG4gICAgLy8gQWxsIHJlcXVlc3RzIChpbmNsdWRpbmcgdGhvc2UgdGhhdCBoYXZlbid0IGhpdCB0aGUgYmFja2VuZCB5ZXQpIHNob3VsZCB3YWl0IGZvclxuICAgIC8vIHRoZSBzYW1lIHJlZnJlc2ggcmVzdWx0IHRvIGF2b2lkIGEgYnVyc3Qgb2YgNDAxcyBhbmQgcG90ZW50aWFsIFdBRi9yYXRlLWxpbWl0IGlzc3Vlcy5cbiAgICBpc1JlZnJlc2hpbmcgPSB0cnVlO1xuICAgIHJlZnJlc2hUb2tlblN1YmplY3QubmV4dChudWxsKTtcblxuICAgIC8vIFdIWTogQWx3YXlzIHJlZnJlc2ggdmlhIHRoZSBjb3JlIGNsaWVudC5cbiAgICAvLyAtIEVuc3VyZXMgYXV0aFBhdGhQcmVmaXggKyBkZWZhdWx0IGVuZHBvaW50cyBhcmUgYXBwbGllZCBjb25zaXN0ZW50bHkgKGZpeGVzIC9yZWZyZXNoIHZzIC9hdXRoL3JlZnJlc2gpLlxuICAgIC8vIC0gQ2VudHJhbGl6ZXMgQ1NSRiArIGNyZWRlbnRpYWxzIGhhbmRsaW5nIGluIG9uZSBwbGFjZS5cbiAgICBjb25zdCByZWZyZXNoUmVxdWVzdCQgPSBmcm9tKGF1dGhTZXJ2aWNlLmdldENsaWVudCgpLnJlZnJlc2hUb2tlbnMoKSk7XG5cbiAgICByZWZyZXNoSW5GbGlnaHQkID0gcmVmcmVzaFJlcXVlc3QkLnBpcGUoXG4gICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIC8vIENvb2tpZXMgbW9kZTogc3VjY2VzcyBpcyBlbm91Z2ggKHRva2VucyBhcmUgaW4gaHR0cE9ubHkgY29va2llcykuXG4gICAgICAgIC8vIEpTT04gbW9kZTogd2UgbmVlZCB0aGUgbmV3IGFjY2VzcyB0b2tlbiB0byByZXRyeSArIHVuYmxvY2sgcXVldWVkIHJlcXVlc3RzLlxuICAgICAgICBjb25zdCBuZXdUb2tlbiA9IHRva2VuRGVsaXZlcnkgPT09ICdqc29uJyA/IHJlc3BvbnNlLmFjY2Vzc1Rva2VuIDogJ3N1Y2Nlc3MnO1xuXG4gICAgICAgIGlmICh0b2tlbkRlbGl2ZXJ5ID09PSAnanNvbicgJiYgKCFuZXdUb2tlbiB8fCBuZXdUb2tlbiA9PT0gJ3N1Y2Nlc3MnKSkge1xuICAgICAgICAgIC8vIFdBUk5JTkc6IFdpdGhvdXQgYW4gYWNjZXNzIHRva2VuIHdlIGNhbm5vdCBzYWZlbHkgcmV0cnkgcmVxdWVzdHMgaW4gSlNPTiBtb2RlLlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9rZW4gcmVmcmVzaCBkaWQgbm90IHJldHVybiBhbiBhY2Nlc3MgdG9rZW4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZnJlc2hUb2tlblN1YmplY3QubmV4dChuZXdUb2tlbiA/PyAnc3VjY2VzcycpO1xuICAgICAgICByZXR1cm4gbmV3VG9rZW4gPz8gJ3N1Y2Nlc3MnO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgcmVmcmVzaFRva2VuU3ViamVjdC5uZXh0KG51bGwpO1xuXG4gICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSBnZXRTdGF0dXNDb2RlKGVycik7XG5cbiAgICAgICAgLy8gUmVmcmVzaCBmYWlsZWQgd2l0aCA0MDEgPT4gc2Vzc2lvbiBleHBpcmVkLlxuICAgICAgICAvLyBDbGVhciAqbG9jYWwqIFNESyBzdGF0ZSBzbyBndWFyZHMvcGFnZXMgZG9uJ3QgdGhpbmsgdGhlIHVzZXIgaXMgc3RpbGwgbG9nZ2VkIGluIGFmdGVyIG5hdmlnYXRpb24vcmVsb2FkLlxuICAgICAgICAvLyBJTVBPUlRBTlQ6IFRoaXMgYWxzbyBjbGVhcnMgY2hhbGxlbmdlIHNlc3Npb25zIGFuZCBPQXV0aCBzdGF0ZSB0byBwcmV2ZW50IGdob3N0IHN0YXRlcy5cbiAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwMSkge1xuICAgICAgICAgIC8vIEJlc3QtZWZmb3J0OiBhbHNvIGNsZWFyIENTUkYgY29va2llIGluIGNvb2tpZXMgbW9kZSAobm9uLWh0dHBPbmx5KS5cbiAgICAgICAgICBpZiAodG9rZW5EZWxpdmVyeSA9PT0gJ2Nvb2tpZXMnKSB7XG4gICAgICAgICAgICBjb25zdCBjc3JmQ29va2llTmFtZSA9IGNvbmZpZy5jc3JmPy5jb29raWVOYW1lID8/ICduYXV0aF9jc3JmX3Rva2VuJztcbiAgICAgICAgICAgIGNsZWFyQ3NyZkNvb2tpZShjb25maWcuYmFzZVVybCwgY3NyZkNvb2tpZU5hbWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmcm9tKGF1dGhTZXJ2aWNlLmdldENsaWVudCgpLmNsZWFyTG9jYWxBdXRoU3RhdGUoKSkucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIENhbGwgb25TZXNzaW9uRXhwaXJlZCBjYWxsYmFjayBpZiBjb25maWd1cmVkXG4gICAgICAgICAgICAgIGNvbmZpZy5vblNlc3Npb25FeHBpcmVkPy4oKTtcblxuICAgICAgICAgICAgICBpZiAoY29uZmlnLnJlZGlyZWN0cz8uc2Vzc2lvbkV4cGlyZWQpIHtcbiAgICAgICAgICAgICAgICByb3V0ZXIubmF2aWdhdGVCeVVybChjb25maWcucmVkaXJlY3RzLnNlc3Npb25FeHBpcmVkKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgbmF2aWdhdGlvbiBlcnJvcnNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnIpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycik7XG4gICAgICB9KSxcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgaXNSZWZyZXNoaW5nID0gZmFsc2U7XG4gICAgICAgIHJlZnJlc2hJbkZsaWdodCQgPSBudWxsO1xuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiBmYWxzZSB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlZnJlc2hJbkZsaWdodCQ7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcmUtcmVxdWVzdCBnYXRpbmc6IGJsb2NrIHJlcXVlc3RzIHdoaWxlIHJlZnJlc2ggaXMgaW4tZmxpZ2h0XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gV0hZOiBQcmV2ZW50IG11bHRpcGxlIHJlcXVlc3RzIGZyb20gaGl0dGluZyB0aGUgYmFja2VuZCB3aXRoIGFuIGV4cGlyZWQgdG9rZW4gYW5kIHJldHVybmluZyA0MDEuXG4gIC8vIFdlIHF1ZXVlIGFsbCBhdXRoIEFQSSBjYWxscyBkdXJpbmcgcmVmcmVzaCBhbmQgcmVsZWFzZSB0aGVtIG9uY2UgcmVmcmVzaCBzdWNjZWVkcy5cbiAgaWYgKHNob3VsZEludGVyY2VwdCAmJiBpc1JlZnJlc2hpbmcgJiYgcmVmcmVzaEluRmxpZ2h0JCkge1xuICAgIHJldHVybiByZWZyZXNoSW5GbGlnaHQkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHRva2VuKSA9PiB7XG4gICAgICAgIGNvbnN0IGdhdGVkUmVxID0gYnVpbGRSZXRyeVJlcXVlc3QoYXV0aFJlcSwgdG9rZW5EZWxpdmVyeSwgdG9rZW4sIGNvbmZpZy5jc3JmKTtcbiAgICAgICAgcmV0dXJuIG5leHQoZ2F0ZWRSZXEpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBhdHRhY2hKc29uQXV0aCQucGlwZShcbiAgICBzd2l0Y2hNYXAoKHJlcXVlc3RXaXRoQXV0aCkgPT5cbiAgICAgIG5leHQocmVxdWVzdFdpdGhBdXRoKS5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgIGNvbnN0IHNob3VsZEhhbmRsZSA9XG4gICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlICYmIGVycm9yLnN0YXR1cyA9PT0gNDAxICYmIHNob3VsZEludGVyY2VwdCAmJiAhcmV0cmllZFJlcXVlc3RzLmhhcyhyZXEpO1xuXG4gICAgICAgICAgaWYgKCFzaG91bGRIYW5kbGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXRyaWVkUmVxdWVzdHMuYWRkKHJlcSk7XG5cbiAgICAgICAgICByZXR1cm4gZ2V0T3JTdGFydFJlZnJlc2gkKCkucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgodG9rZW4pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcmV0cnlSZXEgPSBidWlsZFJldHJ5UmVxdWVzdChyZXF1ZXN0V2l0aEF1dGgsIHRva2VuRGVsaXZlcnksIHRva2VuLCBjb25maWcuY3NyZik7XG4gICAgICAgICAgICAgIHJldHJpZWRSZXF1ZXN0cy5hZGQocmV0cnlSZXEpO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dChyZXRyeVJlcSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcbn1cbiJdfQ==
@@ -695,11 +695,12 @@ export class AuthService {
695
695
  /**
696
696
  * Get MFA devices for the current user.
697
697
  *
698
- * @returns Promise of MFA devices array
698
+ * @returns Promise of MFA devices response
699
699
  *
700
700
  * @example
701
701
  * ```typescript
702
- * const devices = await this.auth.getMfaDevices();
702
+ * const result = await this.auth.getMfaDevices();
703
+ * console.log('Devices:', result.devices);
703
704
  * ```
704
705
  */
705
706
  async getMfaDevices() {
@@ -708,12 +709,19 @@ export class AuthService {
708
709
  /**
709
710
  * Setup MFA device (authenticated user).
710
711
  *
712
+ * Returns method-specific setup information:
713
+ * - TOTP: { secret, qrCode, manualEntryKey }
714
+ * - SMS: { maskedPhone } or { deviceId, autoCompleted: true }
715
+ * - Email: { maskedEmail } or { deviceId, autoCompleted: true }
716
+ * - Passkey: WebAuthn registration options
717
+ *
711
718
  * @param method - MFA method to set up
712
- * @returns Promise of setup data
719
+ * @returns Promise of setup data response
713
720
  *
714
721
  * @example
715
722
  * ```typescript
716
- * const setupData = await this.auth.setupMfaDevice('totp');
723
+ * const result = await this.auth.setupMfaDevice('totp');
724
+ * console.log('QR Code:', result.setupData.qrCode);
717
725
  * ```
718
726
  */
719
727
  async setupMfaDevice(method) {
@@ -722,14 +730,63 @@ export class AuthService {
722
730
  /**
723
731
  * Verify MFA setup (authenticated user).
724
732
  *
725
- * @param method - MFA method
726
- * @param setupData - Setup data from setupMfaDevice
727
- * @param deviceName - Optional device name
728
- * @returns Promise with device ID
733
+ * Completes MFA device setup by verifying the setup data. The structure of `setupData` varies by method:
729
734
  *
730
- * @example
735
+ * **TOTP:**
736
+ * - Requires both `secret` (from `getSetupData()` response) and `code` (from authenticator app)
737
+ * - Example: `{ secret: 'JBSWY3DPEHPK3PXP', code: '123456' }`
738
+ *
739
+ * **SMS:**
740
+ * - Requires `phoneNumber` and `code` (verification code sent to phone)
741
+ * - Example: `{ phoneNumber: '+1234567890', code: '123456' }`
742
+ *
743
+ * **Email:**
744
+ * - Requires `code` (verification code sent to email)
745
+ * - Example: `{ code: '123456' }`
746
+ *
747
+ * **Passkey:**
748
+ * - Requires `credential` (WebAuthn credential from registration) and `expectedChallenge`
749
+ * - Example: `{ credential: {...}, expectedChallenge: '...' }`
750
+ *
751
+ * @param method - MFA method ('totp', 'sms', 'email', 'passkey')
752
+ * @param setupData - Method-specific setup verification data
753
+ * @param deviceName - Optional device name (can also be included in setupData for some methods)
754
+ * @returns Promise with device ID of the created MFA device
755
+ *
756
+ * @example TOTP Setup
731
757
  * ```typescript
732
- * const result = await this.auth.verifyMfaSetup('totp', { code: '123456' }, 'My Phone');
758
+ * // Step 1: Get setup data
759
+ * const setupData = await this.auth.setupMfaDevice('totp');
760
+ * // Returns: { setupData: { secret: 'JBSWY3DPEHPK3PXP', qrCode: '...', ... } }
761
+ *
762
+ * // Step 2: User scans QR code and enters code from authenticator app
763
+ * const code = '123456'; // From authenticator app
764
+ *
765
+ * // Step 3: Verify setup (requires both secret and code)
766
+ * const result = await this.auth.verifyMfaSetup('totp', {
767
+ * secret: setupData.setupData.secret,
768
+ * code: code,
769
+ * }, 'Google Authenticator');
770
+ * // Returns: { deviceId: 123 }
771
+ * ```
772
+ *
773
+ * @example SMS Setup
774
+ * ```typescript
775
+ * const result = await this.auth.verifyMfaSetup('sms', {
776
+ * phoneNumber: '+1234567890', // Phone number receiving the code
777
+ * code: '123456', // Code sent to phone
778
+ * }, 'My iPhone');
779
+ * ```
780
+ *
781
+ * @example Passkey Setup
782
+ * ```typescript
783
+ * const credential = await navigator.credentials.create({
784
+ * publicKey: setupData.setupData.options
785
+ * });
786
+ * const result = await this.auth.verifyMfaSetup('passkey', {
787
+ * credential: credential,
788
+ * expectedChallenge: setupData.setupData.challenge,
789
+ * }, 'MacBook Pro');
733
790
  * ```
734
791
  */
735
792
  async verifyMfaSetup(method, setupData, deviceName) {
@@ -1067,4 +1124,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1067
1124
  }] }, { type: i3.RecaptchaService, decorators: [{
1068
1125
  type: Optional
1069
1126
  }] }] });
1070
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcvQyxPQUFPLEVBQ0wsV0FBVyxHQXNCWixNQUFNLHVCQUF1QixDQUFDOzs7OztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBa0JBO0lBQ0E7SUFsQkwsTUFBTSxDQUFjO0lBQ3BCLE1BQU0sQ0FBb0I7SUFDMUIsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQWtCLElBQUksQ0FBQyxDQUFDO0lBQ2hFLHNCQUFzQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQzdELGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUNsRSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO0lBQ3RELFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFNUI7Ozs7O09BS0c7SUFDSCxZQUMrQixNQUF5QixFQUN0RCxXQUErQixFQUNYLE1BQWUsRUFDZixnQkFBbUM7UUFEbkMsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUNmLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBbUI7UUFFdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFckIscURBQXFEO1FBQ3JELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLElB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QUNuQixJQUFJLENBQUMsTUFDTixDQUFDLFNBQVMsQ0FBQztRQUVaLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDOUIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELDBFQUEwRTtRQUMxRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCx5REFBeUQ7UUFDekQsSUFBSSxlQUFlLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxlQUFlLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEUsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELHdDQUF3QztRQUN4QyxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4QiwyQ0FBMkM7WUFDM0Msa0NBQWtDO1lBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsbURBQW1ELEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDekUsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7d0dBOWxDVSxXQUFXLGtCQWdCWixtQkFBbUI7NEdBaEJsQixXQUFXOzs0RkFBWCxXQUFXO2tCQUR2QixVQUFVOzswQkFpQk4sTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUUxQixRQUFROzswQkFDUixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTkFVVEhfQ0xJRU5UX0NPTkZJRyB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IEFuZ3VsYXJIdHRwQWRhcHRlciB9IGZyb20gJy4vaHR0cC1hZGFwdGVyJztcbmltcG9ydCB7IFJlY2FwdGNoYVNlcnZpY2UgfSBmcm9tICcuLi9saWIvcmVjYXB0Y2hhLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTkF1dGhDbGllbnQsXG4gIE5BdXRoQ2xpZW50Q29uZmlnLFxuICBBdXRoUmVzcG9uc2VDb250ZXh0LFxuICBDaGFsbGVuZ2VSZXNwb25zZSxcbiAgQXV0aFJlc3BvbnNlLFxuICBUb2tlblJlc3BvbnNlLFxuICBBdXRoVXNlcixcbiAgQ29uZmlybUZvcmdvdFBhc3N3b3JkUmVzcG9uc2UsXG4gIEZvcmdvdFBhc3N3b3JkUmVzcG9uc2UsXG4gIFJlc2V0UGFzc3dvcmRXaXRoQ29kZVJlc3BvbnNlLFxuICBVcGRhdGVQcm9maWxlUmVxdWVzdCxcbiAgR2V0Q2hhbGxlbmdlRGF0YVJlc3BvbnNlLFxuICBHZXRTZXR1cERhdGFSZXNwb25zZSxcbiAgTUZBU3RhdHVzLFxuICBNRkFEZXZpY2UsXG4gIEF1dGhFdmVudCxcbiAgU29jaWFsUHJvdmlkZXIsXG4gIFNvY2lhbExvZ2luT3B0aW9ucyxcbiAgTGlua2VkQWNjb3VudHNSZXNwb25zZSxcbiAgU29jaWFsVmVyaWZ5UmVxdWVzdCxcbiAgQXVkaXRIaXN0b3J5UmVzcG9uc2UsXG4gIEFkbWluT3BlcmF0aW9ucyxcbn0gZnJvbSAnQG5hdXRoLXRvb2xraXQvY2xpZW50JztcblxuLyoqXG4gKiBBbmd1bGFyIHdyYXBwZXIgYXJvdW5kIE5BdXRoQ2xpZW50IHRoYXQgcHJvdmlkZXMgcHJvbWlzZS1iYXNlZCBhdXRoIG1ldGhvZHMgYW5kIHJlYWN0aXZlIHN0YXRlLlxuICpcbiAqIFRoaXMgc2VydmljZSBwcm92aWRlczpcbiAqIC0gUmVhY3RpdmUgc3RhdGUgKGN1cnJlbnRVc2VyJCwgaXNBdXRoZW50aWNhdGVkJCwgY2hhbGxlbmdlJClcbiAqIC0gQWxsIGNvcmUgYXV0aCBtZXRob2RzIGFzIFByb21pc2VzIChsb2dpbiwgc2lnbnVwLCBsb2dvdXQsIHJlZnJlc2gpXG4gKiAtIFByb2ZpbGUgbWFuYWdlbWVudCAoZ2V0UHJvZmlsZSwgdXBkYXRlUHJvZmlsZSwgY2hhbmdlUGFzc3dvcmQpXG4gKiAtIENoYWxsZW5nZSBmbG93IG1ldGhvZHMgKHJlc3BvbmRUb0NoYWxsZW5nZSwgcmVzZW5kQ29kZSlcbiAqIC0gTUZBIG1hbmFnZW1lbnQgKGdldE1mYVN0YXR1cywgc2V0dXBNZmFEZXZpY2UsIGV0Yy4pXG4gKiAtIFNvY2lhbCBhdXRoZW50aWNhdGlvbiBhbmQgYWNjb3VudCBsaW5raW5nXG4gKiAtIERldmljZSB0cnVzdCBtYW5hZ2VtZW50XG4gKiAtIEF1ZGl0IGhpc3RvcnlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3RydWN0b3IocHJpdmF0ZSBhdXRoOiBBdXRoU2VydmljZSkge31cbiAqXG4gKiAvLyBSZWFjdGl2ZSBzdGF0ZVxuICogdGhpcy5hdXRoLmN1cnJlbnRVc2VyJC5zdWJzY3JpYmUodXNlciA9PiAuLi4pO1xuICogdGhpcy5hdXRoLmlzQXV0aGVudGljYXRlZCQuc3Vic2NyaWJlKGlzQXV0aCA9PiAuLi4pO1xuICpcbiAqIC8vIEF1dGggb3BlcmF0aW9ucyB3aXRoIGFzeW5jL2F3YWl0XG4gKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5sb2dpbihlbWFpbCwgcGFzc3dvcmQpO1xuICpcbiAqIC8vIFByb2ZpbGUgbWFuYWdlbWVudFxuICogYXdhaXQgdGhpcy5hdXRoLmNoYW5nZVBhc3N3b3JkKG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCk7XG4gKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLnVwZGF0ZVByb2ZpbGUoeyBmaXJzdE5hbWU6ICdKb2huJyB9KTtcbiAqXG4gKiAvLyBNRkEgb3BlcmF0aW9uc1xuICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYVN0YXR1cygpO1xuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBOQXV0aENsaWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IE5BdXRoQ2xpZW50Q29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRVc2VyU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aFVzZXIgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc0F1dGhlbnRpY2F0ZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbGxlbmdlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aFJlc3BvbnNlIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0aEV2ZW50c1N1YmplY3QgPSBuZXcgU3ViamVjdDxBdXRoRXZlbnQ+KCk7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogQHBhcmFtIGNvbmZpZyAtIEluamVjdGVkIGNsaWVudCBjb25maWd1cmF0aW9uIChyZXF1aXJlZClcbiAgICogQHBhcmFtIGh0dHBBZGFwdGVyIC0gQW5ndWxhciBIVFRQIGFkYXB0ZXIgZm9yIG1ha2luZyByZXF1ZXN0cyAocmVxdWlyZWQpXG4gICAqIEBwYXJhbSByb3V0ZXIgLSBBbmd1bGFyIFJvdXRlciAob3B0aW9uYWwsIGF1dG9tYXRpY2FsbHkgdXNlZCBmb3IgbmF2aWdhdGlvbiBpZiBhdmFpbGFibGUpXG4gICAqIEBwYXJhbSByZWNhcHRjaGFTZXJ2aWNlIC0gUmVjYXB0Y2hhU2VydmljZSAob3B0aW9uYWwsIGZvciBhdXRvbWF0aWMgdG9rZW4gZ2VuZXJhdGlvbilcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTkFVVEhfQ0xJRU5UX0NPTkZJRykgY29uZmlnOiBOQXV0aENsaWVudENvbmZpZyxcbiAgICBodHRwQWRhcHRlcjogQW5ndWxhckh0dHBBZGFwdGVyLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcm91dGVyPzogUm91dGVyLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVjYXB0Y2hhU2VydmljZT86IFJlY2FwdGNoYVNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGh0dHBBZGFwdGVyIChmcm9tIGNvbmZpZyBvciBpbmplY3RlZClcbiAgICBjb25zdCBhZGFwdGVyID0gY29uZmlnLmh0dHBBZGFwdGVyID8/IGh0dHBBZGFwdGVyO1xuICAgIGlmICghYWRhcHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSHR0cEFkYXB0ZXIgbm90IGZvdW5kLiBFaXRoZXIgcHJvdmlkZSBodHRwQWRhcHRlciBpbiBOQVVUSF9DTElFTlRfQ09ORklHIG9yIGVuc3VyZSBIdHRwQ2xpZW50IGlzIGF2YWlsYWJsZS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQXV0b21hdGljIEFuZ3VsYXIgUm91dGVyIGludGVncmF0aW9uXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIElmIFJvdXRlciBpcyBhdmFpbGFibGUgYW5kIG5vIGN1c3RvbSBuYXZpZ2F0aW9uSGFuZGxlciBpcyBwcm92aWRlZCxcbiAgICAvLyBhdXRvbWF0aWNhbGx5IHVzZSBBbmd1bGFyIFJvdXRlcidzIG5hdmlnYXRlQnlVcmwoKSB0byBwcmV2ZW50IHBhZ2UgcmVmcmVzaGVzXG4gICAgY29uc3QgbmF2aWdhdGlvbkhhbmRsZXIgPVxuICAgICAgY29uZmlnLm5hdmlnYXRpb25IYW5kbGVyID8/XG4gICAgICAodGhpcy5yb3V0ZXJcbiAgICAgICAgPyBhc3luYyAodXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucm91dGVyIS5uYXZpZ2F0ZUJ5VXJsKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gSU1QT1JUQU5UOiBDaGFsbGVuZ2Utc3RhdGUgaHlkcmF0aW9uIEJFRk9SRSBuYXZpZ2F0aW9uIChBbmd1bGFyIGd1YXJkIHNhZmV0eSlcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gV0hZOiBgTkF1dGhDbGllbnQubG9naW4oKWAgYXV0by1uYXZpZ2F0ZXMgdmlhIENoYWxsZW5nZVJvdXRlciAqYmVmb3JlKiByZXR1cm5pbmcuXG4gICAgLy8gVGhlIEFuZ3VsYXIgc2FtcGxlIGFwcCB1c2VzIGEgc3luY2hyb25vdXMgZ3VhcmQgKGBjaGFsbGVuZ2VSb3V0ZUd1YXJkYCkgdGhhdFxuICAgIC8vIHJlYWRzIHRoZSBjdXJyZW50IGNoYWxsZW5nZSB2aWEgYEF1dGhTZXJ2aWNlLmdldEN1cnJlbnRDaGFsbGVuZ2UoKWAgKGJhY2tlZCBieVxuICAgIC8vIGBjaGFsbGVuZ2VTdWJqZWN0LnZhbHVlYCkuIElmIG5hdmlnYXRpb24gaGFwcGVucyBiZWZvcmUgYGNoYWxsZW5nZVN1YmplY3RgIGlzXG4gICAgLy8gdXBkYXRlZCwgdGhlIGd1YXJkIGluY29ycmVjdGx5IHJlZGlyZWN0cyBiYWNrIHRvIGAvbG9naW5gLlxuICAgIC8vXG4gICAgLy8gRml4OiBpbnRlcmNlcHQgdGhlIFNESydzIGF1dG8tbmF2aWdhdGlvbiBob29rIChgb25BdXRoUmVzcG9uc2VgKSwgcHVibGlzaCB0aGVcbiAgICAvLyBjaGFsbGVuZ2Ugc3RhdGUgaW1tZWRpYXRlbHksIHRoZW4gcGVyZm9ybSBkZWZhdWx0IG5hdmlnYXRpb24gKG9yIGRlbGVnYXRlIHRvXG4gICAgLy8gdGhlIHVzZXIncyBjdXN0b20gYG9uQXV0aFJlc3BvbnNlYCBpZiBwcm92aWRlZCkuXG4gICAgY29uc3QgdXNlck9uQXV0aFJlc3BvbnNlID0gY29uZmlnLm9uQXV0aFJlc3BvbnNlO1xuXG4gICAgdGhpcy5jbGllbnQgPSBuZXcgTkF1dGhDbGllbnQoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgaHR0cEFkYXB0ZXI6IGFkYXB0ZXIsXG4gICAgICBuYXZpZ2F0aW9uSGFuZGxlcixcbiAgICAgIG9uQXV0aFJlc3BvbnNlOiBhc3luYyAocmVzcG9uc2U6IEF1dGhSZXNwb25zZSwgY29udGV4dDogQXV0aFJlc3BvbnNlQ29udGV4dCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAvLyBFbnN1cmUgZ3VhcmRzIGNhbiBzeW5jaHJvbm91c2x5IHNlZSB0aGUgYWN0aXZlIGNoYWxsZW5nZSBiZWZvcmUgbmF2aWdhdGlvbi5cbiAgICAgICAgdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXNwb25zZSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIGNvbnN1bWVyIHByb3ZpZGVkIHRoZWlyIG93biBoYW5kbGVyLCBsZXQgdGhlbSB0YWtlIGZ1bGwgY29udHJvbC5cbiAgICAgICAgaWYgKHVzZXJPbkF1dGhSZXNwb25zZSkge1xuICAgICAgICAgIGF3YWl0IHVzZXJPbkF1dGhSZXNwb25zZShyZXNwb25zZSwgY29udGV4dCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdCBuYXZpZ2F0aW9uIGJlaGF2aW9yIChtYXRjaGVzIENoYWxsZW5nZVJvdXRlci5oYW5kbGVBdXRoUmVzcG9uc2UpXG4gICAgICAgIGNvbnN0IHJvdXRlciA9IHRoaXMuY2xpZW50LmdldENoYWxsZW5nZVJvdXRlcigpO1xuICAgICAgICBpZiAocmVzcG9uc2UuY2hhbGxlbmdlTmFtZSkge1xuICAgICAgICAgIGF3YWl0IHJvdXRlci5uYXZpZ2F0ZVRvQ2hhbGxlbmdlKHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmVmZXIgYXBwU3RhdGUgcHJvdmlkZWQgdmlhIGNvbnRleHQgKHNvY2lhbCByZWRpcmVjdCBndWFyZCAvIGV4Y2hhbmdlIGZsb3cpLlxuICAgICAgICAvLyBJTVBPUlRBTlQ6IERvIG5vdCBjb25zdW1lL2NsZWFyIHBlcnNpc3RlZCBPQXV0aCBzdGF0ZSBoZXJlOyBsZWF2ZSBpdCBhdmFpbGFibGVcbiAgICAgICAgLy8gZm9yIGNvbnN1bWVycyB2aWEgZ2V0TGFzdE9hdXRoU3RhdGUoKS5cbiAgICAgICAgYXdhaXQgcm91dGVyLm5hdmlnYXRlVG9TdWNjZXNzKGNvbnRleHQuYXBwU3RhdGUgPyB7IGFwcFN0YXRlOiBjb250ZXh0LmFwcFN0YXRlIH0gOiB1bmRlZmluZWQsIGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIG9uQXV0aFN0YXRlQ2hhbmdlOiAodXNlcjogQXV0aFVzZXIgfCBudWxsKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQodXNlcik7XG4gICAgICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KEJvb2xlYW4odXNlcikpO1xuICAgICAgICBjb25maWcub25BdXRoU3RhdGVDaGFuZ2U/Lih1c2VyKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBGb3J3YXJkIGFsbCBjbGllbnQgZXZlbnRzIHRvIE9ic2VydmFibGUgc3RyZWFtXG4gICAgdGhpcy5jbGllbnQub24oJyonLCAoZXZlbnQ6IEF1dGhFdmVudCkgPT4ge1xuICAgICAgdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5uZXh0KGV2ZW50KTtcbiAgICB9KTtcblxuICAgIC8vIEF1dG8taW5pdGlhbGl6ZSBvbiBjb25zdHJ1Y3Rpb24gKGh5ZHJhdGUgZnJvbSBzdG9yYWdlKVxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSZWFjdGl2ZSBTdGF0ZSBPYnNlcnZhYmxlc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdXNlciBvYnNlcnZhYmxlLlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRVc2VyJCgpOiBPYnNlcnZhYmxlPEF1dGhVc2VyIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGVkIHN0YXRlIG9ic2VydmFibGUuXG4gICAqL1xuICBnZXQgaXNBdXRoZW50aWNhdGVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgY2hhbGxlbmdlIG9ic2VydmFibGUgKGZvciByZWFjdGl2ZSBjaGFsbGVuZ2UgbmF2aWdhdGlvbikuXG4gICAqL1xuICBnZXQgY2hhbGxlbmdlJCgpOiBPYnNlcnZhYmxlPEF1dGhSZXNwb25zZSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFsbGVuZ2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIGFsbCBhdXRoIGxpZmVjeWNsZSBldmVudHMgZm9yIGN1c3RvbSBsb2dpYywgYW5hbHl0aWNzLCBvciBVSSB1cGRhdGVzLlxuICAgKi9cbiAgZ2V0IGF1dGhFdmVudHMkKCk6IE9ic2VydmFibGU8QXV0aEV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aEV2ZW50c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbiBldmVudHMgc3RyZWFtLlxuICAgKiBFbWl0cyB3aGVuIHVzZXIgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZXMgKGxvZ2luLCBzaWdudXAsIHNvY2lhbCBhdXRoKS5cbiAgICovXG4gIGdldCBhdXRoU3VjY2VzcyQoKTogT2JzZXJ2YWJsZTxBdXRoRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5waXBlKGZpbHRlcigoZSkgPT4gZS50eXBlID09PSAnYXV0aDpzdWNjZXNzJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIGVycm9yIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIHdoZW4gYXV0aGVudGljYXRpb24gZmFpbHMgKGxvZ2luIGVycm9yLCBPQXV0aCBlcnJvciwgZXRjLikuXG4gICAqL1xuICBnZXQgYXV0aEVycm9yJCgpOiBPYnNlcnZhYmxlPEF1dGhFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhFdmVudHNTdWJqZWN0LnBpcGUoZmlsdGVyKChlKSA9PiBlLnR5cGUgPT09ICdhdXRoOmVycm9yJyB8fCBlLnR5cGUgPT09ICdvYXV0aDplcnJvcicpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU3luYyBTdGF0ZSBBY2Nlc3NvcnMgKGZvciBndWFyZHMsIHRlbXBsYXRlcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhdXRoZW50aWNhdGVkIChzeW5jLCB1c2VzIGNhY2hlZCBzdGF0ZSkuXG4gICAqL1xuICBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmlzQXV0aGVudGljYXRlZFN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIChzeW5jLCB1c2VzIGNhY2hlZCBzdGF0ZSkuXG4gICAqL1xuICBnZXRDdXJyZW50VXNlcigpOiBBdXRoVXNlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDdXJyZW50VXNlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGNoYWxsZW5nZSAoc3luYykuXG4gICAqL1xuICBnZXRDdXJyZW50Q2hhbGxlbmdlKCk6IEF1dGhSZXNwb25zZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNoYWxsZW5nZVN1YmplY3QudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNoYWxsZW5nZSByb3V0ZXIgZm9yIG1hbnVhbCBuYXZpZ2F0aW9uIGNvbnRyb2wuXG4gICAqIFVzZWZ1bCBmb3IgZ3VhcmRzIHRoYXQgbmVlZCB0byBoYW5kbGUgZXJyb3JzIG9yIGJ1aWxkIGN1c3RvbSBVUkxzLlxuICAgKlxuICAgKiBAcmV0dXJucyBDaGFsbGVuZ2VSb3V0ZXIgaW5zdGFuY2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByb3V0ZXIgPSB0aGlzLmF1dGguZ2V0Q2hhbGxlbmdlUm91dGVyKCk7XG4gICAqIGF3YWl0IHJvdXRlci5uYXZpZ2F0ZVRvRXJyb3IoJ29hdXRoJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2hhbGxlbmdlUm91dGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDaGFsbGVuZ2VSb3V0ZXIoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29yZSBBdXRoIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBMb2dpbiB3aXRoIGlkZW50aWZpZXIgYW5kIHBhc3N3b3JkLlxuICAgKlxuICAgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyByZUNBUFRDSEEgdG9rZW4gaWYgY29uZmlndXJlZCAodjMgb25seSkuXG4gICAqIEZvciB2MiBtYW51YWwgbW9kZSwgcGFzcyB0aGUgdG9rZW4gZXhwbGljaXRseS5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGVtYWlsIG9yIHVzZXJuYW1lXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIFVzZXIgcGFzc3dvcmRcbiAgICogQHBhcmFtIHJlY2FwdGNoYVRva2VuIC0gT3B0aW9uYWwgcmVDQVBUQ0hBIHRva2VuIChmb3IgdjIgbWFudWFsIG1vZGUgb3Igd2hlbiBhdXRvLWdlbmVyYXRpb24gaXMgZGlzYWJsZWQpXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBhdXRoIHJlc3BvbnNlIG9yIGNoYWxsZW5nZVxuICAgKlxuICAgKiBAZXhhbXBsZSBCYXNpYyBMb2dpblxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmxvZ2luKCd1c2VyQGV4YW1wbGUuY29tJywgJ3Bhc3N3b3JkJyk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZSBXaXRoIE1hbnVhbCByZUNBUFRDSEEgKHYyKVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmxvZ2luKCd1c2VyQGV4YW1wbGUuY29tJywgJ3Bhc3N3b3JkJywgcmVjYXB0Y2hhVG9rZW4pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvZ2luKGlkZW50aWZpZXI6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZywgcmVjYXB0Y2hhVG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRSZWNhcHRjaGFUb2tlbihyZWNhcHRjaGFUb2tlbiwgJ2xvZ2luJyk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQubG9naW4oaWRlbnRpZmllciwgcGFzc3dvcmQsIHRva2VuKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ251cCB3aXRoIGNyZWRlbnRpYWxzLlxuICAgKlxuICAgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyByZUNBUFRDSEEgdG9rZW4gaWYgY29uZmlndXJlZCAodjMgb25seSkuXG4gICAqIEZvciB2MiBtYW51YWwgbW9kZSwgaW5jbHVkZSB0b2tlbiBpbiBwYXlsb2FkLlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZCAtIFNpZ251cCByZXF1ZXN0IHBheWxvYWRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGF1dGggcmVzcG9uc2Ugb3IgY2hhbGxlbmdlXG4gICAqXG4gICAqIEBleGFtcGxlIEJhc2ljIFNpZ251cFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLnNpZ251cCh7XG4gICAqICAgZW1haWw6ICduZXdAZXhhbXBsZS5jb20nLFxuICAgKiAgIHBhc3N3b3JkOiAnU2VjdXJlUGFzczEyMyEnLFxuICAgKiAgIGZpcnN0TmFtZTogJ0pvaG4nLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIFdpdGggTWFudWFsIHJlQ0FQVENIQSAodjIpXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguc2lnbnVwKHtcbiAgICogICBlbWFpbDogJ25ld0BleGFtcGxlLmNvbScsXG4gICAqICAgcGFzc3dvcmQ6ICdTZWN1cmVQYXNzMTIzIScsXG4gICAqICAgcmVjYXB0Y2hhVG9rZW46IHRva2VuLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzaWdudXAocGF5bG9hZDogUGFyYW1ldGVyczxOQXV0aENsaWVudFsnc2lnbnVwJ10+WzBdKTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+IHtcbiAgICAvLyBBdXRvLWdlbmVyYXRlIHJlQ0FQVENIQSB0b2tlbiBmb3IgdjMgaWYgY29uZmlndXJlZCBhbmQgbm90IGFscmVhZHkgcHJvdmlkZWRcbiAgICBjb25zdCBwYXlsb2FkV2l0aFJlY2FwdGNoYSA9IHBheWxvYWQgYXMgeyByZWNhcHRjaGFUb2tlbj86IHN0cmluZyB9O1xuXG4gICAgaWYgKCFwYXlsb2FkV2l0aFJlY2FwdGNoYS5yZWNhcHRjaGFUb2tlbikge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLmdldFJlY2FwdGNoYVRva2VuKHVuZGVmaW5lZCwgJ3NpZ251cCcpO1xuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIHBheWxvYWQgPSB7IC4uLnBheWxvYWQsIHJlY2FwdGNoYVRva2VuOiB0b2tlbiB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnNpZ251cChwYXlsb2FkKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCBjdXJyZW50IHNlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBmb3JnZXREZXZpY2UgLSBJZiB0cnVlLCByZW1vdmVzIGRldmljZSB0cnVzdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5sb2dvdXQoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dvdXQoZm9yZ2V0RGV2aWNlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmxvZ291dChmb3JnZXREZXZpY2UpO1xuICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIC8vIEV4cGxpY2l0bHkgdXBkYXRlIGF1dGggc3RhdGUgYWZ0ZXIgbG9nb3V0XG4gICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dChudWxsKTtcbiAgICB0aGlzLmlzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dChmYWxzZSk7XG5cbiAgICAvLyBDbGVhciBDU1JGIHRva2VuIGNvb2tpZSBpZiBpbiBjb29raWVzIG1vZGVcbiAgICAvLyBOb3RlOiBCYWNrZW5kIHNob3VsZCBjbGVhciBodHRwT25seSBjb29raWVzLCBidXQgd2UgY2xlYXIgbm9uLWh0dHBPbmx5IG9uZXNcbiAgICBpZiAodGhpcy5jb25maWcudG9rZW5EZWxpdmVyeSA9PT0gJ2Nvb2tpZXMnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IGNzcmZDb29raWVOYW1lID0gdGhpcy5jb25maWcuY3NyZj8uY29va2llTmFtZSA/PyAnbmF1dGhfY3NyZl90b2tlbic7XG4gICAgICAvLyBFeHRyYWN0IGRvbWFpbiBmcm9tIGJhc2VVcmwgaWYgcG9zc2libGVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodGhpcy5jb25maWcuYmFzZVVybCk7XG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2NzcmZDb29raWVOYW1lfT07IGV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBVVEM7IHBhdGg9LzsgZG9tYWluPSR7dXJsLmhvc3RuYW1lfWA7XG4gICAgICAgIC8vIEFsc28gdHJ5IHdpdGhvdXQgZG9tYWluIChmb3IgbG9jYWxob3N0KVxuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHtjc3JmQ29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS9gO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGlmIGJhc2VVcmwgcGFyc2luZyBmYWlsc1xuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHtjc3JmQ29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS9gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dvdXQgYWxsIHNlc3Npb25zLlxuICAgKlxuICAgKiBSZXZva2VzIGFsbCBhY3RpdmUgc2Vzc2lvbnMgZm9yIHRoZSBjdXJyZW50IHVzZXIgYWNyb3NzIGFsbCBkZXZpY2VzLlxuICAgKiBPcHRpb25hbGx5IHJldm9rZXMgYWxsIHRydXN0ZWQgZGV2aWNlcyBpZiBmb3JnZXREZXZpY2VzIGlzIHRydWUuXG4gICAqXG4gICAqIEBwYXJhbSBmb3JnZXREZXZpY2VzIC0gSWYgdHJ1ZSwgYWxzbyByZXZva2VzIGFsbCB0cnVzdGVkIGRldmljZXMgKGRlZmF1bHQ6IGZhbHNlKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggbnVtYmVyIG9mIHNlc3Npb25zIHJldm9rZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgubG9nb3V0QWxsKCk7XG4gICAqIGNvbnNvbGUubG9nKGBSZXZva2VkICR7cmVzdWx0LnJldm9rZWRDb3VudH0gc2Vzc2lvbnNgKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dvdXRBbGwoZm9yZ2V0RGV2aWNlcz86IGJvb2xlYW4pOiBQcm9taXNlPHsgcmV2b2tlZENvdW50OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LmxvZ291dEFsbChmb3JnZXREZXZpY2VzKTtcbiAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChudWxsKTtcbiAgICAvLyBFeHBsaWNpdGx5IHVwZGF0ZSBhdXRoIHN0YXRlIGFmdGVyIGxvZ291dFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaCB0b2tlbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBuZXcgdG9rZW5zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW5zID0gYXdhaXQgdGhpcy5hdXRoLnJlZnJlc2goKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8VG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZWZyZXNoVG9rZW5zKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFjY291bnQgUmVjb3ZlcnkgKEZvcmdvdCBQYXNzd29yZClcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGEgcGFzc3dvcmQgcmVzZXQgY29kZSAoZm9yZ290IHBhc3N3b3JkKS5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGVtYWlsLCB1c2VybmFtZSwgb3IgcGhvbmVcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHBhc3N3b3JkIHJlc2V0IHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmZvcmdvdFBhc3N3b3JkKCd1c2VyQGV4YW1wbGUuY29tJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZm9yZ290UGFzc3dvcmQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxGb3Jnb3RQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmZvcmdvdFBhc3N3b3JkKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gYSBwYXNzd29yZCByZXNldCBjb2RlIGFuZCBzZXQgYSBuZXcgcGFzc3dvcmQuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVXNlciBlbWFpbCwgdXNlcm5hbWUsIG9yIHBob25lXG4gICAqIEBwYXJhbSBjb2RlIC0gT25lLXRpbWUgcmVzZXQgY29kZVxuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBOZXcgcGFzc3dvcmRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGNvbmZpcm1hdGlvbiByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5jb25maXJtRm9yZ290UGFzc3dvcmQoJ3VzZXJAZXhhbXBsZS5jb20nLCAnMTIzNDU2JywgJ05ld1Bhc3MxMjMhJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgY29uZmlybUZvcmdvdFBhc3N3b3JkKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgbmV3UGFzc3dvcmQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxDb25maXJtRm9yZ290UGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5jb25maXJtRm9yZ290UGFzc3dvcmQoaWRlbnRpZmllciwgY29kZSwgbmV3UGFzc3dvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHBhc3N3b3JkIHdpdGggY29kZSBvciB0b2tlbiAoZ2VuZXJpYyBtZXRob2QgZm9yIGJvdGggYWRtaW4gYW5kIHVzZXItaW5pdGlhdGVkIHJlc2V0cykuXG4gICAqXG4gICAqIEFjY2VwdHMgZWl0aGVyOlxuICAgKiAtIGNvZGU6IFNob3J0IG51bWVyaWMgY29kZSBmcm9tIGVtYWlsL1NNUyAoNi0xMCBkaWdpdHMpXG4gICAqIC0gdG9rZW46IExvbmcgaGV4IHRva2VuIGZyb20gcmVzZXQgbGluayAoNjQgY2hhcnMpXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVXNlciBpZGVudGlmaWVyIChlbWFpbCwgdXNlcm5hbWUsIHBob25lKVxuICAgKiBAcGFyYW0gY29kZU9yVG9rZW4gLSBWZXJpZmljYXRpb24gY29kZSBPUiB0b2tlbiBmcm9tIGxpbmtcbiAgICogQHBhcmFtIG5ld1Bhc3N3b3JkIC0gTmV3IHBhc3N3b3JkXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBzdWNjZXNzIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gV2l0aCBjb2RlIGZyb20gZW1haWxcbiAgICogYXdhaXQgdGhpcy5hdXRoLnJlc2V0UGFzc3dvcmRXaXRoQ29kZSgndXNlckBleGFtcGxlLmNvbScsICcxMjM0NTYnLCAnTmV3UGFzczEyMyEnKTtcbiAgICpcbiAgICogLy8gV2l0aCB0b2tlbiBmcm9tIGxpbmtcbiAgICogYXdhaXQgdGhpcy5hdXRoLnJlc2V0UGFzc3dvcmRXaXRoQ29kZSgndXNlckBleGFtcGxlLmNvbScsICc2NC1jaGFyLXRva2VuJywgJ05ld1Bhc3MxMjMhJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzZXRQYXNzd29yZFdpdGhDb2RlKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBjb2RlT3JUb2tlbjogc3RyaW5nLFxuICAgIG5ld1Bhc3N3b3JkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8UmVzZXRQYXNzd29yZFdpdGhDb2RlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVzZXRQYXNzd29yZFdpdGhDb2RlKGlkZW50aWZpZXIsIGNvZGVPclRva2VuLCBuZXdQYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHVzZXIgcGFzc3dvcmQgKHJlcXVpcmVzIGN1cnJlbnQgcGFzc3dvcmQpLlxuICAgKlxuICAgKiBAcGFyYW0gb2xkUGFzc3dvcmQgLSBDdXJyZW50IHBhc3N3b3JkXG4gICAqIEBwYXJhbSBuZXdQYXNzd29yZCAtIE5ldyBwYXNzd29yZCAobXVzdCBtZWV0IHJlcXVpcmVtZW50cylcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gcGFzc3dvcmQgaXMgY2hhbmdlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5jaGFuZ2VQYXNzd29yZCgnb2xkUGFzc3dvcmQxMjMnLCAnbmV3U2VjdXJlUGFzc3dvcmQ0NTYhJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgY2hhbmdlUGFzc3dvcmQob2xkUGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5jaGFuZ2VQYXNzd29yZChvbGRQYXNzd29yZCwgbmV3UGFzc3dvcmQpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcm9maWxlIE1hbmFnZW1lbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIHByb2ZpbGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgY3VycmVudCB1c2VyIHByb2ZpbGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLmdldFByb2ZpbGUoKTtcbiAgICogY29uc29sZS5sb2coJ1VzZXIgcHJvZmlsZTonLCB1c2VyKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRQcm9maWxlKCk6IFByb21pc2U8QXV0aFVzZXI+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0UHJvZmlsZSgpO1xuICAgIC8vIFVwZGF0ZSBsb2NhbCBzdGF0ZSB3aGVuIHByb2ZpbGUgaXMgZmV0Y2hlZFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQodXNlcik7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHVzZXIgcHJvZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHVwZGF0ZXMgLSBQcm9maWxlIGZpZWxkcyB0byB1cGRhdGVcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiB1cGRhdGVkIHVzZXIgcHJvZmlsZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGgudXBkYXRlUHJvZmlsZSh7IGZpcnN0TmFtZTogJ0pvaG4nLCBsYXN0TmFtZTogJ0RvZScgfSk7XG4gICAqIGNvbnNvbGUubG9nKCdQcm9maWxlIHVwZGF0ZWQ6JywgdXNlcik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlUHJvZmlsZSh1cGRhdGVzOiBVcGRhdGVQcm9maWxlUmVxdWVzdCk6IFByb21pc2U8QXV0aFVzZXI+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5jbGllbnQudXBkYXRlUHJvZmlsZSh1cGRhdGVzKTtcbiAgICAvLyBVcGRhdGUgbG9jYWwgc3RhdGUgd2hlbiBwcm9maWxlIGlzIHVwZGF0ZWRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgIHJldHVybiB1c2VyO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDaGFsbGVuZ2UgRmxvdyBNZXRob2RzIChFc3NlbnRpYWwgZm9yIGFueSBhdXRoIGZsb3cpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogUmVzcG9uZCB0byBhIGNoYWxsZW5nZSAoVkVSSUZZX0VNQUlMLCBWRVJJRllfUEhPTkUsIE1GQV9SRVFVSVJFRCwgZXRjLikuXG4gICAqXG4gICAqIEBwYXJhbSByZXNwb25zZSAtIENoYWxsZW5nZSByZXNwb25zZSBkYXRhXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBhdXRoIHJlc3BvbnNlIG9yIG5leHQgY2hhbGxlbmdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlc3BvbmRUb0NoYWxsZW5nZSh7XG4gICAqICAgc2Vzc2lvbjogY2hhbGxlbmdlU2Vzc2lvbixcbiAgICogICB0eXBlOiAnVkVSSUZZX0VNQUlMJyxcbiAgICogICBjb2RlOiAnMTIzNDU2JyxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzcG9uZFRvQ2hhbGxlbmdlKHJlc3BvbnNlOiBDaGFsbGVuZ2VSZXNwb25zZSk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQucmVzcG9uZFRvQ2hhbGxlbmdlKHJlc3BvbnNlKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2VuZCBjaGFsbGVuZ2UgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gLSBDaGFsbGVuZ2Ugc2Vzc2lvbiB0b2tlblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggZGVzdGluYXRpb24gaW5mb3JtYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgucmVzZW5kQ29kZShzZXNzaW9uKTtcbiAgICogY29uc29sZS5sb2coJ0NvZGUgc2VudCB0bzonLCByZXN1bHQuZGVzdGluYXRpb24pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc2VuZENvZGUoc2Vzc2lvbjogc3RyaW5nKTogUHJvbWlzZTx7IGRlc3RpbmF0aW9uOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXNlbmRDb2RlKHNlc3Npb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgc2V0dXAgZGF0YSAoZm9yIE1GQV9TRVRVUF9SRVFVSVJFRCBjaGFsbGVuZ2UpLlxuICAgKlxuICAgKiBSZXR1cm5zIG1ldGhvZC1zcGVjaWZpYyBzZXR1cCBpbmZvcm1hdGlvbjpcbiAgICogLSBUT1RQOiB7IHNlY3JldCwgcXJDb2RlLCBtYW51YWxFbnRyeUtleSB9XG4gICAqIC0gU01TOiB7IG1hc2tlZFBob25lIH1cbiAgICogLSBFbWFpbDogeyBtYXNrZWRFbWFpbCB9XG4gICAqIC0gUGFzc2tleTogV2ViQXV0aG4gcmVnaXN0cmF0aW9uIG9wdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gLSBDaGFsbGVuZ2Ugc2Vzc2lvbiB0b2tlblxuICAgKiBAcGFyYW0gbWV0aG9kIC0gTUZBIG1ldGhvZCB0byBzZXQgdXBcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBzZXR1cCBkYXRhIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc2V0dXBEYXRhID0gYXdhaXQgdGhpcy5hdXRoLmdldFNldHVwRGF0YShzZXNzaW9uLCAndG90cCcpO1xuICAgKiBjb25zb2xlLmxvZygnUVIgQ29kZTonLCBzZXR1cERhdGEuc2V0dXBEYXRhLnFyQ29kZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0U2V0dXBEYXRhKHNlc3Npb246IHN0cmluZywgbWV0aG9kOiBzdHJpbmcpOiBQcm9taXNlPEdldFNldHVwRGF0YVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldFNldHVwRGF0YShzZXNzaW9uLCBtZXRob2QgYXMgUGFyYW1ldGVyczxOQXV0aENsaWVudFsnZ2V0U2V0dXBEYXRhJ10+WzFdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIGNoYWxsZW5nZSBkYXRhIChmb3IgTUZBX1JFUVVJUkVEIGNoYWxsZW5nZSAtIGUuZy4sIHBhc3NrZXkgb3B0aW9ucykuXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIC0gQ2hhbGxlbmdlIHNlc3Npb24gdG9rZW5cbiAgICogQHBhcmFtIG1ldGhvZCAtIENoYWxsZW5nZSBtZXRob2RcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBjaGFsbGVuZ2UgZGF0YSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNoYWxsZW5nZURhdGEgPSBhd2FpdCB0aGlzLmF1dGguZ2V0Q2hhbGxlbmdlRGF0YShzZXNzaW9uLCAncGFzc2tleScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldENoYWxsZW5nZURhdGEoc2Vzc2lvbjogc3RyaW5nLCBtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8R2V0Q2hhbGxlbmdlRGF0YVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldENoYWxsZW5nZURhdGEoc2Vzc2lvbiwgbWV0aG9kIGFzIFBhcmFtZXRlcnM8TkF1dGhDbGllbnRbJ2dldENoYWxsZW5nZURhdGEnXT5bMV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHN0b3JlZCBjaGFsbGVuZ2UgKHdoZW4gbmF2aWdhdGluZyBhd2F5IGZyb20gY2hhbGxlbmdlIGZsb3cpLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjaGFsbGVuZ2UgaXMgY2xlYXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5jbGVhckNoYWxsZW5nZSgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNsZWFyQ2hhbGxlbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmNsZWFyU3RvcmVkQ2hhbGxlbmdlKCk7XG4gICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgYWNjZXNzIHRva2VuIChKU09OIG1vZGUgb25seSkuXG4gICAqXG4gICAqIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgY29uc3VtZXJzIHVzaW5nIEFuZ3VsYXIgYEh0dHBDbGllbnRgIGRpcmVjdGx5XG4gICAqIChvdXRzaWRlIG9mIHRoZSBTREsgbWV0aG9kcykgYW5kIHJlbHlpbmcgb24gYW4gaW50ZXJjZXB0b3IgdG8gYXR0YWNoIEJlYXJlciB0b2tlbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIEFjY2VzcyB0b2tlbiwgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLmF1dGguZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRBY2Nlc3NUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuZ2V0QWNjZXNzVG9rZW4oKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU29jaWFsIEF1dGhlbnRpY2F0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pdGlhdGUgc29jaWFsIE9BdXRoIGxvZ2luIGZsb3cuXG4gICAqIFJlZGlyZWN0cyB0aGUgYnJvd3NlciB0byBiYWNrZW5kIGAvYXV0aC9zb2NpYWwvOnByb3ZpZGVyL3JlZGlyZWN0YC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gU29jaWFsIHByb3ZpZGVyICgnZ29vZ2xlJywgJ2FwcGxlJywgJ2ZhY2Vib29rJylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCByZWRpcmVjdCBvcHRpb25zXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHJlZGlyZWN0IHN0YXJ0c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5sb2dpbldpdGhTb2NpYWwoJ2dvb2dsZScsIHsgcmV0dXJuVG86ICcvYXV0aC9jYWxsYmFjaycgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9naW5XaXRoU29jaWFsKHByb3ZpZGVyOiBTb2NpYWxQcm92aWRlciwgb3B0aW9ucz86IFNvY2lhbExvZ2luT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5sb2dpbldpdGhTb2NpYWwocHJvdmlkZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4Y2hhbmdlIGFuIGV4Y2hhbmdlVG9rZW4gKGZyb20gcmVkaXJlY3QgY2FsbGJhY2sgVVJMKSBpbnRvIGFuIEF1dGhSZXNwb25zZS5cbiAgICpcbiAgICogVXNlZCBmb3IgYHRva2VuRGVsaXZlcnk6ICdqc29uJ2Agb3IgaHlicmlkIGZsb3dzIHdoZXJlIHRoZSBiYWNrZW5kIHJlZGlyZWN0cyBiYWNrXG4gICAqIHdpdGggYGV4Y2hhbmdlVG9rZW5gIGluc3RlYWQgb2Ygc2V0dGluZyBjb29raWVzLlxuICAgKlxuICAgKiBAcGFyYW0gZXhjaGFuZ2VUb2tlbiAtIE9uZS10aW1lIGV4Y2hhbmdlIHRva2VuIGZyb20gdGhlIGNhbGxiYWNrIFVSTFxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIEF1dGhSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmV4Y2hhbmdlU29jaWFsUmVkaXJlY3QoZXhjaGFuZ2VUb2tlbik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZXhjaGFuZ2VTb2NpYWxSZWRpcmVjdChleGNoYW5nZVRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LmV4Y2hhbmdlU29jaWFsUmVkaXJlY3QoZXhjaGFuZ2VUb2tlbik7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgbmF0aXZlIHNvY2lhbCB0b2tlbiAobW9iaWxlKS5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgLSBTb2NpYWwgdmVyaWZpY2F0aW9uIHJlcXVlc3Qgd2l0aCBwcm92aWRlciBhbmQgdG9rZW5cbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBBdXRoUmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgudmVyaWZ5TmF0aXZlU29jaWFsKHtcbiAgICogICBwcm92aWRlcjogJ2dvb2dsZScsXG4gICAqICAgaWRUb2tlbjogbmF0aXZlSWRUb2tlbixcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5TmF0aXZlU29jaWFsKHJlcXVlc3Q6IFNvY2lhbFZlcmlmeVJlcXVlc3QpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnZlcmlmeU5hdGl2ZVNvY2lhbChyZXF1ZXN0KTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsaW5rZWQgc29jaWFsIGFjY291bnRzLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGxpbmtlZCBhY2NvdW50cyByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGFjY291bnRzID0gYXdhaXQgdGhpcy5hdXRoLmdldExpbmtlZEFjY291bnRzKCk7XG4gICAqIGNvbnNvbGUubG9nKCdMaW5rZWQgcHJvdmlkZXJzOicsIGFjY291bnRzLnByb3ZpZGVycyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0TGlua2VkQWNjb3VudHMoKTogUHJvbWlzZTxMaW5rZWRBY2NvdW50c1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldExpbmtlZEFjY291bnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogTGluayBzb2NpYWwgYWNjb3VudC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gU29jaWFsIHByb3ZpZGVyIHRvIGxpbmtcbiAgICogQHBhcmFtIGNvZGUgLSBPQXV0aCBhdXRob3JpemF0aW9uIGNvZGVcbiAgICogQHBhcmFtIHN0YXRlIC0gT0F1dGggc3RhdGUgcGFyYW1ldGVyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBzdWNjZXNzIG1lc3NhZ2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgubGlua1NvY2lhbEFjY291bnQoJ2dvb2dsZScsIGNvZGUsIHN0YXRlKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsaW5rU29jaWFsQWNjb3VudChwcm92aWRlcjogc3RyaW5nLCBjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPHsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubGlua1NvY2lhbEFjY291bnQocHJvdmlkZXIsIGNvZGUsIHN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxpbmsgc29jaWFsIGFjY291bnQuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFNvY2lhbCBwcm92aWRlciB0byB1bmxpbmtcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC51bmxpbmtTb2NpYWxBY2NvdW50KCdnb29nbGUnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB1bmxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyOiBzdHJpbmcpOiBQcm9taXNlPHsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQudW5saW5rU29jaWFsQWNjb3VudChwcm92aWRlcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYXN0IE9BdXRoIGFwcFN0YXRlIGZyb20gc29jaWFsIHJlZGlyZWN0IGNhbGxiYWNrLlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBhcHBTdGF0ZSB0aGF0IHdhcyBzdG9yZWQgZHVyaW5nIHRoZSBtb3N0IHJlY2VudCBzb2NpYWxcbiAgICogbG9naW4gcmVkaXJlY3QgY2FsbGJhY2suIFRoaXMgaXMgdXNlZnVsIGZvciByZXN0b3JpbmcgVUkgc3RhdGUsXG4gICAqIGFwcGx5aW5nIGludml0ZSBjb2Rlcywgb3IgdHJhY2tpbmcgcmVmZXJyYWwgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIFRoZSBzdGF0ZSBpcyBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgYWZ0ZXIgcmV0cmlldmFsIHRvIHByZXZlbnQgcmV1c2UuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzdG9yZWQgYXBwU3RhdGUsIG9yIG51bGwgaWYgbm9uZSBleGlzdHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBhcHBTdGF0ZSA9IGF3YWl0IHRoaXMuYXV0aC5nZXRMYXN0T2F1dGhTdGF0ZSgpO1xuICAgKiBpZiAoYXBwU3RhdGUpIHtcbiAgICogICAvLyBBcHBseSBpbnZpdGUgY29kZSBvciByZXN0b3JlIFVJIHN0YXRlXG4gICAqICAgY29uc29sZS5sb2coJ09BdXRoIHN0YXRlOicsIGFwcFN0YXRlKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldExhc3RPYXV0aFN0YXRlKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRMYXN0T2F1dGhTdGF0ZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNRkEgTWFuYWdlbWVudFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgc3RhdHVzIGZvciB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIE1GQSBzdGF0dXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gICAqIGNvbnNvbGUubG9nKCdNRkEgZW5hYmxlZDonLCBzdGF0dXMuZW5hYmxlZCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0TWZhU3RhdHVzKCk6IFByb21pc2U8TUZBU3RhdHVzPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldE1mYVN0YXR1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgZGV2aWNlcyBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBNRkEgZGV2aWNlcyBhcnJheVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGRldmljZXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhRGV2aWNlcygpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldE1mYURldmljZXMoKTogUHJvbWlzZTxNRkFEZXZpY2VbXT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRNZmFEZXZpY2VzKCkgYXMgUHJvbWlzZTxNRkFEZXZpY2VbXT47XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgTUZBIGRldmljZSAoYXV0aGVudGljYXRlZCB1c2VyKS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIE1GQSBtZXRob2QgdG8gc2V0IHVwXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2Ygc2V0dXAgZGF0YVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNldHVwRGF0YSA9IGF3YWl0IHRoaXMuYXV0aC5zZXR1cE1mYURldmljZSgndG90cCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNldHVwTWZhRGV2aWNlKG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNldHVwTWZhRGV2aWNlKG1ldGhvZCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IE1GQSBzZXR1cCAoYXV0aGVudGljYXRlZCB1c2VyKS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIE1GQSBtZXRob2RcbiAgICogQHBhcmFtIHNldHVwRGF0YSAtIFNldHVwIGRhdGEgZnJvbSBzZXR1cE1mYURldmljZVxuICAgKiBAcGFyYW0gZGV2aWNlTmFtZSAtIE9wdGlvbmFsIGRldmljZSBuYW1lXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBkZXZpY2UgSURcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgudmVyaWZ5TWZhU2V0dXAoJ3RvdHAnLCB7IGNvZGU6ICcxMjM0NTYnIH0sICdNeSBQaG9uZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHZlcmlmeU1mYVNldHVwKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHNldHVwRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgZGV2aWNlTmFtZT86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGRldmljZUlkOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC52ZXJpZnlNZmFTZXR1cChtZXRob2QsIHNldHVwRGF0YSwgZGV2aWNlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgc2luZ2xlIE1GQSBkZXZpY2UgYnkgZGV2aWNlIElELlxuICAgKlxuICAgKiAqKlJlY29tbWVuZGVkOioqIFVzZSB0aGlzIGZvciBncmFudWxhciBkZXZpY2UgbWFuYWdlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZUlkIC0gTUZBIGRldmljZSBJRFxuICAgKiBAcmV0dXJucyBSZW1vdmFsIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgZGV2aWNlcyA9IGF3YWl0IHRoaXMuYXV0aC5nZXRNZmFEZXZpY2VzKCk7XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5yZW1vdmVNZmFEZXZpY2VCeUlkKGRldmljZXNbMF0uaWQpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlbW92ZU1mYURldmljZUJ5SWQoZGV2aWNlSWQ6IG51bWJlcik6IFByb21pc2U8aW1wb3J0KCdAbmF1dGgtdG9vbGtpdC9jbGllbnQnKS5SZW1vdmVNRkFEZXZpY2VSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZW1vdmVNZmFEZXZpY2VCeUlkKGRldmljZUlkKTtcbiAgfVxuXG4gIC8qKlxuXG4gIC8qKlxuICAgKiBTZWxlY3QgYW4gTUZBIGRldmljZSBmb3IgdmVyaWZpY2F0aW9uIChkdXJpbmcgY2hhbGxlbmdlIGZsb3cpXG4gICAqXG4gICAqIENhbGwgdGhpcyB3aGVuIHVzZXIgc2VsZWN0cyBhIHNwZWNpZmljIGRldmljZSBmcm9tIHRoZSBNRkEgc2VsZWN0b3IgVUkuXG4gICAqIFNESyBzdG9yZXMgdGhlIGRldmljZUlkIGludGVybmFsbHkgYW5kIGF1dG8taW5qZWN0cyBpdCB3aGVuIHJlc3BvbmRUb0NoYWxsZW5nZSgpIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZUlkIC0gSUQgb2YgdGhlIGRldmljZSB1c2VyIHNlbGVjdGVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVXNlciBjbGlja3MgXCJNaWNyb3NvZnQgQXV0aGVudGljYXRvclwiIGJ1dHRvblxuICAgKiB0aGlzLmF1dGguc2VsZWN0TUZBRGV2aWNlKDQ4KTtcbiAgICpcbiAgICogLy8gTmF2aWdhdGUgdG8gT1RQIHZlcmlmaWNhdGlvbiAobm8gZGV2aWNlSWQgaW4gcXVlcnkgcGFyYW1zIG5lZWRlZCEpXG4gICAqIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2F1dGgvY2hhbGxlbmdlL21mYS1yZXF1aXJlZCddKTtcbiAgICpcbiAgICogLy8gTGF0ZXIsIHdoZW4gc3VibWl0dGluZyBPVFAgY29kZTpcbiAgICogYXdhaXQgdGhpcy5hdXRoLnJlc3BvbmRUb0NoYWxsZW5nZSh7XG4gICAqICAgdHlwZTogJ01GQV9SRVFVSVJFRCcsXG4gICAqICAgc2Vzc2lvbjogJ2FiYzEyMycsXG4gICAqICAgbWV0aG9kOiAndG90cCcsXG4gICAqICAgY29kZTogJzEyMzQ1NicsXG4gICAqICAgLy8gU0RLIGF1dG8taW5qZWN0cyBkZXZpY2VJZD00OCBoZXJlIVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBzZWxlY3RNRkFEZXZpY2UoZGV2aWNlSWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZWxlY3RNRkFEZXZpY2UoZGV2aWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhdmFpbGFibGUgTUZBIGRldmljZXMgZnJvbSBjaGFsbGVuZ2UgcmVzcG9uc2VcbiAgICpcbiAgICogUmV0dXJucyBhcnJheSBvZiBkZXZpY2VzIGZvciBtZXRob2RzIHRoYXQgc3VwcG9ydCBtdWx0aXBsZSBkZXZpY2VzIChUT1RQLCBQYXNza2V5KS5cbiAgICogVXNlIHRoaXMgdG8gcmVuZGVyIGRldmljZSBzZWxlY3Rpb24gVUkgb25seS5cbiAgICpcbiAgICogQHBhcmFtIGNoYWxsZW5nZSAtIENoYWxsZW5nZSByZXNwb25zZSBmcm9tIGxvZ2luL3NpZ251cFxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBNRkEgZGV2aWNlcyB3aXRoIGlkLCBuYW1lLCBhbmQgdHlwZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIEluIE1GQSBzZWxlY3RvciBjb21wb25lbnRcbiAgICogY29uc3QgZGV2aWNlcyA9IHRoaXMuYXV0aC5nZXRNRkFEZXZpY2VzRnJvbUNoYWxsZW5nZSh0aGlzLmNoYWxsZW5nZSgpKTtcbiAgICogLy8gUmV0dXJuczogW1xuICAgKiAvLyAgIHsgaWQ6IDQ4LCBuYW1lOiBcIk1pY3Jvc29mdCBBdXRoZW50aWNhdG9yXCIsIHR5cGU6IFwidG90cFwiIH0sXG4gICAqIC8vICAgeyBpZDogMywgbmFtZTogXCJHb29nbGUgQXV0aGVudGljYXRvclwiLCB0eXBlOiBcInRvdHBcIiB9XG4gICAqIC8vIF1cbiAgICpcbiAgICogLy8gUmVuZGVyIGRldmljZSBidXR0b25zXG4gICAqIGZvciAoY29uc3QgZGV2aWNlIG9mIGRldmljZXMpIHtcbiAgICogICAvLyA8YnV0dG9uIChjbGljayk9XCJzZWxlY3REZXZpY2UoZGV2aWNlKVwiPnt7IGRldmljZS5uYW1lIH19PC9idXR0b24+XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBnZXRNRkFEZXZpY2VzRnJvbUNoYWxsZW5nZShjaGFsbGVuZ2U6IEF1dGhSZXNwb25zZSk6IEFycmF5PHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRNRkFEZXZpY2VzKGNoYWxsZW5nZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYW55IHNlbGVjdGVkIE1GQSBkZXZpY2VcbiAgICpcbiAgICogVXNlZnVsIGlmIHVzZXIgbmF2aWdhdGVzIGJhY2sgdG8gZGV2aWNlIHNlbGVjdG9yIG9yIGNhbmNlbHMgTUZBIGZsb3cuXG4gICAqL1xuICBjbGVhclNlbGVjdGVkTUZBRGV2aWNlKCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5jbGVhclNlbGVjdGVkRGV2aWNlKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHByZWZlcnJlZCBNRkEgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gRGV2aWNlIG1ldGhvZCB0byBzZXQgYXMgcHJlZmVycmVkICgndG90cCcsICdzbXMnLCAnZW1haWwnLCBvciAncGFzc2tleScpXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBzdWNjZXNzIG1lc3NhZ2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguc2V0UHJlZmVycmVkTWZhTWV0aG9kKCd0b3RwJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgLyoqXG4gICAqIFNldCBhIHNwZWNpZmljIE1GQSBkZXZpY2UgYXMgcHJlZmVycmVkLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBNRkEgZGV2aWNlIElEXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBzdWNjZXNzIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIHNldFByZWZlcnJlZE1mYURldmljZShkZXZpY2VJZDogbnVtYmVyKTogUHJvbWlzZTx7IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNldFByZWZlcnJlZE1mYURldmljZShkZXZpY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYmFja3VwIGNvZGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGJhY2t1cCBjb2RlcyBhcnJheVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvZGVzID0gYXdhaXQgdGhpcy5hdXRoLmdlbmVyYXRlQmFja3VwQ29kZXMoKTtcbiAgICogY29uc29sZS5sb2coJ0JhY2t1cCBjb2RlczonLCBjb2Rlcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVCYWNrdXBDb2RlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdlbmVyYXRlQmFja3VwQ29kZXMoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRGV2aWNlIFRydXN0XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogVHJ1c3QgY3VycmVudCBkZXZpY2UuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBkZXZpY2UgdG9rZW5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgudHJ1c3REZXZpY2UoKTtcbiAgICogY29uc29sZS5sb2coJ0RldmljZSB0cnVzdGVkOicsIHJlc3VsdC5kZXZpY2VUb2tlbik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdHJ1c3REZXZpY2UoKTogUHJvbWlzZTx7IGRldmljZVRva2VuOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC50cnVzdERldmljZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBjdXJyZW50IGRldmljZSBpcyB0cnVzdGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1c3RlZCBzdGF0dXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGguaXNUcnVzdGVkRGV2aWNlKCk7XG4gICAqIGlmIChyZXN1bHQudHJ1c3RlZCkge1xuICAgKiAgIGNvbnNvbGUubG9nKCdUaGlzIGRldmljZSBpcyB0cnVzdGVkJyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBpc1RydXN0ZWREZXZpY2UoKTogUHJvbWlzZTx7IHRydXN0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5pc1RydXN0ZWREZXZpY2UoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQXVkaXQgSGlzdG9yeVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCBwYWdpbmF0ZWQgYXVkaXQgaGlzdG9yeSBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFF1ZXJ5IHBhcmFtZXRlcnMgZm9yIGZpbHRlcmluZyBhbmQgcGFnaW5hdGlvblxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGF1ZGl0IGhpc3RvcnkgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBoaXN0b3J5ID0gYXdhaXQgdGhpcy5hdXRoLmdldEF1ZGl0SGlzdG9yeSh7XG4gICAqICAgcGFnZTogMSxcbiAgICogICBsaW1pdDogMjAsXG4gICAqICAgZXZlbnRUeXBlczogWydMT0dJTl9TVUNDRVNTJ10sXG4gICAqICAgZXZlbnRTdGF0dXM6IFsnRkFJTFVSRSddLFxuICAgKiB9KTtcbiAgICogY29uc29sZS5sb2coJ0F1ZGl0IGhpc3Rvcnk6JywgaGlzdG9yeSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0QXVkaXRIaXN0b3J5KFxuICAgIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPj4sXG4gICk6IFByb21pc2U8QXVkaXRIaXN0b3J5UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0QXVkaXRIaXN0b3J5KHBhcmFtcyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVzY2FwZSBIYXRjaFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEV4cG9zZSB1bmRlcmx5aW5nIE5BdXRoQ2xpZW50IGZvciBhZHZhbmNlZCBzY2VuYXJpb3MuXG4gICAqXG5cbiAgICogQHJldHVybnMgVGhlIHVuZGVybHlpbmcgTkF1dGhDbGllbnQgaW5zdGFuY2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBEZXByZWNhdGVkIC0gdXNlIGRpcmVjdCBtZXRob2RzIGluc3RlYWRcbiAgICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldENsaWVudCgpLmdldE1mYVN0YXR1cygpO1xuICAgKlxuICAgKiAvLyBQcmVmZXJyZWQgLSB1c2UgZGlyZWN0IG1ldGhvZHNcbiAgICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYVN0YXR1cygpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldENsaWVudCgpOiBOQXV0aENsaWVudCB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBZG1pbiBPcGVyYXRpb25zXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQWRtaW4gb3BlcmF0aW9ucyAoaWYgZW5hYmxlZCBpbiBjb25maWcpLlxuICAgKlxuICAgKiBQcm92aWRlcyBhZG1pbi1sZXZlbCB1c2VyIG1hbmFnZW1lbnQgbWV0aG9kczpcbiAgICogLSBVc2VyIENSVUQgb3BlcmF0aW9uc1xuICAgKiAtIFBhc3N3b3JkIG1hbmFnZW1lbnRcbiAgICogLSBTZXNzaW9uIG1hbmFnZW1lbnRcbiAgICogLSBNRkEgbWFuYWdlbWVudFxuICAgKiAtIEF1ZGl0IGhpc3RvcnlcbiAgICpcbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgYWRtaW4gd2FzIG5vdCBjb25maWd1cmVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBZG1pbk9wZXJhdGlvbnMgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQ2hlY2sgaWYgYWRtaW4gaXMgYXZhaWxhYmxlXG4gICAqIGlmICh0aGlzLmF1dGguYWRtaW4pIHtcbiAgICogICBjb25zdCB1c2VycyA9IGF3YWl0IHRoaXMuYXV0aC5hZG1pbi5nZXRVc2Vycyh7IHBhZ2U6IDEgfSk7XG4gICAqIH1cbiAgICpcbiAgICogLy8gV2l0aCBvcHRpb25hbCBjaGFpbmluZ1xuICAgKiBhd2FpdCB0aGlzLmF1dGguYWRtaW4/LmRlbGV0ZVVzZXIoc3ViKTtcbiAgICpcbiAgICogLy8gQ3JlYXRlIHVzZXJcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLmFkbWluPy5jcmVhdGVVc2VyKHtcbiAgICogICBlbWFpbDogJ3VzZXJAZXhhbXBsZS5jb20nLFxuICAgKiAgIHBhc3N3b3JkOiAnU2VjdXJlUGFzczEyMyEnLFxuICAgKiAgIGlzRW1haWxWZXJpZmllZDogdHJ1ZSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0IGFkbWluKCk6IEFkbWluT3BlcmF0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmFkbWluO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnRlcm5hbCBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBieSBoeWRyYXRpbmcgc3RhdGUgZnJvbSBzdG9yYWdlLlxuICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBvbiBjb25zdHJ1Y3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmluaXRpYWxpemUoKTtcblxuICAgIC8vIEh5ZHJhdGUgY2hhbGxlbmdlIHN0YXRlXG4gICAgY29uc3Qgc3RvcmVkQ2hhbGxlbmdlID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0U3RvcmVkQ2hhbGxlbmdlKCk7XG4gICAgaWYgKHN0b3JlZENoYWxsZW5nZSkge1xuICAgICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQoc3RvcmVkQ2hhbGxlbmdlKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc3ViamVjdHMgZnJvbSBjbGllbnQgc3RhdGVcbiAgICBjb25zdCB1c2VyID0gdGhpcy5jbGllbnQuZ2V0Q3VycmVudFVzZXIoKTtcbiAgICBpZiAodXNlcikge1xuICAgICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dCh1c2VyKTtcbiAgICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY2hhbGxlbmdlIHN0YXRlIGFmdGVyIGF1dGggcmVzcG9uc2UuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlc3BvbnNlOiBBdXRoUmVzcG9uc2UpOiBBdXRoUmVzcG9uc2Uge1xuICAgIGlmIChyZXNwb25zZS5jaGFsbGVuZ2VOYW1lKSB7XG4gICAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChyZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHJlQ0FQVENIQSBIZWxwZXJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgcmVDQVBUQ0hBIHRva2VuIC0gYXV0by1nZW5lcmF0ZSBmb3IgdjMgb3IgdXNlIHByb3ZpZGVkIHRva2VuLlxuICAgKlxuICAgKiBIYW5kbGVzIHBsYXRmb3JtIGRldGVjdGlvbjpcbiAgICogLSBXZWIgYnJvd3NlcjogR2VuZXJhdGUgdG9rZW4gaWYgZW5hYmxlZCBhbmQgdjNcbiAgICogLSBDYXBhY2l0b3IgbmF0aXZlOiBTa2lwICh1c2UgZGV2aWNlIGF0dGVzdGF0aW9uIGluc3RlYWQpXG4gICAqIC0gU1NSOiBTa2lwXG4gICAqIC0gTWFudWFsIG1vZGUgKHYyIG9yIG1hbnVhbENoYWxsZW5nZT10cnVlKTogUmVxdWlyZXMgZXhwbGljaXQgdG9rZW5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVkVG9rZW4gLSBFeHBsaWNpdGx5IHByb3ZpZGVkIHRva2VuICh2MiBtYW51YWwgbW9kZSlcbiAgICogQHBhcmFtIGFjdGlvbiAtIEFjdGlvbiBuYW1lIGZvciB2MyBhbmFseXRpY3NcbiAgICogQHJldHVybnMgcmVDQVBUQ0hBIHRva2VuIG9yIHVuZGVmaW5lZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRSZWNhcHRjaGFUb2tlbihwcm92aWRlZFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsIGFjdGlvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBJZiB0b2tlbiBleHBsaWNpdGx5IHByb3ZpZGVkLCB1c2UgaXQgKHYyIG1hbnVhbCBtb2RlKVxuICAgIGlmIChwcm92aWRlZFRva2VuKSB7XG4gICAgICByZXR1cm4gcHJvdmlkZWRUb2tlbjtcbiAgICB9XG5cbiAgICAvLyBObyByZUNBUFRDSEEgc2VydmljZSBhdmFpbGFibGVcbiAgICBpZiAoIXRoaXMucmVjYXB0Y2hhU2VydmljZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiByZUNBUFRDSEEgaXMgY29uZmlndXJlZFxuICAgIGNvbnN0IHJlY2FwdGNoYUNvbmZpZyA9IChcbiAgICAgIHRoaXMuY29uZmlnIGFzIHsgcmVjYXB0Y2hhPzogeyBlbmFibGVkPzogYm9vbGVhbjsgdmVyc2lvbj86IHN0cmluZzsgbWFudWFsQ2hhbGxlbmdlPzogYm9vbGVhbiB9IH1cbiAgICApLnJlY2FwdGNoYTtcblxuICAgIGlmICghcmVjYXB0Y2hhQ29uZmlnPy5lbmFibGVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFNraXAgZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgcmVDQVBUQ0hBIChTU1IsIENhcGFjaXRvciBuYXRpdmUpXG4gICAgaWYgKHRoaXMucmVjYXB0Y2hhU2VydmljZS5zaG91bGRTa2lwKCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gdjIgb3IgbWFudWFsIG1vZGUgLSB1c2VyIG11c3QgcHJvdmlkZSB0b2tlbiBleHBsaWNpdGx5XG4gICAgaWYgKHJlY2FwdGNoYUNvbmZpZy52ZXJzaW9uID09PSAndjInIHx8IHJlY2FwdGNoYUNvbmZpZy5tYW51YWxDaGFsbGVuZ2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gQXV0by1nZW5lcmF0ZSB0b2tlbiBmb3IgdjMvRW50ZXJwcmlzZVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWNhcHRjaGFTZXJ2aWNlLmV4ZWN1dGUoYWN0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gTG9nIGVycm9yIGJ1dCBkb24ndCBibG9jayBhdXRoZW50aWNhdGlvblxuICAgICAgLy8gU2VydmVyIHdpbGwgZW5mb3JjZSBpZiByZXF1aXJlZFxuICAgICAgY29uc29sZS53YXJuKCdbQXV0aFNlcnZpY2VdIEZhaWxlZCB0byBnZW5lcmF0ZSByZUNBUFRDSEEgdG9rZW46JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
1127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcvQyxPQUFPLEVBQ0wsV0FBVyxHQXVCWixNQUFNLHVCQUF1QixDQUFDOzs7OztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBa0JBO0lBQ0E7SUFsQkwsTUFBTSxDQUFjO0lBQ3BCLE1BQU0sQ0FBb0I7SUFDMUIsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQWtCLElBQUksQ0FBQyxDQUFDO0lBQ2hFLHNCQUFzQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQzdELGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUNsRSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO0lBQ3RELFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFNUI7Ozs7O09BS0c7SUFDSCxZQUMrQixNQUF5QixFQUN0RCxXQUErQixFQUNYLE1BQWUsRUFDZixnQkFBbUM7UUFEbkMsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUNmLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBbUI7UUFFdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFckIscURBQXFEO1FBQ3JELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLElB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M0IsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELG1DQUFtQztRQUNuQyxNQUFNLGVBQWUsR0FDbkIsSUFBSSxDQUFDLE1BQ04sQ0FBQyxTQUFTLENBQUM7UUFFWixJQUFJLENBQUMsZUFBZSxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzlCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCwwRUFBMEU7UUFDMUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUN2QyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQseURBQXlEO1FBQ3pELElBQUksZUFBZSxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksZUFBZSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hFLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIsMkNBQTJDO1lBQzNDLGtDQUFrQztZQUNsQyxPQUFPLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3pFLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO3dHQXZwQ1UsV0FBVyxrQkFnQlosbUJBQW1COzRHQWhCbEIsV0FBVzs7NEZBQVgsV0FBVztrQkFEdkIsVUFBVTs7MEJBaUJOLE1BQU07MkJBQUMsbUJBQW1COzswQkFFMUIsUUFBUTs7MEJBQ1IsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE5BVVRIX0NMSUVOVF9DT05GSUcgfSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgeyBBbmd1bGFySHR0cEFkYXB0ZXIgfSBmcm9tICcuL2h0dHAtYWRhcHRlcic7XG5pbXBvcnQgeyBSZWNhcHRjaGFTZXJ2aWNlIH0gZnJvbSAnLi4vbGliL3JlY2FwdGNoYS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIE5BdXRoQ2xpZW50LFxuICBOQXV0aENsaWVudENvbmZpZyxcbiAgQXV0aFJlc3BvbnNlQ29udGV4dCxcbiAgQ2hhbGxlbmdlUmVzcG9uc2UsXG4gIEF1dGhSZXNwb25zZSxcbiAgVG9rZW5SZXNwb25zZSxcbiAgQXV0aFVzZXIsXG4gIENvbmZpcm1Gb3Jnb3RQYXNzd29yZFJlc3BvbnNlLFxuICBGb3Jnb3RQYXNzd29yZFJlc3BvbnNlLFxuICBSZXNldFBhc3N3b3JkV2l0aENvZGVSZXNwb25zZSxcbiAgVXBkYXRlUHJvZmlsZVJlcXVlc3QsXG4gIEdldENoYWxsZW5nZURhdGFSZXNwb25zZSxcbiAgR2V0U2V0dXBEYXRhUmVzcG9uc2UsXG4gIEdldE1GQURldmljZXNSZXNwb25zZSxcbiAgTUZBU3RhdHVzLFxuICBSZW1vdmVNRkFEZXZpY2VSZXNwb25zZSxcbiAgQXV0aEV2ZW50LFxuICBTb2NpYWxQcm92aWRlcixcbiAgU29jaWFsTG9naW5PcHRpb25zLFxuICBMaW5rZWRBY2NvdW50c1Jlc3BvbnNlLFxuICBTb2NpYWxWZXJpZnlSZXF1ZXN0LFxuICBBdWRpdEhpc3RvcnlSZXNwb25zZSxcbiAgQWRtaW5PcGVyYXRpb25zLFxufSBmcm9tICdAbmF1dGgtdG9vbGtpdC9jbGllbnQnO1xuXG4vKipcbiAqIEFuZ3VsYXIgd3JhcHBlciBhcm91bmQgTkF1dGhDbGllbnQgdGhhdCBwcm92aWRlcyBwcm9taXNlLWJhc2VkIGF1dGggbWV0aG9kcyBhbmQgcmVhY3RpdmUgc3RhdGUuXG4gKlxuICogVGhpcyBzZXJ2aWNlIHByb3ZpZGVzOlxuICogLSBSZWFjdGl2ZSBzdGF0ZSAoY3VycmVudFVzZXIkLCBpc0F1dGhlbnRpY2F0ZWQkLCBjaGFsbGVuZ2UkKVxuICogLSBBbGwgY29yZSBhdXRoIG1ldGhvZHMgYXMgUHJvbWlzZXMgKGxvZ2luLCBzaWdudXAsIGxvZ291dCwgcmVmcmVzaClcbiAqIC0gUHJvZmlsZSBtYW5hZ2VtZW50IChnZXRQcm9maWxlLCB1cGRhdGVQcm9maWxlLCBjaGFuZ2VQYXNzd29yZClcbiAqIC0gQ2hhbGxlbmdlIGZsb3cgbWV0aG9kcyAocmVzcG9uZFRvQ2hhbGxlbmdlLCByZXNlbmRDb2RlKVxuICogLSBNRkEgbWFuYWdlbWVudCAoZ2V0TWZhU3RhdHVzLCBzZXR1cE1mYURldmljZSwgZXRjLilcbiAqIC0gU29jaWFsIGF1dGhlbnRpY2F0aW9uIGFuZCBhY2NvdW50IGxpbmtpbmdcbiAqIC0gRGV2aWNlIHRydXN0IG1hbmFnZW1lbnRcbiAqIC0gQXVkaXQgaGlzdG9yeVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGg6IEF1dGhTZXJ2aWNlKSB7fVxuICpcbiAqIC8vIFJlYWN0aXZlIHN0YXRlXG4gKiB0aGlzLmF1dGguY3VycmVudFVzZXIkLnN1YnNjcmliZSh1c2VyID0+IC4uLik7XG4gKiB0aGlzLmF1dGguaXNBdXRoZW50aWNhdGVkJC5zdWJzY3JpYmUoaXNBdXRoID0+IC4uLik7XG4gKlxuICogLy8gQXV0aCBvcGVyYXRpb25zIHdpdGggYXN5bmMvYXdhaXRcbiAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmxvZ2luKGVtYWlsLCBwYXNzd29yZCk7XG4gKlxuICogLy8gUHJvZmlsZSBtYW5hZ2VtZW50XG4gKiBhd2FpdCB0aGlzLmF1dGguY2hhbmdlUGFzc3dvcmQob2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkKTtcbiAqIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGgudXBkYXRlUHJvZmlsZSh7IGZpcnN0TmFtZTogJ0pvaG4nIH0pO1xuICpcbiAqIC8vIE1GQSBvcGVyYXRpb25zXG4gKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IE5BdXRoQ2xpZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTkF1dGhDbGllbnRDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudFVzZXJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoVXNlciB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzQXV0aGVudGljYXRlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFsbGVuZ2VTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoUmVzcG9uc2UgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRoRXZlbnRzU3ViamVjdCA9IG5ldyBTdWJqZWN0PEF1dGhFdmVudD4oKTtcbiAgcHJpdmF0ZSBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gSW5qZWN0ZWQgY2xpZW50IGNvbmZpZ3VyYXRpb24gKHJlcXVpcmVkKVxuICAgKiBAcGFyYW0gaHR0cEFkYXB0ZXIgLSBBbmd1bGFyIEhUVFAgYWRhcHRlciBmb3IgbWFraW5nIHJlcXVlc3RzIChyZXF1aXJlZClcbiAgICogQHBhcmFtIHJvdXRlciAtIEFuZ3VsYXIgUm91dGVyIChvcHRpb25hbCwgYXV0b21hdGljYWxseSB1c2VkIGZvciBuYXZpZ2F0aW9uIGlmIGF2YWlsYWJsZSlcbiAgICogQHBhcmFtIHJlY2FwdGNoYVNlcnZpY2UgLSBSZWNhcHRjaGFTZXJ2aWNlIChvcHRpb25hbCwgZm9yIGF1dG9tYXRpYyB0b2tlbiBnZW5lcmF0aW9uKVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChOQVVUSF9DTElFTlRfQ09ORklHKSBjb25maWc6IE5BdXRoQ2xpZW50Q29uZmlnLFxuICAgIGh0dHBBZGFwdGVyOiBBbmd1bGFySHR0cEFkYXB0ZXIsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByb3V0ZXI/OiBSb3V0ZXIsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWNhcHRjaGFTZXJ2aWNlPzogUmVjYXB0Y2hhU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG5cbiAgICAvLyBVc2UgcHJvdmlkZWQgaHR0cEFkYXB0ZXIgKGZyb20gY29uZmlnIG9yIGluamVjdGVkKVxuICAgIGNvbnN0IGFkYXB0ZXIgPSBjb25maWcuaHR0cEFkYXB0ZXIgPz8gaHR0cEFkYXB0ZXI7XG4gICAgaWYgKCFhZGFwdGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdIdHRwQWRhcHRlciBub3QgZm91bmQuIEVpdGhlciBwcm92aWRlIGh0dHBBZGFwdGVyIGluIE5BVVRIX0NMSUVOVF9DT05GSUcgb3IgZW5zdXJlIEh0dHBDbGllbnQgaXMgYXZhaWxhYmxlLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBBdXRvbWF0aWMgQW5ndWxhciBSb3V0ZXIgaW50ZWdyYXRpb25cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gSWYgUm91dGVyIGlzIGF2YWlsYWJsZSBhbmQgbm8gY3VzdG9tIG5hdmlnYXRpb25IYW5kbGVyIGlzIHByb3ZpZGVkLFxuICAgIC8vIGF1dG9tYXRpY2FsbHkgdXNlIEFuZ3VsYXIgUm91dGVyJ3MgbmF2aWdhdGVCeVVybCgpIHRvIHByZXZlbnQgcGFnZSByZWZyZXNoZXNcbiAgICBjb25zdCBuYXZpZ2F0aW9uSGFuZGxlciA9XG4gICAgICBjb25maWcubmF2aWdhdGlvbkhhbmRsZXIgPz9cbiAgICAgICh0aGlzLnJvdXRlclxuICAgICAgICA/IGFzeW5jICh1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIhLm5hdmlnYXRlQnlVcmwodXJsKTtcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkKTtcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBJTVBPUlRBTlQ6IENoYWxsZW5nZS1zdGF0ZSBoeWRyYXRpb24gQkVGT1JFIG5hdmlnYXRpb24gKEFuZ3VsYXIgZ3VhcmQgc2FmZXR5KVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBXSFk6IGBOQXV0aENsaWVudC5sb2dpbigpYCBhdXRvLW5hdmlnYXRlcyB2aWEgQ2hhbGxlbmdlUm91dGVyICpiZWZvcmUqIHJldHVybmluZy5cbiAgICAvLyBUaGUgQW5ndWxhciBzYW1wbGUgYXBwIHVzZXMgYSBzeW5jaHJvbm91cyBndWFyZCAoYGNoYWxsZW5nZVJvdXRlR3VhcmRgKSB0aGF0XG4gICAgLy8gcmVhZHMgdGhlIGN1cnJlbnQgY2hhbGxlbmdlIHZpYSBgQXV0aFNlcnZpY2UuZ2V0Q3VycmVudENoYWxsZW5nZSgpYCAoYmFja2VkIGJ5XG4gICAgLy8gYGNoYWxsZW5nZVN1YmplY3QudmFsdWVgKS4gSWYgbmF2aWdhdGlvbiBoYXBwZW5zIGJlZm9yZSBgY2hhbGxlbmdlU3ViamVjdGAgaXNcbiAgICAvLyB1cGRhdGVkLCB0aGUgZ3VhcmQgaW5jb3JyZWN0bHkgcmVkaXJlY3RzIGJhY2sgdG8gYC9sb2dpbmAuXG4gICAgLy9cbiAgICAvLyBGaXg6IGludGVyY2VwdCB0aGUgU0RLJ3MgYXV0by1uYXZpZ2F0aW9uIGhvb2sgKGBvbkF1dGhSZXNwb25zZWApLCBwdWJsaXNoIHRoZVxuICAgIC8vIGNoYWxsZW5nZSBzdGF0ZSBpbW1lZGlhdGVseSwgdGhlbiBwZXJmb3JtIGRlZmF1bHQgbmF2aWdhdGlvbiAob3IgZGVsZWdhdGUgdG9cbiAgICAvLyB0aGUgdXNlcidzIGN1c3RvbSBgb25BdXRoUmVzcG9uc2VgIGlmIHByb3ZpZGVkKS5cbiAgICBjb25zdCB1c2VyT25BdXRoUmVzcG9uc2UgPSBjb25maWcub25BdXRoUmVzcG9uc2U7XG5cbiAgICB0aGlzLmNsaWVudCA9IG5ldyBOQXV0aENsaWVudCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBodHRwQWRhcHRlcjogYWRhcHRlcixcbiAgICAgIG5hdmlnYXRpb25IYW5kbGVyLFxuICAgICAgb25BdXRoUmVzcG9uc2U6IGFzeW5jIChyZXNwb25zZTogQXV0aFJlc3BvbnNlLCBjb250ZXh0OiBBdXRoUmVzcG9uc2VDb250ZXh0KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIC8vIEVuc3VyZSBndWFyZHMgY2FuIHN5bmNocm9ub3VzbHkgc2VlIHRoZSBhY3RpdmUgY2hhbGxlbmdlIGJlZm9yZSBuYXZpZ2F0aW9uLlxuICAgICAgICB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlc3BvbnNlKTtcblxuICAgICAgICAvLyBJZiB0aGUgY29uc3VtZXIgcHJvdmlkZWQgdGhlaXIgb3duIGhhbmRsZXIsIGxldCB0aGVtIHRha2UgZnVsbCBjb250cm9sLlxuICAgICAgICBpZiAodXNlck9uQXV0aFJlc3BvbnNlKSB7XG4gICAgICAgICAgYXdhaXQgdXNlck9uQXV0aFJlc3BvbnNlKHJlc3BvbnNlLCBjb250ZXh0KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0IG5hdmlnYXRpb24gYmVoYXZpb3IgKG1hdGNoZXMgQ2hhbGxlbmdlUm91dGVyLmhhbmRsZUF1dGhSZXNwb25zZSlcbiAgICAgICAgY29uc3Qgcm91dGVyID0gdGhpcy5jbGllbnQuZ2V0Q2hhbGxlbmdlUm91dGVyKCk7XG4gICAgICAgIGlmIChyZXNwb25zZS5jaGFsbGVuZ2VOYW1lKSB7XG4gICAgICAgICAgYXdhaXQgcm91dGVyLm5hdmlnYXRlVG9DaGFsbGVuZ2UocmVzcG9uc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByZWZlciBhcHBTdGF0ZSBwcm92aWRlZCB2aWEgY29udGV4dCAoc29jaWFsIHJlZGlyZWN0IGd1YXJkIC8gZXhjaGFuZ2UgZmxvdykuXG4gICAgICAgIC8vIElNUE9SVEFOVDogRG8gbm90IGNvbnN1bWUvY2xlYXIgcGVyc2lzdGVkIE9BdXRoIHN0YXRlIGhlcmU7IGxlYXZlIGl0IGF2YWlsYWJsZVxuICAgICAgICAvLyBmb3IgY29uc3VtZXJzIHZpYSBnZXRMYXN0T2F1dGhTdGF0ZSgpLlxuICAgICAgICBhd2FpdCByb3V0ZXIubmF2aWdhdGVUb1N1Y2Nlc3MoY29udGV4dC5hcHBTdGF0ZSA/IHsgYXBwU3RhdGU6IGNvbnRleHQuYXBwU3RhdGUgfSA6IHVuZGVmaW5lZCwgY29udGV4dCk7XG4gICAgICB9LFxuICAgICAgb25BdXRoU3RhdGVDaGFuZ2U6ICh1c2VyOiBBdXRoVXNlciB8IG51bGwpID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dCh1c2VyKTtcbiAgICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQoQm9vbGVhbih1c2VyKSk7XG4gICAgICAgIGNvbmZpZy5vbkF1dGhTdGF0ZUNoYW5nZT8uKHVzZXIpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIEZvcndhcmQgYWxsIGNsaWVudCBldmVudHMgdG8gT2JzZXJ2YWJsZSBzdHJlYW1cbiAgICB0aGlzLmNsaWVudC5vbignKicsIChldmVudDogQXV0aEV2ZW50KSA9PiB7XG4gICAgICB0aGlzLmF1dGhFdmVudHNTdWJqZWN0Lm5leHQoZXZlbnQpO1xuICAgIH0pO1xuXG4gICAgLy8gQXV0by1pbml0aWFsaXplIG9uIGNvbnN0cnVjdGlvbiAoaHlkcmF0ZSBmcm9tIHN0b3JhZ2UpXG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJlYWN0aXZlIFN0YXRlIE9ic2VydmFibGVzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ3VycmVudCB1c2VyIG9ic2VydmFibGUuXG4gICAqL1xuICBnZXQgY3VycmVudFVzZXIkKCk6IE9ic2VydmFibGU8QXV0aFVzZXIgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0ZWQgc3RhdGUgb2JzZXJ2YWJsZS5cbiAgICovXG4gIGdldCBpc0F1dGhlbnRpY2F0ZWQkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmlzQXV0aGVudGljYXRlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudCBjaGFsbGVuZ2Ugb2JzZXJ2YWJsZSAoZm9yIHJlYWN0aXZlIGNoYWxsZW5nZSBuYXZpZ2F0aW9uKS5cbiAgICovXG4gIGdldCBjaGFsbGVuZ2UkKCk6IE9ic2VydmFibGU8QXV0aFJlc3BvbnNlIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmNoYWxsZW5nZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogQXV0aGVudGljYXRpb24gZXZlbnRzIHN0cmVhbS5cbiAgICogRW1pdHMgYWxsIGF1dGggbGlmZWN5Y2xlIGV2ZW50cyBmb3IgY3VzdG9tIGxvZ2ljLCBhbmFseXRpY3MsIG9yIFVJIHVwZGF0ZXMuXG4gICAqL1xuICBnZXQgYXV0aEV2ZW50cyQoKTogT2JzZXJ2YWJsZTxBdXRoRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWNjZXNzZnVsIGF1dGhlbnRpY2F0aW9uIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIHdoZW4gdXNlciBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlcyAobG9naW4sIHNpZ251cCwgc29jaWFsIGF1dGgpLlxuICAgKi9cbiAgZ2V0IGF1dGhTdWNjZXNzJCgpOiBPYnNlcnZhYmxlPEF1dGhFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhFdmVudHNTdWJqZWN0LnBpcGUoZmlsdGVyKChlKSA9PiBlLnR5cGUgPT09ICdhdXRoOnN1Y2Nlc3MnKSk7XG4gIH1cblxuICAvKipcbiAgICogQXV0aGVudGljYXRpb24gZXJyb3IgZXZlbnRzIHN0cmVhbS5cbiAgICogRW1pdHMgd2hlbiBhdXRoZW50aWNhdGlvbiBmYWlscyAobG9naW4gZXJyb3IsIE9BdXRoIGVycm9yLCBldGMuKS5cbiAgICovXG4gIGdldCBhdXRoRXJyb3IkKCk6IE9ic2VydmFibGU8QXV0aEV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aEV2ZW50c1N1YmplY3QucGlwZShmaWx0ZXIoKGUpID0+IGUudHlwZSA9PT0gJ2F1dGg6ZXJyb3InIHx8IGUudHlwZSA9PT0gJ29hdXRoOmVycm9yJykpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTeW5jIFN0YXRlIEFjY2Vzc29ycyAoZm9yIGd1YXJkcywgdGVtcGxhdGVzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGF1dGhlbnRpY2F0ZWQgKHN5bmMsIHVzZXMgY2FjaGVkIHN0YXRlKS5cbiAgICovXG4gIGlzQXV0aGVudGljYXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuaXNBdXRoZW50aWNhdGVkU3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHVzZXIgKHN5bmMsIHVzZXMgY2FjaGVkIHN0YXRlKS5cbiAgICovXG4gIGdldEN1cnJlbnRVc2VyKCk6IEF1dGhVc2VyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldEN1cnJlbnRVc2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgY2hhbGxlbmdlIChzeW5jKS5cbiAgICovXG4gIGdldEN1cnJlbnRDaGFsbGVuZ2UoKTogQXV0aFJlc3BvbnNlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbGxlbmdlU3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhbGxlbmdlIHJvdXRlciBmb3IgbWFudWFsIG5hdmlnYXRpb24gY29udHJvbC5cbiAgICogVXNlZnVsIGZvciBndWFyZHMgdGhhdCBuZWVkIHRvIGhhbmRsZSBlcnJvcnMgb3IgYnVpbGQgY3VzdG9tIFVSTHMuXG4gICAqXG4gICAqIEByZXR1cm5zIENoYWxsZW5nZVJvdXRlciBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJvdXRlciA9IHRoaXMuYXV0aC5nZXRDaGFsbGVuZ2VSb3V0ZXIoKTtcbiAgICogYXdhaXQgcm91dGVyLm5hdmlnYXRlVG9FcnJvcignb2F1dGgnKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRDaGFsbGVuZ2VSb3V0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldENoYWxsZW5nZVJvdXRlcigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb3JlIEF1dGggTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIExvZ2luIHdpdGggaWRlbnRpZmllciBhbmQgcGFzc3dvcmQuXG4gICAqXG4gICAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIHJlQ0FQVENIQSB0b2tlbiBpZiBjb25maWd1cmVkICh2MyBvbmx5KS5cbiAgICogRm9yIHYyIG1hbnVhbCBtb2RlLCBwYXNzIHRoZSB0b2tlbiBleHBsaWNpdGx5LlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIFVzZXIgZW1haWwgb3IgdXNlcm5hbWVcbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gVXNlciBwYXNzd29yZFxuICAgKiBAcGFyYW0gcmVjYXB0Y2hhVG9rZW4gLSBPcHRpb25hbCByZUNBUFRDSEEgdG9rZW4gKGZvciB2MiBtYW51YWwgbW9kZSBvciB3aGVuIGF1dG8tZ2VuZXJhdGlvbiBpcyBkaXNhYmxlZClcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGF1dGggcmVzcG9uc2Ugb3IgY2hhbGxlbmdlXG4gICAqXG4gICAqIEBleGFtcGxlIEJhc2ljIExvZ2luXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGgubG9naW4oJ3VzZXJAZXhhbXBsZS5jb20nLCAncGFzc3dvcmQnKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIFdpdGggTWFudWFsIHJlQ0FQVENIQSAodjIpXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGgubG9naW4oJ3VzZXJAZXhhbXBsZS5jb20nLCAncGFzc3dvcmQnLCByZWNhcHRjaGFUb2tlbik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9naW4oaWRlbnRpZmllcjogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCByZWNhcHRjaGFUb2tlbj86IHN0cmluZyk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLmdldFJlY2FwdGNoYVRva2VuKHJlY2FwdGNoYVRva2VuLCAnbG9naW4nKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5sb2dpbihpZGVudGlmaWVyLCBwYXNzd29yZCwgdG9rZW4pO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnVwIHdpdGggY3JlZGVudGlhbHMuXG4gICAqXG4gICAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIHJlQ0FQVENIQSB0b2tlbiBpZiBjb25maWd1cmVkICh2MyBvbmx5KS5cbiAgICogRm9yIHYyIG1hbnVhbCBtb2RlLCBpbmNsdWRlIHRva2VuIGluIHBheWxvYWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXlsb2FkIC0gU2lnbnVwIHJlcXVlc3QgcGF5bG9hZFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggYXV0aCByZXNwb25zZSBvciBjaGFsbGVuZ2VcbiAgICpcbiAgICogQGV4YW1wbGUgQmFzaWMgU2lnbnVwXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguc2lnbnVwKHtcbiAgICogICBlbWFpbDogJ25ld0BleGFtcGxlLmNvbScsXG4gICAqICAgcGFzc3dvcmQ6ICdTZWN1cmVQYXNzMTIzIScsXG4gICAqICAgZmlyc3ROYW1lOiAnSm9obicsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGUgV2l0aCBNYW51YWwgcmVDQVBUQ0hBICh2MilcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5zaWdudXAoe1xuICAgKiAgIGVtYWlsOiAnbmV3QGV4YW1wbGUuY29tJyxcbiAgICogICBwYXNzd29yZDogJ1NlY3VyZVBhc3MxMjMhJyxcbiAgICogICByZWNhcHRjaGFUb2tlbjogdG9rZW4sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNpZ251cChwYXlsb2FkOiBQYXJhbWV0ZXJzPE5BdXRoQ2xpZW50WydzaWdudXAnXT5bMF0pOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIC8vIEF1dG8tZ2VuZXJhdGUgcmVDQVBUQ0hBIHRva2VuIGZvciB2MyBpZiBjb25maWd1cmVkIGFuZCBub3QgYWxyZWFkeSBwcm92aWRlZFxuICAgIGNvbnN0IHBheWxvYWRXaXRoUmVjYXB0Y2hhID0gcGF5bG9hZCBhcyB7IHJlY2FwdGNoYVRva2VuPzogc3RyaW5nIH07XG5cbiAgICBpZiAoIXBheWxvYWRXaXRoUmVjYXB0Y2hhLnJlY2FwdGNoYVRva2VuKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuZ2V0UmVjYXB0Y2hhVG9rZW4odW5kZWZpbmVkLCAnc2lnbnVwJyk7XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgcGF5bG9hZCA9IHsgLi4ucGF5bG9hZCwgcmVjYXB0Y2hhVG9rZW46IHRva2VuIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuc2lnbnVwKHBheWxvYWQpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogTG9nb3V0IGN1cnJlbnQgc2Vzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIGZvcmdldERldmljZSAtIElmIHRydWUsIHJlbW92ZXMgZGV2aWNlIHRydXN0XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmxvZ291dCgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvZ291dChmb3JnZXREZXZpY2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jbGllbnQubG9nb3V0KGZvcmdldERldmljZSk7XG4gICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgLy8gRXhwbGljaXRseSB1cGRhdGUgYXV0aCBzdGF0ZSBhZnRlciBsb2dvdXRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcblxuICAgIC8vIENsZWFyIENTUkYgdG9rZW4gY29va2llIGlmIGluIGNvb2tpZXMgbW9kZVxuICAgIC8vIE5vdGU6IEJhY2tlbmQgc2hvdWxkIGNsZWFyIGh0dHBPbmx5IGNvb2tpZXMsIGJ1dCB3ZSBjbGVhciBub24taHR0cE9ubHkgb25lc1xuICAgIGlmICh0aGlzLmNvbmZpZy50b2tlbkRlbGl2ZXJ5ID09PSAnY29va2llcycgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3QgY3NyZkNvb2tpZU5hbWUgPSB0aGlzLmNvbmZpZy5jc3JmPy5jb29raWVOYW1lID8/ICduYXV0aF9jc3JmX3Rva2VuJztcbiAgICAgIC8vIEV4dHJhY3QgZG9tYWluIGZyb20gYmFzZVVybCBpZiBwb3NzaWJsZVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh0aGlzLmNvbmZpZy5iYXNlVXJsKTtcbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gYCR7Y3NyZkNvb2tpZU5hbWV9PTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQzsgcGF0aD0vOyBkb21haW49JHt1cmwuaG9zdG5hbWV9YDtcbiAgICAgICAgLy8gQWxzbyB0cnkgd2l0aG91dCBkb21haW4gKGZvciBsb2NhbGhvc3QpXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2NzcmZDb29raWVOYW1lfT07IGV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBVVEM7IHBhdGg9L2A7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgaWYgYmFzZVVybCBwYXJzaW5nIGZhaWxzXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2NzcmZDb29raWVOYW1lfT07IGV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBVVEM7IHBhdGg9L2A7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCBhbGwgc2Vzc2lvbnMuXG4gICAqXG4gICAqIFJldm9rZXMgYWxsIGFjdGl2ZSBzZXNzaW9ucyBmb3IgdGhlIGN1cnJlbnQgdXNlciBhY3Jvc3MgYWxsIGRldmljZXMuXG4gICAqIE9wdGlvbmFsbHkgcmV2b2tlcyBhbGwgdHJ1c3RlZCBkZXZpY2VzIGlmIGZvcmdldERldmljZXMgaXMgdHJ1ZS5cbiAgICpcbiAgICogQHBhcmFtIGZvcmdldERldmljZXMgLSBJZiB0cnVlLCBhbHNvIHJldm9rZXMgYWxsIHRydXN0ZWQgZGV2aWNlcyAoZGVmYXVsdDogZmFsc2UpXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBudW1iZXIgb2Ygc2Vzc2lvbnMgcmV2b2tlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5sb2dvdXRBbGwoKTtcbiAgICogY29uc29sZS5sb2coYFJldm9rZWQgJHtyZXN1bHQucmV2b2tlZENvdW50fSBzZXNzaW9uc2ApO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvZ291dEFsbChmb3JnZXREZXZpY2VzPzogYm9vbGVhbik6IFByb21pc2U8eyByZXZva2VkQ291bnQ6IG51bWJlciB9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQubG9nb3V0QWxsKGZvcmdldERldmljZXMpO1xuICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIC8vIEV4cGxpY2l0bHkgdXBkYXRlIGF1dGggc3RhdGUgYWZ0ZXIgbG9nb3V0XG4gICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dChudWxsKTtcbiAgICB0aGlzLmlzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIHRva2Vucy5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIG5ldyB0b2tlbnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB0b2tlbnMgPSBhd2FpdCB0aGlzLmF1dGgucmVmcmVzaCgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlZnJlc2goKTogUHJvbWlzZTxUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlZnJlc2hUb2tlbnMoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWNjb3VudCBSZWNvdmVyeSAoRm9yZ290IFBhc3N3b3JkKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgYSBwYXNzd29yZCByZXNldCBjb2RlIChmb3Jnb3QgcGFzc3dvcmQpLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIFVzZXIgZW1haWwsIHVzZXJuYW1lLCBvciBwaG9uZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggcGFzc3dvcmQgcmVzZXQgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguZm9yZ290UGFzc3dvcmQoJ3VzZXJAZXhhbXBsZS5jb20nKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBmb3Jnb3RQYXNzd29yZChpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPEZvcmdvdFBhc3N3b3JkUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZm9yZ290UGFzc3dvcmQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlybSBhIHBhc3N3b3JkIHJlc2V0IGNvZGUgYW5kIHNldCBhIG5ldyBwYXNzd29yZC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGVtYWlsLCB1c2VybmFtZSwgb3IgcGhvbmVcbiAgICogQHBhcmFtIGNvZGUgLSBPbmUtdGltZSByZXNldCBjb2RlXG4gICAqIEBwYXJhbSBuZXdQYXNzd29yZCAtIE5ldyBwYXNzd29yZFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggY29uZmlybWF0aW9uIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmNvbmZpcm1Gb3Jnb3RQYXNzd29yZCgndXNlckBleGFtcGxlLmNvbScsICcxMjM0NTYnLCAnTmV3UGFzczEyMyEnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjb25maXJtRm9yZ290UGFzc3dvcmQoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIGNvZGU6IHN0cmluZyxcbiAgICBuZXdQYXNzd29yZDogc3RyaW5nLFxuICApOiBQcm9taXNlPENvbmZpcm1Gb3Jnb3RQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmNvbmZpcm1Gb3Jnb3RQYXNzd29yZChpZGVudGlmaWVyLCBjb2RlLCBuZXdQYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgcGFzc3dvcmQgd2l0aCBjb2RlIG9yIHRva2VuIChnZW5lcmljIG1ldGhvZCBmb3IgYm90aCBhZG1pbiBhbmQgdXNlci1pbml0aWF0ZWQgcmVzZXRzKS5cbiAgICpcbiAgICogQWNjZXB0cyBlaXRoZXI6XG4gICAqIC0gY29kZTogU2hvcnQgbnVtZXJpYyBjb2RlIGZyb20gZW1haWwvU01TICg2LTEwIGRpZ2l0cylcbiAgICogLSB0b2tlbjogTG9uZyBoZXggdG9rZW4gZnJvbSByZXNldCBsaW5rICg2NCBjaGFycylcbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGlkZW50aWZpZXIgKGVtYWlsLCB1c2VybmFtZSwgcGhvbmUpXG4gICAqIEBwYXJhbSBjb2RlT3JUb2tlbiAtIFZlcmlmaWNhdGlvbiBjb2RlIE9SIHRva2VuIGZyb20gbGlua1xuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBOZXcgcGFzc3dvcmRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBXaXRoIGNvZGUgZnJvbSBlbWFpbFxuICAgKiBhd2FpdCB0aGlzLmF1dGgucmVzZXRQYXNzd29yZFdpdGhDb2RlKCd1c2VyQGV4YW1wbGUuY29tJywgJzEyMzQ1NicsICdOZXdQYXNzMTIzIScpO1xuICAgKlxuICAgKiAvLyBXaXRoIHRva2VuIGZyb20gbGlua1xuICAgKiBhd2FpdCB0aGlzLmF1dGgucmVzZXRQYXNzd29yZFdpdGhDb2RlKCd1c2VyQGV4YW1wbGUuY29tJywgJzY0LWNoYXItdG9rZW4nLCAnTmV3UGFzczEyMyEnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXNldFBhc3N3b3JkV2l0aENvZGUoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIGNvZGVPclRva2VuOiBzdHJpbmcsXG4gICAgbmV3UGFzc3dvcmQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxSZXNldFBhc3N3b3JkV2l0aENvZGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXNldFBhc3N3b3JkV2l0aENvZGUoaWRlbnRpZmllciwgY29kZU9yVG9rZW4sIG5ld1Bhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdXNlciBwYXNzd29yZCAocmVxdWlyZXMgY3VycmVudCBwYXNzd29yZCkuXG4gICAqXG4gICAqIEBwYXJhbSBvbGRQYXNzd29yZCAtIEN1cnJlbnQgcGFzc3dvcmRcbiAgICogQHBhcmFtIG5ld1Bhc3N3b3JkIC0gTmV3IHBhc3N3b3JkIChtdXN0IG1lZXQgcmVxdWlyZW1lbnRzKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBwYXNzd29yZCBpcyBjaGFuZ2VkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmNoYW5nZVBhc3N3b3JkKCdvbGRQYXNzd29yZDEyMycsICduZXdTZWN1cmVQYXNzd29yZDQ1NiEnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjaGFuZ2VQYXNzd29yZChvbGRQYXNzd29yZDogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmNoYW5nZVBhc3N3b3JkKG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFByb2ZpbGUgTWFuYWdlbWVudFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHVzZXIgcHJvZmlsZS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBjdXJyZW50IHVzZXIgcHJvZmlsZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGguZ2V0UHJvZmlsZSgpO1xuICAgKiBjb25zb2xlLmxvZygnVXNlciBwcm9maWxlOicsIHVzZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldFByb2ZpbGUoKTogUHJvbWlzZTxBdXRoVXNlcj4ge1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRQcm9maWxlKCk7XG4gICAgLy8gVXBkYXRlIGxvY2FsIHN0YXRlIHdoZW4gcHJvZmlsZSBpcyBmZXRjaGVkXG4gICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dCh1c2VyKTtcbiAgICByZXR1cm4gdXNlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdXNlciBwcm9maWxlLlxuICAgKlxuICAgKiBAcGFyYW0gdXBkYXRlcyAtIFByb2ZpbGUgZmllbGRzIHRvIHVwZGF0ZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIHVwZGF0ZWQgdXNlciBwcm9maWxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuYXV0aC51cGRhdGVQcm9maWxlKHsgZmlyc3ROYW1lOiAnSm9obicsIGxhc3ROYW1lOiAnRG9lJyB9KTtcbiAgICogY29uc29sZS5sb2coJ1Byb2ZpbGUgdXBkYXRlZDonLCB1c2VyKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB1cGRhdGVQcm9maWxlKHVwZGF0ZXM6IFVwZGF0ZVByb2ZpbGVSZXF1ZXN0KTogUHJvbWlzZTxBdXRoVXNlcj4ge1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmNsaWVudC51cGRhdGVQcm9maWxlKHVwZGF0ZXMpO1xuICAgIC8vIFVwZGF0ZSBsb2NhbCBzdGF0ZSB3aGVuIHByb2ZpbGUgaXMgdXBkYXRlZFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQodXNlcik7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENoYWxsZW5nZSBGbG93IE1ldGhvZHMgKEVzc2VudGlhbCBmb3IgYW55IGF1dGggZmxvdylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBSZXNwb25kIHRvIGEgY2hhbGxlbmdlIChWRVJJRllfRU1BSUwsIFZFUklGWV9QSE9ORSwgTUZBX1JFUVVJUkVELCBldGMuKS5cbiAgICpcbiAgICogQHBhcmFtIHJlc3BvbnNlIC0gQ2hhbGxlbmdlIHJlc3BvbnNlIGRhdGFcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGF1dGggcmVzcG9uc2Ugb3IgbmV4dCBjaGFsbGVuZ2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgucmVzcG9uZFRvQ2hhbGxlbmdlKHtcbiAgICogICBzZXNzaW9uOiBjaGFsbGVuZ2VTZXNzaW9uLFxuICAgKiAgIHR5cGU6ICdWRVJJRllfRU1BSUwnLFxuICAgKiAgIGNvZGU6ICcxMjM0NTYnLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXNwb25kVG9DaGFsbGVuZ2UocmVzcG9uc2U6IENoYWxsZW5nZVJlc3BvbnNlKTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXNwb25kVG9DaGFsbGVuZ2UocmVzcG9uc2UpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZW5kIGNoYWxsZW5nZSBjb2RlLlxuICAgKlxuICAgKiBAcGFyYW0gc2Vzc2lvbiAtIENoYWxsZW5nZSBzZXNzaW9uIHRva2VuXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBkZXN0aW5hdGlvbiBpbmZvcm1hdGlvblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5yZXNlbmRDb2RlKHNlc3Npb24pO1xuICAgKiBjb25zb2xlLmxvZygnQ29kZSBzZW50IHRvOicsIHJlc3VsdC5kZXN0aW5hdGlvbik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzZW5kQ29kZShzZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHsgZGVzdGluYXRpb246IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlc2VuZENvZGUoc2Vzc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IE1GQSBzZXR1cCBkYXRhIChmb3IgTUZBX1NFVFVQX1JFUVVJUkVEIGNoYWxsZW5nZSkuXG4gICAqXG4gICAqIFJldHVybnMgbWV0aG9kLXNwZWNpZmljIHNldHVwIGluZm9ybWF0aW9uOlxuICAgKiAtIFRPVFA6IHsgc2VjcmV0LCBxckNvZGUsIG1hbnVhbEVudHJ5S2V5IH1cbiAgICogLSBTTVM6IHsgbWFza2VkUGhvbmUgfVxuICAgKiAtIEVtYWlsOiB7IG1hc2tlZEVtYWlsIH1cbiAgICogLSBQYXNza2V5OiBXZWJBdXRobiByZWdpc3RyYXRpb24gb3B0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0gc2Vzc2lvbiAtIENoYWxsZW5nZSBzZXNzaW9uIHRva2VuXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kIHRvIHNldCB1cFxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIHNldHVwIGRhdGEgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZXR1cERhdGEgPSBhd2FpdCB0aGlzLmF1dGguZ2V0U2V0dXBEYXRhKHNlc3Npb24sICd0b3RwJyk7XG4gICAqIGNvbnNvbGUubG9nKCdRUiBDb2RlOicsIHNldHVwRGF0YS5zZXR1cERhdGEucXJDb2RlKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRTZXR1cERhdGEoc2Vzc2lvbjogc3RyaW5nLCBtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8R2V0U2V0dXBEYXRhUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0U2V0dXBEYXRhKHNlc3Npb24sIG1ldGhvZCBhcyBQYXJhbWV0ZXJzPE5BdXRoQ2xpZW50WydnZXRTZXR1cERhdGEnXT5bMV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgY2hhbGxlbmdlIGRhdGEgKGZvciBNRkFfUkVRVUlSRUQgY2hhbGxlbmdlIC0gZS5nLiwgcGFzc2tleSBvcHRpb25zKS5cbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gLSBDaGFsbGVuZ2Ugc2Vzc2lvbiB0b2tlblxuICAgKiBAcGFyYW0gbWV0aG9kIC0gQ2hhbGxlbmdlIG1ldGhvZFxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGNoYWxsZW5nZSBkYXRhIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY2hhbGxlbmdlRGF0YSA9IGF3YWl0IHRoaXMuYXV0aC5nZXRDaGFsbGVuZ2VEYXRhKHNlc3Npb24sICdwYXNza2V5Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0Q2hhbGxlbmdlRGF0YShzZXNzaW9uOiBzdHJpbmcsIG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTxHZXRDaGFsbGVuZ2VEYXRhUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0Q2hhbGxlbmdlRGF0YShzZXNzaW9uLCBtZXRob2QgYXMgUGFyYW1ldGVyczxOQXV0aENsaWVudFsnZ2V0Q2hhbGxlbmdlRGF0YSddPlsxXSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgc3RvcmVkIGNoYWxsZW5nZSAod2hlbiBuYXZpZ2F0aW5nIGF3YXkgZnJvbSBjaGFsbGVuZ2UgZmxvdykuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGNoYWxsZW5nZSBpcyBjbGVhcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmNsZWFyQ2hhbGxlbmdlKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgY2xlYXJDaGFsbGVuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jbGllbnQuY2xlYXJTdG9yZWRDaGFsbGVuZ2UoKTtcbiAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBhY2Nlc3MgdG9rZW4gKEpTT04gbW9kZSBvbmx5KS5cbiAgICpcbiAgICogVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBjb25zdW1lcnMgdXNpbmcgQW5ndWxhciBgSHR0cENsaWVudGAgZGlyZWN0bHlcbiAgICogKG91dHNpZGUgb2YgdGhlIFNESyBtZXRob2RzKSBhbmQgcmVseWluZyBvbiBhbiBpbnRlcmNlcHRvciB0byBhdHRhY2ggQmVhcmVyIHRva2Vucy5cbiAgICpcbiAgICogQHJldHVybnMgQWNjZXNzIHRva2VuLCBvciBudWxsIGlmIG5vdCBhdmFpbGFibGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuYXV0aC5nZXRBY2Nlc3NUb2tlbigpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldEFjY2Vzc1Rva2VuKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5nZXRBY2Nlc3NUb2tlbigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTb2NpYWwgQXV0aGVudGljYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBzb2NpYWwgT0F1dGggbG9naW4gZmxvdy5cbiAgICogUmVkaXJlY3RzIHRoZSBicm93c2VyIHRvIGJhY2tlbmQgYC9hdXRoL3NvY2lhbC86cHJvdmlkZXIvcmVkaXJlY3RgLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBTb2NpYWwgcHJvdmlkZXIgKCdnb29nbGUnLCAnYXBwbGUnLCAnZmFjZWJvb2snKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHJlZGlyZWN0IG9wdGlvbnNcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gcmVkaXJlY3Qgc3RhcnRzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmxvZ2luV2l0aFNvY2lhbCgnZ29vZ2xlJywgeyByZXR1cm5UbzogJy9hdXRoL2NhbGxiYWNrJyB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dpbldpdGhTb2NpYWwocHJvdmlkZXI6IFNvY2lhbFByb3ZpZGVyLCBvcHRpb25zPzogU29jaWFsTG9naW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmxvZ2luV2l0aFNvY2lhbChwcm92aWRlciwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRXhjaGFuZ2UgYW4gZXhjaGFuZ2VUb2tlbiAoZnJvbSByZWRpcmVjdCBjYWxsYmFjayBVUkwpIGludG8gYW4gQXV0aFJlc3BvbnNlLlxuICAgKlxuICAgKiBVc2VkIGZvciBgdG9rZW5EZWxpdmVyeTogJ2pzb24nYCBvciBoeWJyaWQgZmxvd3Mgd2hlcmUgdGhlIGJhY2tlbmQgcmVkaXJlY3RzIGJhY2tcbiAgICogd2l0aCBgZXhjaGFuZ2VUb2tlbmAgaW5zdGVhZCBvZiBzZXR0aW5nIGNvb2tpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBleGNoYW5nZVRva2VuIC0gT25lLXRpbWUgZXhjaGFuZ2UgdG9rZW4gZnJvbSB0aGUgY2FsbGJhY2sgVVJMXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgQXV0aFJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguZXhjaGFuZ2VTb2NpYWxSZWRpcmVjdChleGNoYW5nZVRva2VuKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBleGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW46IHN0cmluZyk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuZXhjaGFuZ2VTb2NpYWxSZWRpcmVjdChleGNoYW5nZVRva2VuKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBuYXRpdmUgc29jaWFsIHRva2VuIChtb2JpbGUpLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCAtIFNvY2lhbCB2ZXJpZmljYXRpb24gcmVxdWVzdCB3aXRoIHByb3ZpZGVyIGFuZCB0b2tlblxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIEF1dGhSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC52ZXJpZnlOYXRpdmVTb2NpYWwoe1xuICAgKiAgIHByb3ZpZGVyOiAnZ29vZ2xlJyxcbiAgICogICBpZFRva2VuOiBuYXRpdmVJZFRva2VuLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB2ZXJpZnlOYXRpdmVTb2NpYWwocmVxdWVzdDogU29jaWFsVmVyaWZ5UmVxdWVzdCk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQudmVyaWZ5TmF0aXZlU29jaWFsKHJlcXVlc3QpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpbmtlZCBzb2NpYWwgYWNjb3VudHMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgbGlua2VkIGFjY291bnRzIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgYWNjb3VudHMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TGlua2VkQWNjb3VudHMoKTtcbiAgICogY29uc29sZS5sb2coJ0xpbmtlZCBwcm92aWRlcnM6JywgYWNjb3VudHMucHJvdmlkZXJzKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRMaW5rZWRBY2NvdW50cygpOiBQcm9taXNlPExpbmtlZEFjY291bnRzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0TGlua2VkQWNjb3VudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5rIHNvY2lhbCBhY2NvdW50LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBTb2NpYWwgcHJvdmlkZXIgdG8gbGlua1xuICAgKiBAcGFyYW0gY29kZSAtIE9BdXRoIGF1dGhvcml6YXRpb24gY29kZVxuICAgKiBAcGFyYW0gc3RhdGUgLSBPQXV0aCBzdGF0ZSBwYXJhbWV0ZXJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5saW5rU29jaWFsQWNjb3VudCgnZ29vZ2xlJywgY29kZSwgc3RhdGUpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgc3RhdGU6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5saW5rU29jaWFsQWNjb3VudChwcm92aWRlciwgY29kZSwgc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVubGluayBzb2NpYWwgYWNjb3VudC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gU29jaWFsIHByb3ZpZGVyIHRvIHVubGlua1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLnVubGlua1NvY2lhbEFjY291bnQoJ2dvb2dsZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHVubGlua1NvY2lhbEFjY291bnQocHJvdmlkZXI6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC51bmxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxhc3QgT0F1dGggYXBwU3RhdGUgZnJvbSBzb2NpYWwgcmVkaXJlY3QgY2FsbGJhY2suXG4gICAqXG4gICAqIFJldHVybnMgdGhlIGFwcFN0YXRlIHRoYXQgd2FzIHN0b3JlZCBkdXJpbmcgdGhlIG1vc3QgcmVjZW50IHNvY2lhbFxuICAgKiBsb2dpbiByZWRpcmVjdCBjYWxsYmFjay4gVGhpcyBpcyB1c2VmdWwgZm9yIHJlc3RvcmluZyBVSSBzdGF0ZSxcbiAgICogYXBwbHlpbmcgaW52aXRlIGNvZGVzLCBvciB0cmFja2luZyByZWZlcnJhbCBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogVGhlIHN0YXRlIGlzIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCBhZnRlciByZXRyaWV2YWwgdG8gcHJldmVudCByZXVzZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHN0b3JlZCBhcHBTdGF0ZSwgb3IgbnVsbCBpZiBub25lIGV4aXN0c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5hdXRoLmdldExhc3RPYXV0aFN0YXRlKCk7XG4gICAqIGlmIChhcHBTdGF0ZSkge1xuICAgKiAgIC8vIEFwcGx5IGludml0ZSBjb2RlIG9yIHJlc3RvcmUgVUkgc3RhdGVcbiAgICogICBjb25zb2xlLmxvZygnT0F1dGggc3RhdGU6JywgYXBwU3RhdGUpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0TGFzdE9hdXRoU3RhdGUoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldExhc3RPYXV0aFN0YXRlKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1GQSBNYW5hZ2VtZW50XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IE1GQSBzdGF0dXMgZm9yIHRoZSBjdXJyZW50IHVzZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgTUZBIHN0YXR1c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuYXV0aC5nZXRNZmFTdGF0dXMoKTtcbiAgICogY29uc29sZS5sb2coJ01GQSBlbmFibGVkOicsIHN0YXR1cy5lbmFibGVkKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRNZmFTdGF0dXMoKTogUHJvbWlzZTxNRkFTdGF0dXM+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0TWZhU3RhdHVzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IE1GQSBkZXZpY2VzIGZvciB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIE1GQSBkZXZpY2VzIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYURldmljZXMoKTtcbiAgICogY29uc29sZS5sb2coJ0RldmljZXM6JywgcmVzdWx0LmRldmljZXMpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldE1mYURldmljZXMoKTogUHJvbWlzZTxHZXRNRkFEZXZpY2VzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0TWZhRGV2aWNlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIE1GQSBkZXZpY2UgKGF1dGhlbnRpY2F0ZWQgdXNlcikuXG4gICAqXG4gICAqIFJldHVybnMgbWV0aG9kLXNwZWNpZmljIHNldHVwIGluZm9ybWF0aW9uOlxuICAgKiAtIFRPVFA6IHsgc2VjcmV0LCBxckNvZGUsIG1hbnVhbEVudHJ5S2V5IH1cbiAgICogLSBTTVM6IHsgbWFza2VkUGhvbmUgfSBvciB7IGRldmljZUlkLCBhdXRvQ29tcGxldGVkOiB0cnVlIH1cbiAgICogLSBFbWFpbDogeyBtYXNrZWRFbWFpbCB9IG9yIHsgZGV2aWNlSWQsIGF1dG9Db21wbGV0ZWQ6IHRydWUgfVxuICAgKiAtIFBhc3NrZXk6IFdlYkF1dGhuIHJlZ2lzdHJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kIHRvIHNldCB1cFxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIHNldHVwIGRhdGEgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGguc2V0dXBNZmFEZXZpY2UoJ3RvdHAnKTtcbiAgICogY29uc29sZS5sb2coJ1FSIENvZGU6JywgcmVzdWx0LnNldHVwRGF0YS5xckNvZGUpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNldHVwTWZhRGV2aWNlKG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTxHZXRTZXR1cERhdGFSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXR1cE1mYURldmljZShtZXRob2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBNRkEgc2V0dXAgKGF1dGhlbnRpY2F0ZWQgdXNlcikuXG4gICAqXG4gICAqIENvbXBsZXRlcyBNRkEgZGV2aWNlIHNldHVwIGJ5IHZlcmlmeWluZyB0aGUgc2V0dXAgZGF0YS4gVGhlIHN0cnVjdHVyZSBvZiBgc2V0dXBEYXRhYCB2YXJpZXMgYnkgbWV0aG9kOlxuICAgKlxuICAgKiAqKlRPVFA6KipcbiAgICogLSBSZXF1aXJlcyBib3RoIGBzZWNyZXRgIChmcm9tIGBnZXRTZXR1cERhdGEoKWAgcmVzcG9uc2UpIGFuZCBgY29kZWAgKGZyb20gYXV0aGVudGljYXRvciBhcHApXG4gICAqIC0gRXhhbXBsZTogYHsgc2VjcmV0OiAnSkJTV1kzRFBFSFBLM1BYUCcsIGNvZGU6ICcxMjM0NTYnIH1gXG4gICAqXG4gICAqICoqU01TOioqXG4gICAqIC0gUmVxdWlyZXMgYHBob25lTnVtYmVyYCBhbmQgYGNvZGVgICh2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIHBob25lKVxuICAgKiAtIEV4YW1wbGU6IGB7IHBob25lTnVtYmVyOiAnKzEyMzQ1Njc4OTAnLCBjb2RlOiAnMTIzNDU2JyB9YFxuICAgKlxuICAgKiAqKkVtYWlsOioqXG4gICAqIC0gUmVxdWlyZXMgYGNvZGVgICh2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIGVtYWlsKVxuICAgKiAtIEV4YW1wbGU6IGB7IGNvZGU6ICcxMjM0NTYnIH1gXG4gICAqXG4gICAqICoqUGFzc2tleToqKlxuICAgKiAtIFJlcXVpcmVzIGBjcmVkZW50aWFsYCAoV2ViQXV0aG4gY3JlZGVudGlhbCBmcm9tIHJlZ2lzdHJhdGlvbikgYW5kIGBleHBlY3RlZENoYWxsZW5nZWBcbiAgICogLSBFeGFtcGxlOiBgeyBjcmVkZW50aWFsOiB7Li4ufSwgZXhwZWN0ZWRDaGFsbGVuZ2U6ICcuLi4nIH1gXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kICgndG90cCcsICdzbXMnLCAnZW1haWwnLCAncGFzc2tleScpXG4gICAqIEBwYXJhbSBzZXR1cERhdGEgLSBNZXRob2Qtc3BlY2lmaWMgc2V0dXAgdmVyaWZpY2F0aW9uIGRhdGFcbiAgICogQHBhcmFtIGRldmljZU5hbWUgLSBPcHRpb25hbCBkZXZpY2UgbmFtZSAoY2FuIGFsc28gYmUgaW5jbHVkZWQgaW4gc2V0dXBEYXRhIGZvciBzb21lIG1ldGhvZHMpXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBkZXZpY2UgSUQgb2YgdGhlIGNyZWF0ZWQgTUZBIGRldmljZVxuICAgKlxuICAgKiBAZXhhbXBsZSBUT1RQIFNldHVwXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gU3RlcCAxOiBHZXQgc2V0dXAgZGF0YVxuICAgKiBjb25zdCBzZXR1cERhdGEgPSBhd2FpdCB0aGlzLmF1dGguc2V0dXBNZmFEZXZpY2UoJ3RvdHAnKTtcbiAgICogLy8gUmV0dXJuczogeyBzZXR1cERhdGE6IHsgc2VjcmV0OiAnSkJTV1kzRFBFSFBLM1BYUCcsIHFyQ29kZTogJy4uLicsIC4uLiB9IH1cbiAgICpcbiAgICogLy8gU3RlcCAyOiBVc2VyIHNjYW5zIFFSIGNvZGUgYW5kIGVudGVycyBjb2RlIGZyb20gYXV0aGVudGljYXRvciBhcHBcbiAgICogY29uc3QgY29kZSA9ICcxMjM0NTYnOyAvLyBGcm9tIGF1dGhlbnRpY2F0b3IgYXBwXG4gICAqXG4gICAqIC8vIFN0ZXAgMzogVmVyaWZ5IHNldHVwIChyZXF1aXJlcyBib3RoIHNlY3JldCBhbmQgY29kZSlcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnZlcmlmeU1mYVNldHVwKCd0b3RwJywge1xuICAgKiAgIHNlY3JldDogc2V0dXBEYXRhLnNldHVwRGF0YS5zZWNyZXQsXG4gICAqICAgY29kZTogY29kZSxcbiAgICogfSwgJ0dvb2dsZSBBdXRoZW50aWNhdG9yJyk7XG4gICAqIC8vIFJldHVybnM6IHsgZGV2aWNlSWQ6IDEyMyB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZSBTTVMgU2V0dXBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgudmVyaWZ5TWZhU2V0dXAoJ3NtcycsIHtcbiAgICogICBwaG9uZU51bWJlcjogJysxMjM0NTY3ODkwJywgLy8gUGhvbmUgbnVtYmVyIHJlY2VpdmluZyB0aGUgY29kZVxuICAgKiAgIGNvZGU6ICcxMjM0NTYnLCAvLyBDb2RlIHNlbnQgdG8gcGhvbmVcbiAgICogfSwgJ015IGlQaG9uZScpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGUgUGFzc2tleSBTZXR1cFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNyZWRlbnRpYWwgPSBhd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKHtcbiAgICogICBwdWJsaWNLZXk6IHNldHVwRGF0YS5zZXR1cERhdGEub3B0aW9uc1xuICAgKiB9KTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnZlcmlmeU1mYVNldHVwKCdwYXNza2V5Jywge1xuICAgKiAgIGNyZWRlbnRpYWw6IGNyZWRlbnRpYWwsXG4gICAqICAgZXhwZWN0ZWRDaGFsbGVuZ2U6IHNldHVwRGF0YS5zZXR1cERhdGEuY2hhbGxlbmdlLFxuICAgKiB9LCAnTWFjQm9vayBQcm8nKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB2ZXJpZnlNZmFTZXR1cChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBzZXR1cERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGRldmljZU5hbWU/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBkZXZpY2VJZDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQudmVyaWZ5TWZhU2V0dXAobWV0aG9kLCBzZXR1cERhdGEsIGRldmljZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHNpbmdsZSBNRkEgZGV2aWNlIGJ5IGRldmljZSBJRC5cbiAgICpcbiAgICogKipSZWNvbW1lbmRlZDoqKiBVc2UgdGhpcyBmb3IgZ3JhbnVsYXIgZGV2aWNlIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIE1GQSBkZXZpY2UgSURcbiAgICogQHJldHVybnMgUmVtb3ZhbCByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGRldmljZXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhRGV2aWNlcygpO1xuICAgKiBhd2FpdCB0aGlzLmF1dGgucmVtb3ZlTWZhRGV2aWNlQnlJZChkZXZpY2VzWzBdLmlkKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZW1vdmVNZmFEZXZpY2VCeUlkKGRldmljZUlkOiBudW1iZXIpOiBQcm9taXNlPFJlbW92ZU1GQURldmljZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlbW92ZU1mYURldmljZUJ5SWQoZGV2aWNlSWQpO1xuICB9XG5cbiAgLyoqXG5cbiAgLyoqXG4gICAqIFNlbGVjdCBhbiBNRkEgZGV2aWNlIGZvciB2ZXJpZmljYXRpb24gKGR1cmluZyBjaGFsbGVuZ2UgZmxvdylcbiAgICpcbiAgICogQ2FsbCB0aGlzIHdoZW4gdXNlciBzZWxlY3RzIGEgc3BlY2lmaWMgZGV2aWNlIGZyb20gdGhlIE1GQSBzZWxlY3RvciBVSS5cbiAgICogU0RLIHN0b3JlcyB0aGUgZGV2aWNlSWQgaW50ZXJuYWxseSBhbmQgYXV0by1pbmplY3RzIGl0IHdoZW4gcmVzcG9uZFRvQ2hhbGxlbmdlKCkgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBJRCBvZiB0aGUgZGV2aWNlIHVzZXIgc2VsZWN0ZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBVc2VyIGNsaWNrcyBcIk1pY3Jvc29mdCBBdXRoZW50aWNhdG9yXCIgYnV0dG9uXG4gICAqIHRoaXMuYXV0aC5zZWxlY3RNRkFEZXZpY2UoNDgpO1xuICAgKlxuICAgKiAvLyBOYXZpZ2F0ZSB0byBPVFAgdmVyaWZpY2F0aW9uIChubyBkZXZpY2VJZCBpbiBxdWVyeSBwYXJhbXMgbmVlZGVkISlcbiAgICogdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYXV0aC9jaGFsbGVuZ2UvbWZhLXJlcXVpcmVkJ10pO1xuICAgKlxuICAgKiAvLyBMYXRlciwgd2hlbiBzdWJtaXR0aW5nIE9UUCBjb2RlOlxuICAgKiBhd2FpdCB0aGlzLmF1dGgucmVzcG9uZFRvQ2hhbGxlbmdlKHtcbiAgICogICB0eXBlOiAnTUZBX1JFUVVJUkVEJyxcbiAgICogICBzZXNzaW9uOiAnYWJjMTIzJyxcbiAgICogICBtZXRob2Q6ICd0b3RwJyxcbiAgICogICBjb2RlOiAnMTIzNDU2JyxcbiAgICogICAvLyBTREsgYXV0by1pbmplY3RzIGRldmljZUlkPTQ4IGhlcmUhXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHNlbGVjdE1GQURldmljZShkZXZpY2VJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbGVjdE1GQURldmljZShkZXZpY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGF2YWlsYWJsZSBNRkEgZGV2aWNlcyBmcm9tIGNoYWxsZW5nZSByZXNwb25zZVxuICAgKlxuICAgKiBSZXR1cm5zIGFycmF5IG9mIGRldmljZXMgZm9yIG1ldGhvZHMgdGhhdCBzdXBwb3J0IG11bHRpcGxlIGRldmljZXMgKFRPVFAsIFBhc3NrZXkpLlxuICAgKiBVc2UgdGhpcyB0byByZW5kZXIgZGV2aWNlIHNlbGVjdGlvbiBVSSBvbmx5LlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbGxlbmdlIC0gQ2hhbGxlbmdlIHJlc3BvbnNlIGZyb20gbG9naW4vc2lnbnVwXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIE1GQSBkZXZpY2VzIHdpdGggaWQsIG5hbWUsIGFuZCB0eXBlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gSW4gTUZBIHNlbGVjdG9yIGNvbXBvbmVudFxuICAgKiBjb25zdCBkZXZpY2VzID0gdGhpcy5hdXRoLmdldE1GQURldmljZXNGcm9tQ2hhbGxlbmdlKHRoaXMuY2hhbGxlbmdlKCkpO1xuICAgKiAvLyBSZXR1cm5zOiBbXG4gICAqIC8vICAgeyBpZDogNDgsIG5hbWU6IFwiTWljcm9zb2Z0IEF1dGhlbnRpY2F0b3JcIiwgdHlwZTogXCJ0b3RwXCIgfSxcbiAgICogLy8gICB7IGlkOiAzLCBuYW1lOiBcIkdvb2dsZSBBdXRoZW50aWNhdG9yXCIsIHR5cGU6IFwidG90cFwiIH1cbiAgICogLy8gXVxuICAgKlxuICAgKiAvLyBSZW5kZXIgZGV2aWNlIGJ1dHRvbnNcbiAgICogZm9yIChjb25zdCBkZXZpY2Ugb2YgZGV2aWNlcykge1xuICAgKiAgIC8vIDxidXR0b24gKGNsaWNrKT1cInNlbGVjdERldmljZShkZXZpY2UpXCI+e3sgZGV2aWNlLm5hbWUgfX08L2J1dHRvbj5cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGdldE1GQURldmljZXNGcm9tQ2hhbGxlbmdlKGNoYWxsZW5nZTogQXV0aFJlc3BvbnNlKTogQXJyYXk8eyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldE1GQURldmljZXMoY2hhbGxlbmdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbnkgc2VsZWN0ZWQgTUZBIGRldmljZVxuICAgKlxuICAgKiBVc2VmdWwgaWYgdXNlciBuYXZpZ2F0ZXMgYmFjayB0byBkZXZpY2Ugc2VsZWN0b3Igb3IgY2FuY2VscyBNRkEgZmxvdy5cbiAgICovXG4gIGNsZWFyU2VsZWN0ZWRNRkFEZXZpY2UoKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmNsZWFyU2VsZWN0ZWREZXZpY2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcHJlZmVycmVkIE1GQSBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBEZXZpY2UgbWV0aG9kIHRvIHNldCBhcyBwcmVmZXJyZWQgKCd0b3RwJywgJ3NtcycsICdlbWFpbCcsIG9yICdwYXNza2V5JylcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5zZXRQcmVmZXJyZWRNZmFNZXRob2QoJ3RvdHAnKTtcbiAgICogYGBgXG4gICAqL1xuICAvKipcbiAgICogU2V0IGEgc3BlY2lmaWMgTUZBIGRldmljZSBhcyBwcmVmZXJyZWQuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIE1GQSBkZXZpY2UgSURcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgc2V0UHJlZmVycmVkTWZhRGV2aWNlKGRldmljZUlkOiBudW1iZXIpOiBQcm9taXNlPHsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc2V0UHJlZmVycmVkTWZhRGV2aWNlKGRldmljZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBiYWNrdXAgY29kZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgYmFja3VwIGNvZGVzIGFycmF5XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29kZXMgPSBhd2FpdCB0aGlzLmF1dGguZ2VuZXJhdGVCYWNrdXBDb2RlcygpO1xuICAgKiBjb25zb2xlLmxvZygnQmFja3VwIGNvZGVzOicsIGNvZGVzKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUJhY2t1cENvZGVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2VuZXJhdGVCYWNrdXBDb2RlcygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBEZXZpY2UgVHJ1c3RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBUcnVzdCBjdXJyZW50IGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGRldmljZSB0b2tlblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC50cnVzdERldmljZSgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIHRydXN0ZWQ6JywgcmVzdWx0LmRldmljZVRva2VuKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB0cnVzdERldmljZSgpOiBQcm9taXNlPHsgZGV2aWNlVG9rZW46IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnRydXN0RGV2aWNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIHRydXN0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVzdGVkIHN0YXR1c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5pc1RydXN0ZWREZXZpY2UoKTtcbiAgICogaWYgKHJlc3VsdC50cnVzdGVkKSB7XG4gICAqICAgY29uc29sZS5sb2coJ1RoaXMgZGV2aWNlIGlzIHRydXN0ZWQnKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGlzVHJ1c3RlZERldmljZSgpOiBQcm9taXNlPHsgdHJ1c3RlZDogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmlzVHJ1c3RlZERldmljZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBdWRpdCBIaXN0b3J5XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IHBhZ2luYXRlZCBhdWRpdCBoaXN0b3J5IGZvciB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUXVlcnkgcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgYXVkaXQgaGlzdG9yeSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGhpc3RvcnkgPSBhd2FpdCB0aGlzLmF1dGguZ2V0QXVkaXRIaXN0b3J5KHtcbiAgICogICBwYWdlOiAxLFxuICAgKiAgIGxpbWl0OiAyMCxcbiAgICogICBldmVudFR5cGVzOiBbJ0xPR0lOX1NVQ0NFU1MnXSxcbiAgICogICBldmVudFN0YXR1czogWydGQUlMVVJFJ10sXG4gICAqIH0pO1xuICAgKiBjb25zb2xlLmxvZygnQXVkaXQgaGlzdG9yeTonLCBoaXN0b3J5KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRBdWRpdEhpc3RvcnkoXG4gICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IEFycmF5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+PixcbiAgKTogUHJvbWlzZTxBdWRpdEhpc3RvcnlSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRBdWRpdEhpc3RvcnkocGFyYW1zKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXNjYXBlIEhhdGNoXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXhwb3NlIHVuZGVybHlpbmcgTkF1dGhDbGllbnQgZm9yIGFkdmFuY2VkIHNjZW5hcmlvcy5cbiAgICpcblxuICAgKiBAcmV0dXJucyBUaGUgdW5kZXJseWluZyBOQXV0aENsaWVudCBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlcHJlY2F0ZWQgLSB1c2UgZGlyZWN0IG1ldGhvZHMgaW5zdGVhZFxuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0Q2xpZW50KCkuZ2V0TWZhU3RhdHVzKCk7XG4gICAqXG4gICAqIC8vIFByZWZlcnJlZCAtIHVzZSBkaXJlY3QgbWV0aG9kc1xuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2xpZW50KCk6IE5BdXRoQ2xpZW50IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFkbWluIE9wZXJhdGlvbnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBBZG1pbiBvcGVyYXRpb25zIChpZiBlbmFibGVkIGluIGNvbmZpZykuXG4gICAqXG4gICAqIFByb3ZpZGVzIGFkbWluLWxldmVsIHVzZXIgbWFuYWdlbWVudCBtZXRob2RzOlxuICAgKiAtIFVzZXIgQ1JVRCBvcGVyYXRpb25zXG4gICAqIC0gUGFzc3dvcmQgbWFuYWdlbWVudFxuICAgKiAtIFNlc3Npb24gbWFuYWdlbWVudFxuICAgKiAtIE1GQSBtYW5hZ2VtZW50XG4gICAqIC0gQXVkaXQgaGlzdG9yeVxuICAgKlxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBhZG1pbiB3YXMgbm90IGNvbmZpZ3VyZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEFkbWluT3BlcmF0aW9ucyBpbnN0YW5jZSBvciB1bmRlZmluZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBDaGVjayBpZiBhZG1pbiBpcyBhdmFpbGFibGVcbiAgICogaWYgKHRoaXMuYXV0aC5hZG1pbikge1xuICAgKiAgIGNvbnN0IHVzZXJzID0gYXdhaXQgdGhpcy5hdXRoLmFkbWluLmdldFVzZXJzKHsgcGFnZTogMSB9KTtcbiAgICogfVxuICAgKlxuICAgKiAvLyBXaXRoIG9wdGlvbmFsIGNoYWluaW5nXG4gICAqIGF3YWl0IHRoaXMuYXV0aC5hZG1pbj8uZGVsZXRlVXNlcihzdWIpO1xuICAgKlxuICAgKiAvLyBDcmVhdGUgdXNlclxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGguYWRtaW4/LmNyZWF0ZVVzZXIoe1xuICAgKiAgIGVtYWlsOiAndXNlckBleGFtcGxlLmNvbScsXG4gICAqICAgcGFzc3dvcmQ6ICdTZWN1cmVQYXNzMTIzIScsXG4gICAqICAgaXNFbWFpbFZlcmlmaWVkOiB0cnVlLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBnZXQgYWRtaW4oKTogQWRtaW5PcGVyYXRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuYWRtaW47XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEludGVybmFsIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGJ5IGh5ZHJhdGluZyBzdGF0ZSBmcm9tIHN0b3JhZ2UuXG4gICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IG9uIGNvbnN0cnVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuaW5pdGlhbGl6ZSgpO1xuXG4gICAgLy8gSHlkcmF0ZSBjaGFsbGVuZ2Ugc3RhdGVcbiAgICBjb25zdCBzdG9yZWRDaGFsbGVuZ2UgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRTdG9yZWRDaGFsbGVuZ2UoKTtcbiAgICBpZiAoc3RvcmVkQ2hhbGxlbmdlKSB7XG4gICAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChzdG9yZWRDaGFsbGVuZ2UpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzdWJqZWN0cyBmcm9tIGNsaWVudCBzdGF0ZVxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNsaWVudC5nZXRDdXJyZW50VXNlcigpO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjaGFsbGVuZ2Ugc3RhdGUgYWZ0ZXIgYXV0aCByZXNwb25zZS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzcG9uc2U6IEF1dGhSZXNwb25zZSk6IEF1dGhSZXNwb25zZSB7XG4gICAgaWYgKHJlc3BvbnNlLmNoYWxsZW5nZU5hbWUpIHtcbiAgICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KHJlc3BvbnNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcmVDQVBUQ0hBIEhlbHBlclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCByZUNBUFRDSEEgdG9rZW4gLSBhdXRvLWdlbmVyYXRlIGZvciB2MyBvciB1c2UgcHJvdmlkZWQgdG9rZW4uXG4gICAqXG4gICAqIEhhbmRsZXMgcGxhdGZvcm0gZGV0ZWN0aW9uOlxuICAgKiAtIFdlYiBicm93c2VyOiBHZW5lcmF0ZSB0b2tlbiBpZiBlbmFibGVkIGFuZCB2M1xuICAgKiAtIENhcGFjaXRvciBuYXRpdmU6IFNraXAgKHVzZSBkZXZpY2UgYXR0ZXN0YXRpb24gaW5zdGVhZClcbiAgICogLSBTU1I6IFNraXBcbiAgICogLSBNYW51YWwgbW9kZSAodjIgb3IgbWFudWFsQ2hhbGxlbmdlPXRydWUpOiBSZXF1aXJlcyBleHBsaWNpdCB0b2tlblxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZWRUb2tlbiAtIEV4cGxpY2l0bHkgcHJvdmlkZWQgdG9rZW4gKHYyIG1hbnVhbCBtb2RlKVxuICAgKiBAcGFyYW0gYWN0aW9uIC0gQWN0aW9uIG5hbWUgZm9yIHYzIGFuYWx5dGljc1xuICAgKiBAcmV0dXJucyByZUNBUFRDSEEgdG9rZW4gb3IgdW5kZWZpbmVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFJlY2FwdGNoYVRva2VuKHByb3ZpZGVkVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCwgYWN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIElmIHRva2VuIGV4cGxpY2l0bHkgcHJvdmlkZWQsIHVzZSBpdCAodjIgbWFudWFsIG1vZGUpXG4gICAgaWYgKHByb3ZpZGVkVG9rZW4pIHtcbiAgICAgIHJldHVybiBwcm92aWRlZFRva2VuO1xuICAgIH1cblxuICAgIC8vIE5vIHJlQ0FQVENIQSBzZXJ2aWNlIGF2YWlsYWJsZVxuICAgIGlmICghdGhpcy5yZWNhcHRjaGFTZXJ2aWNlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHJlQ0FQVENIQSBpcyBjb25maWd1cmVkXG4gICAgY29uc3QgcmVjYXB0Y2hhQ29uZmlnID0gKFxuICAgICAgdGhpcy5jb25maWcgYXMgeyByZWNhcHRjaGE/OiB7IGVuYWJsZWQ/OiBib29sZWFuOyB2ZXJzaW9uPzogc3RyaW5nOyBtYW51YWxDaGFsbGVuZ2U/OiBib29sZWFuIH0gfVxuICAgICkucmVjYXB0Y2hhO1xuXG4gICAgaWYgKCFyZWNhcHRjaGFDb25maWc/LmVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBmb3IgcGxhdGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCByZUNBUFRDSEEgKFNTUiwgQ2FwYWNpdG9yIG5hdGl2ZSlcbiAgICBpZiAodGhpcy5yZWNhcHRjaGFTZXJ2aWNlLnNob3VsZFNraXAoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyB2MiBvciBtYW51YWwgbW9kZSAtIHVzZXIgbXVzdCBwcm92aWRlIHRva2VuIGV4cGxpY2l0bHlcbiAgICBpZiAocmVjYXB0Y2hhQ29uZmlnLnZlcnNpb24gPT09ICd2MicgfHwgcmVjYXB0Y2hhQ29uZmlnLm1hbnVhbENoYWxsZW5nZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBBdXRvLWdlbmVyYXRlIHRva2VuIGZvciB2My9FbnRlcnByaXNlXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlY2FwdGNoYVNlcnZpY2UuZXhlY3V0ZShhY3Rpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBMb2cgZXJyb3IgYnV0IGRvbid0IGJsb2NrIGF1dGhlbnRpY2F0aW9uXG4gICAgICAvLyBTZXJ2ZXIgd2lsbCBlbmZvcmNlIGlmIHJlcXVpcmVkXG4gICAgICBjb25zb2xlLndhcm4oJ1tBdXRoU2VydmljZV0gRmFpbGVkIHRvIGdlbmVyYXRlIHJlQ0FQVENIQSB0b2tlbjonLCBlcnJvcik7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIl19