ng-miam 9.2.2 → 9.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/bundles/ng-miam.umd.js +20 -60
  2. package/bundles/ng-miam.umd.js.map +1 -1
  3. package/bundles/ng-miam.umd.min.js +1 -1
  4. package/bundles/ng-miam.umd.min.js.map +1 -1
  5. package/esm2015/lib/_models/basket.js +2 -9
  6. package/esm2015/lib/_services/baskets.service.js +2 -22
  7. package/esm2015/lib/_services/context.service.js +3 -4
  8. package/esm2015/lib/_services/items.service.js +2 -2
  9. package/esm2015/lib/_services/recipes.service.js +3 -3
  10. package/esm2015/lib/_types/builded/mealz-interface.js +1 -1
  11. package/esm2015/lib/_types/builded/mealz-internal-interface.js +1 -1
  12. package/esm2015/lib/_web-components/meals-planner/meals-planner.component.js +2 -3
  13. package/esm2015/lib/_web-components/recipe-cards/recipe-card/recipe-card.component.js +4 -3
  14. package/esm2015/lib/_web-components/recipe-catalog/catalog-category/catalog-category.component.js +2 -2
  15. package/esm2015/lib/_web-components/recipe-catalog/catalog-list/catalog-list.component.js +2 -2
  16. package/esm2015/lib/_web-components/recipe-details/recipe-details.component.js +2 -2
  17. package/esm2015/lib/_web-components/recipe-pricing/recipe-pricing.component.js +6 -12
  18. package/esm2015/lib/environments/version.js +2 -2
  19. package/fesm2015/ng-miam.js +20 -54
  20. package/fesm2015/ng-miam.js.map +1 -1
  21. package/lib/_models/basket.d.ts +0 -3
  22. package/lib/_models/basket.d.ts.map +1 -1
  23. package/lib/_services/baskets.service.d.ts +0 -2
  24. package/lib/_services/baskets.service.d.ts.map +1 -1
  25. package/lib/_services/context.service.d.ts.map +1 -1
  26. package/lib/_services/recipes.service.d.ts +1 -1
  27. package/lib/_services/recipes.service.d.ts.map +1 -1
  28. package/lib/_types/builded/mealz-interface.d.ts +0 -6
  29. package/lib/_types/builded/mealz-interface.d.ts.map +1 -1
  30. package/lib/_types/builded/mealz-internal-interface.d.ts +1 -1
  31. package/lib/_types/builded/mealz-internal-interface.d.ts.map +1 -1
  32. package/lib/_web-components/meals-planner/meals-planner.component.d.ts +0 -1
  33. package/lib/_web-components/meals-planner/meals-planner.component.d.ts.map +1 -1
  34. package/lib/_web-components/recipe-pricing/recipe-pricing.component.d.ts +0 -1
  35. package/lib/_web-components/recipe-pricing/recipe-pricing.component.d.ts.map +1 -1
  36. package/lib/environments/version.d.ts +1 -1
  37. package/package.json +1 -1
@@ -31,7 +31,7 @@ import * as i8 from "./ignored-ingredients.service";
31
31
  import * as i9 from "./states.service";
32
32
  import * as i10 from "./price.service";
33
33
  export const BASKET_SPARSE_FIELDS = {
34
- baskets: ['total-price', 'pricebook-key', 'recipes-infos', 'completion', 'status']
34
+ baskets: ['total-price', 'recipes-infos', 'completion', 'status']
35
35
  };
36
36
  export class BasketsService extends Service {
37
37
  constructor(http, basketEntriesService, posService, recipesService, analyticsService, usersService, toasterService, ignoredBasketsService, statesService, priceService) {
@@ -412,26 +412,6 @@ export class BasketsService extends Service {
412
412
  return entry;
413
413
  }));
414
414
  }
415
- /** *********************************************************** PRICEBOOK *********************************************************** **/
416
- // will patch basket with given pricebookName
417
- // Api will look for prices (pos items) corresponding to this pricebook key
418
- // fall case to a default pricebook
419
- updatePricebook(pricebookName) {
420
- if (!pricebookName) {
421
- mealzDebug('[Miam] empty pricebook name');
422
- return of(null);
423
- }
424
- return this.waitForBasket.pipe(switchMap(basket => {
425
- if (basket.pricebookKey === pricebookName) {
426
- mealzDebug(`[Mealz] same pricebook ${JSON.stringify(pricebookName)}`);
427
- return of(null);
428
- }
429
- mealzDebug(`[Mealz] update pricebook to ${JSON.stringify(pricebookName)}`);
430
- const patchUrl = `${e.miamAPI}/api/v1/baskets/update_pricebook?` +
431
- `point_of_sale_id=${this.posService.pos$.value.id}&pricebook_key=${pricebookName}`;
432
- return this.http.patch(patchUrl, {}).pipe(switchMap((resp) => this.fillBasket(resp)));
433
- }));
434
- }
435
415
  /** ******************************************************** ADD FROM PICTURE ******************************************************** **/
436
416
  /**
437
417
  * Add entries to basket from a picture or file
@@ -970,4 +950,4 @@ BasketsService.ɵprov = i0.ɵɵdefineInjectable({ token: BasketsService, factory
970
950
  providedIn: 'root'
971
951
  }]
972
952
  }], function () { return [{ type: i1.HttpClient }, { type: i2.BasketEntriesService }, { type: i3.PointOfSalesService }, { type: i4.RecipesService }, { type: i5.AnalyticsService }, { type: i6.UserService }, { type: i7.ToasterService }, { type: i8.IgnoredIngredientsService }, { type: i9.StatesService }, { type: i10.PriceService }]; }, null); })();
973
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFza2V0cy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctbWlhbS9zcmMvbGliL19zZXJ2aWNlcy9iYXNrZXRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQXdDLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM5RixPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEcsT0FBTyxFQUFFLE1BQU0sRUFBZSxpQkFBaUIsRUFBeUMsTUFBTSxZQUFZLENBQUM7QUFFM0csT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFJckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxJQUFJLENBQUMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hF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Q0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUNoQyxNQUFNO3lCQUNQO3dCQUNELE9BQU8sQ0FBQyxDQUFDOzRCQUNQLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUM5QixNQUFNO3lCQUNQO3FCQUNGO2lCQUNGO3FCQUFNO29CQUNMLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNsQztnQkFDRCxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QixDQUFDLENBQUMsQ0FBQztZQUNMLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF0c0NNLDhCQUFlLEdBQUcsRUFBRSxDQUFDOzRFQURqQixjQUFjO3NEQUFkLGNBQWMsV0FBZCxjQUFjLG1CQUZiLE1BQU07dUZBRVAsY0FBYztjQUgxQixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmbGF0dGVuLCB1bmlvbkJ5IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IHNldEFmZmlsaWF0ZSB9IGZyb20gJ21lYWx6LXNoYXJlZC1hbmFseXRpY3MnO1xuaW1wb3J0IHsgRG9jdW1lbnRDb2xsZWN0aW9uLCBEb2N1bWVudFJlc291cmNlLCBTZXJ2aWNlIH0gZnJvbSAnbWlhbS1qc29uYXBpJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGRlYm91bmNlVGltZSwgbWFwLCBza2lwV2hpbGUsIHN3aXRjaE1hcCwgdGFrZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQmFza2V0LCBCYXNrZXRFbnRyeSwgQmFza2V0UHJldmlld0xpbmUsIEluZ3JlZGllbnQsIEl0ZW0sIExpbmVFbnRyaWVzLCBSZWNpcGUgfSBmcm9tICcuLi9fbW9kZWxzJztcbmltcG9ydCB7IEJhc2tldEFjdGlvbiB9IGZyb20gJy4uL190eXBlcy9iYXNrZXQtYWN0aW9uJztcbmltcG9ydCB7IEJhc2tldEFjdGlvblR5cGUgfSBmcm9tICcuLi9fdHlwZXMvYmFza2V0LWFjdGlvbi10eXBlLmVudW0nO1xuaW1wb3J0IHsgQmFza2V0U3RhdHMgfSBmcm9tICcuLi9fdHlwZXMvYmFza2V0LXN0YXRzJztcbmltcG9ydCB7IENvbXBhcmFibGVQcm9kdWN0IH0gZnJvbSAnLi4vX3R5cGVzL2J1aWxkZWQvY29tcGFyYWJsZS1wcm9kdWN0JztcbmltcG9ydCB7IEV2ZW50VHJhY2UgfSBmcm9tICcuLi9fdHlwZXMvZXZlbnQtdHJhY2UnO1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tICcuLi9fdHlwZXMvbWVzc2FnZS10eXBlLmVudW0nO1xuaW1wb3J0IHsgbWVhbHpEZWJ1ZyB9IGZyb20gJy4uL191dGlscy9tZXRob2RzL2xvZ2dpbmcnO1xuaW1wb3J0IHsgZW52aXJvbm1lbnQgYXMgZSB9IGZyb20gJy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBBbmFseXRpY3NTZXJ2aWNlIH0gZnJvbSAnLi9hbmFseXRpY3Muc2VydmljZSc7XG5pbXBvcnQgeyBCYXNrZXRFbnRyaWVzU2VydmljZSB9IGZyb20gJy4vYmFza2V0LWVudHJpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBJZ25vcmVkSW5ncmVkaWVudHNTZXJ2aWNlIH0gZnJvbSAnLi9pZ25vcmVkLWluZ3JlZGllbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9pbnRPZlNhbGVzU2VydmljZSB9IGZyb20gJy4vcG9pbnQtb2Ytc2FsZXMuc2VydmljZSc7XG5pbXBvcnQgeyBQcmljZVNlcnZpY2UgfSBmcm9tICcuL3ByaWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVjaXBlc1NlcnZpY2UgfSBmcm9tICcuL3JlY2lwZXMuc2VydmljZSc7XG5pbXBvcnQgeyBTdGF0ZXNTZXJ2aWNlIH0gZnJvbSAnLi9zdGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdGVyU2VydmljZSB9IGZyb20gJy4vdG9hc3Rlci5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi91c2VyLnNlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgQkFTS0VUX1NQQVJTRV9GSUVMRFMgPSB7XG4gIGJhc2tldHM6IFsndG90YWwtcHJpY2UnLCAncHJpY2Vib29rLWtleScsICdyZWNpcGVzLWluZm9zJywgJ2NvbXBsZXRpb24nLCAnc3RhdHVzJ11cbn07XG5cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQmFza2V0c1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlPEJhc2tldD4ge1xuICBzdGF0aWMgZW50cmllc1BlclBhZ2VzID0gMzA7XG5cbiAgcmVzb3VyY2UgPSBCYXNrZXQ7XG4gIHR5cGUgPSAnYmFza2V0cyc7XG4gIF9iYXNrZXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxCYXNrZXQ+KG51bGwpO1xuICBfYmFza2V0UHJldmlldyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEJhc2tldFByZXZpZXdMaW5lW10+KG51bGwpO1xuICBiYXNrZXRTdGF0cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEJhc2tldFN0YXRzPihudWxsKTtcbiAgY3VycmVudEFuZFByZXZpZXdGZXRjaGluZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBiYXNrZXRJc0ZldGNoaW5nJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIGJhc2tldFByZXZpZXdJc0NhbGN1bGF0aW5nJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcbiAgYmFza2V0SW5pdENhbGxlZCA9IGZhbHNlO1xuICByZWNpcGVzQWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuICBjb25maXJtaW5nID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGN1cnJlbnRseUFkZGluZ1JlY2lwZXM6IHN0cmluZ1tdID0gW107XG5cbiAgcHJpdmF0ZSBiYXNrZXRBY3Rpb25zUXVldWUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEJhc2tldEFjdGlvbltdPihbXSk7XG4gIHByaXZhdGUgY3VycmVudFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF9lbnRyaWVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QmFza2V0RW50cnlbXT4oW10pO1xuICBwcml2YXRlIGFjdGlvbnNCZWluZ1Byb2Nlc3NlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QmFza2V0QWN0aW9uW10+KFtdKTtcbiAgcHJpdmF0ZSBhY3Rpb25zQmVpbmdPdmVycmlkZGVuOiBCYXNrZXRBY3Rpb25bXSA9IFtdO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgYmFza2V0RW50cmllc1NlcnZpY2U6IEJhc2tldEVudHJpZXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgcG9zU2VydmljZTogUG9pbnRPZlNhbGVzU2VydmljZSxcbiAgICBwcml2YXRlIHJlY2lwZXNTZXJ2aWNlOiBSZWNpcGVzU2VydmljZSxcbiAgICBwcml2YXRlIGFuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2Vyc1NlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RlclNlcnZpY2U6IFRvYXN0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgaWdub3JlZEJhc2tldHNTZXJ2aWNlOiBJZ25vcmVkSW5ncmVkaWVudHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RhdGVzU2VydmljZTogU3RhdGVzU2VydmljZSxcbiAgICBwcml2YXRlIHByaWNlU2VydmljZTogUHJpY2VTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yZWdpc3RlcigpO1xuICAgIHRoaXMuaW5pdFF1ZXVlRW1wdHlpbmcoKTtcbiAgICB0aGlzLmluaXRUb2FzdGVyT25SZWNpcGVBZGRlZCgpO1xuICB9XG5cbiAgLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBHRVRURVJTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi9cblxuICAvKipcbiAgICogV2Ugd2FudCBiYXNrZXQkIHRvIGJlIGEgc2luZ2xldG9uIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgYmFza2V0LCBzbyBpdCBpcyBmZXRjaGVkIG9ubHkgd2hlbiBuZWNlc3NhcnkuXG4gICAqIEF0IGFueSBwb2ludCBpbiB0aW1lIHRoZSBiYXNrZXQgY2FuIGJlIGZldGNoZWQgdmlhIHRoZSBpbml0QmFza2V0IGZ1bmN0aW9uIChpZiB3ZSB3YW50IHRvIGZldGNoIGl0IG9uIHN0YXJ0dXAgdG8gc2F2ZSB0aW1lIGxhdGVyKVxuICAgKiBCdXQgaWYgaW5pdEJhc2tldCBpcyBub3QgY2FsbGVkLCB0aGUgYmFza2V0IHdpbGwgb25seSBiZSBmZXRjaGVkIHRoZSAxc3QgdGltZSBpdCBpcyBuZWVkZWQuXG4gICAqL1xuICBnZXQgYmFza2V0JCgpOiBCZWhhdmlvclN1YmplY3Q8QmFza2V0PiB7XG4gICAgaWYgKCF0aGlzLl9iYXNrZXQkLnZhbHVlICYmICF0aGlzLmJhc2tldElzRmV0Y2hpbmckLnZhbHVlKSB7XG4gICAgICB0aGlzLmJhc2tldElzRmV0Y2hpbmckLm5leHQodHJ1ZSk7XG4gICAgICB0aGlzLmluaXRCYXNrZXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Jhc2tldCQ7XG4gIH1cblxuICAvKipcbiAgICogYmFza2V0UHJldmlldyQgc2hvdWxkIGFsc28gYmUgYSBzaW5nbGV0b24sIGFuZCBhcyB3ZWxsIGFzIGJhc2tldCQgaXQgd2lsbCBiZSBjYWxjdWxhdGVkIGZvciB0aGUgZmlyc3QgdGltZSBvbmx5IHdoZW4gbmVjZXNzYXJ5XG4gICAqIG9yIGlmIGxvYWRQcmV2aWV3IGlzIGNhbGxlZCBiZWZvcmVcbiAgICovXG4gIGdldCBiYXNrZXRQcmV2aWV3JCgpOiBCZWhhdmlvclN1YmplY3Q8QmFza2V0UHJldmlld0xpbmVbXT4ge1xuICAgIGlmICghdGhpcy5fYmFza2V0UHJldmlldyQudmFsdWUgJiYgIXRoaXMuYmFza2V0UHJldmlld0lzQ2FsY3VsYXRpbmckLnZhbHVlKSB7XG4gICAgICB0aGlzLmJhc2tldFByZXZpZXdJc0NhbGN1bGF0aW5nJC5uZXh0KHRydWUpO1xuICAgICAgdGhpcy5pbml0QmFza2V0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9iYXNrZXRQcmV2aWV3JDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyB1c2Ugd2hlbiBuZWVkaW5nIHRvIGJlIHN1cmUgdGhhdCBiYXNrZXQgd2FzIGZldGNoZWQgYmVmb3JlIGRvaW5nIGFuIGFjdGlvbiB0aGF0IGRvZXNuJ3QgbmVlZCB0byBzdGF5IHN1YnNjcmliZWQgdG8gYmFza2V0JFxuICAgKiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSBhbiBlcXVpdmFsZW50IG9mIGJhc2tldCQudmFsdWUgYnV0IGFzeW5jaHJvbm91c1xuICAgKi9cbiAgZ2V0IHdhaXRGb3JCYXNrZXQoKTogT2JzZXJ2YWJsZTxCYXNrZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5iYXNrZXQkLnBpcGUoXG4gICAgICBza2lwV2hpbGUoYiA9PiAhYiksXG4gICAgICB0YWtlKDEpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyB1c2Ugd2hlbiBuZWVkaW5nIHRvIGJlIHN1cmUgdGhhdCBiYXNrZXQgd2FzIGZldGNoZWQgYmVmb3JlIGRvaW5nIGFuIGFjdGlvbiB0aGF0IGRvZXNuJ3QgbmVlZCB0byBzdGF5IHN1YnNjcmliZWQgdG8gYmFza2V0JFxuICAgKiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSBhbiBlcXVpdmFsZW50IG9mIGJhc2tldCQudmFsdWUgYnV0IGFzeW5jaHJvbm91c1xuICAgKi9cbiAgZ2V0IHdhaXRGb3JCYXNrZXRFbnRyaWVzKCk6IE9ic2VydmFibGU8QmFza2V0RW50cnlbXT4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFt0aGlzLl9lbnRyaWVzJCwgdGhpcy5iYXNrZXRQcmV2aWV3SXNDYWxjdWxhdGluZyRdKS5waXBlKFxuICAgICAgc2tpcFdoaWxlKChbYiwgYnBDYWxjdWxhdGluZ10pID0+ICFiIHx8ICF0aGlzLmJhc2tldEluaXRDYWxsZWQgfHwgYnBDYWxjdWxhdGluZyksXG4gICAgICB0YWtlKDEpLFxuICAgICAgbWFwKChbYl0pID0+IGIpXG4gICAgKTtcbiAgfVxuXG5cbiAgcmVjaXBlc0luQmFza2V0JCgpOiBPYnNlcnZhYmxlPHsgaWQ6IHN0cmluZzsgcHJpY2U6IHN0cmluZyB9W10+IHtcbiAgICByZXR1cm4gdGhpcy5iYXNrZXRQcmV2aWV3JC5waXBlKFxuICAgICAgc2tpcFdoaWxlKHByZXZpZXcgPT4gIXByZXZpZXcgfHwgcHJldmlldy5sZW5ndGggPT09IDApLFxuICAgICAgbWFwKChhcnJheTogQmFza2V0UHJldmlld0xpbmVbXSkgPT4gYXJyYXkubWFwKGl0ZW0gPT4gKHtcbiAgICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICAgIHByaWNlOiBpdGVtLnByaWNlXG4gICAgICB9KSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5JVCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovXG5cbiAgcHJpdmF0ZSBpbml0UXVldWVFbXB0eWluZygpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgzNTApLFxuICAgICAgICBza2lwV2hpbGUoYWN0aW9ucyA9PiBhY3Rpb25zLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmFjdGlvbnNCZWluZ1Byb2Nlc3NlZC52YWx1ZS5sZW5ndGggPiAwKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuZW1wdHlBY3Rpb25zUXVldWUoKSlcbiAgICAgICkuc3Vic2NyaWJlKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0VG9hc3Rlck9uUmVjaXBlQWRkZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjaXBlc1NlcnZpY2UuY29uZmlybWF0aW9uVG9hc3Rlcikge1xuICAgICAgdGhpcy5zaG93UmVjaXBlQWRkZWRUb2FzdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFFVRVVFIFVUSUxTIFRPIExPQ0sgTU9SRSBBQ1RJT05TIE9SIERJU1BMQVkgTE9BREVSUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi9cblxuICAvLyBVdGlsIG1ldGhvZCB0byBhdm9pZCByZXBlYXRpbmcgdG9vIG11Y2ggZm9yIHRoZSBuZXh0IDYgbWV0aG9kc1xuICBwcml2YXRlIHN1YmplY3RDb250YWluc1JlY2lwZUlkKHN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxCYXNrZXRBY3Rpb25bXT4sIHR5cGU6IEJhc2tldEFjdGlvblR5cGUsIHJlY2lwZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB0eXBlTWF0Y2ggPSAoYTogQmFza2V0QWN0aW9uKTogYm9vbGVhbiA9PiB0eXBlID09PSBhLnR5cGU7XG4gICAgcmV0dXJuIHN1YmplY3QucGlwZShtYXAodmFsdWUgPT4gdmFsdWUuc29tZShhID0+IHR5cGVNYXRjaChhKSAmJiBhLnBhcmFtcy5yZWNpcGVJZCA9PT0gcmVjaXBlSWQpKSk7XG4gIH1cblxuICAvLyBVdGlsIG1ldGhvZCB0byBhdm9pZCByZXBlYXRpbmcgdG9vIG11Y2ggZm9yIHRoZSBuZXh0IDYgbWV0aG9kc1xuICBwcml2YXRlIHN1YmplY3RDb250YWluc0luZ3JlZGllbnRJZChcbiAgICBzdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QmFza2V0QWN0aW9uW10+LCB0eXBlOiBCYXNrZXRBY3Rpb25UeXBlLCBpbmdyZWRpZW50SWQ6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gc3ViamVjdC5waXBlKG1hcCh2YWx1ZSA9PiB2YWx1ZS5zb21lKGEgPT4gYS50eXBlID09PSB0eXBlICYmIGEucGFyYW1zLmluZ3JlZGllbnRJZCA9PT0gaW5ncmVkaWVudElkKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJqZWN0Q29udGFpbnNFbnRyeUlkKFxuICAgIHN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxCYXNrZXRBY3Rpb25bXT4sIHR5cGU6IEJhc2tldEFjdGlvblR5cGUsIGVudHJ5SWQ6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gc3ViamVjdC5waXBlKG1hcCh2YWx1ZSA9PiB2YWx1ZS5zb21lKGEgPT4gYS50eXBlID09PSB0eXBlICYmIGEucGFyYW1zLmJhc2tldEVudHJ5Py5pZCA9PT0gZW50cnlJZCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3ViamVjdENvbnRhaW5zSXRlbUlkKFxuICAgIHN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxCYXNrZXRBY3Rpb25bXT4sIHR5cGU6IEJhc2tldEFjdGlvblR5cGUsIGl0ZW1JZDogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBzdWJqZWN0LnBpcGUobWFwKHZhbHVlID0+IHZhbHVlLnNvbWUoYSA9PiBhLnR5cGUgPT09IHR5cGUgJiYgYS5wYXJhbXMuaXRlbS5pZCA9PT0gaXRlbUlkKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJqZWN0Q29udGFpbnNBY3Rpb25UeXBlKFxuICAgIHN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxCYXNrZXRBY3Rpb25bXT4sIHR5cGU6IEJhc2tldEFjdGlvblR5cGVcbiAgKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHN1YmplY3QucGlwZShtYXAodmFsdWUgPT4gdmFsdWUuc29tZShhID0+IGEudHlwZSA9PT0gdHlwZSkpKTtcbiAgfVxuXG4gIHJlY2lwZVdpbGxCZUFkZGVkKHJlY2lwZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0Q29udGFpbnNSZWNpcGVJZCh0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZSwgQmFza2V0QWN0aW9uVHlwZS5BRERfUkVDSVBFLCByZWNpcGVJZCk7XG4gIH1cblxuICByZWNpcGVXaWxsQmVSZW1vdmVkKHJlY2lwZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0Q29udGFpbnNSZWNpcGVJZCh0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZSwgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUkVDSVBFLCByZWNpcGVJZCk7XG4gIH1cblxuICByZWNpcGVXaWxsQmVVcGRhdGVkKHJlY2lwZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0Q29udGFpbnNSZWNpcGVJZCh0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZSwgQmFza2V0QWN0aW9uVHlwZS5VUERBVEVfUkVDSVBFLCByZWNpcGVJZCk7XG4gIH1cblxuICByZWNpcGVJc0JlaW5nQWRkZWQocmVjaXBlSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3RDb250YWluc1JlY2lwZUlkKHRoaXMuYWN0aW9uc0JlaW5nUHJvY2Vzc2VkLCBCYXNrZXRBY3Rpb25UeXBlLkFERF9SRUNJUEUsIHJlY2lwZUlkKTtcbiAgfVxuXG4gIHJlY2lwZUlzQmVpbmdSZW1vdmVkKHJlY2lwZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0Q29udGFpbnNSZWNpcGVJZCh0aGlzLmFjdGlvbnNCZWluZ1Byb2Nlc3NlZCwgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUkVDSVBFLCByZWNpcGVJZCk7XG4gIH1cblxuICByZWNpcGVJc0JlaW5nVXBkYXRlZChyZWNpcGVJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zUmVjaXBlSWQodGhpcy5hY3Rpb25zQmVpbmdQcm9jZXNzZWQsIEJhc2tldEFjdGlvblR5cGUuVVBEQVRFX1JFQ0lQRSwgcmVjaXBlSWQpO1xuICB9XG5cbiAgaW5ncmVkaWVudFdpbGxCZUFkZGVkKGluZ3JlZGllbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zSW5ncmVkaWVudElkKHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLCBCYXNrZXRBY3Rpb25UeXBlLkFERF9QUk9EVUNULCBpbmdyZWRpZW50SWQpO1xuICB9XG5cbiAgaW5ncmVkaWVudElzQmVpbmdSZW1vdmVkKGluZ3JlZGllbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zSW5ncmVkaWVudElkKHRoaXMuYWN0aW9uc0JlaW5nUHJvY2Vzc2VkLCBCYXNrZXRBY3Rpb25UeXBlLlJFTU9WRV9QUk9EVUNULCBpbmdyZWRpZW50SWQpO1xuICB9XG5cbiAgaW5ncmVkaWVudFdpbGxCZVJlbW92ZWQoaW5ncmVkaWVudElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0Q29udGFpbnNJbmdyZWRpZW50SWQodGhpcy5iYXNrZXRBY3Rpb25zUXVldWUsIEJhc2tldEFjdGlvblR5cGUuUkVNT1ZFX1BST0RVQ1QsIGluZ3JlZGllbnRJZCk7XG4gIH1cblxuICBlbnRyeVdpbGxCZVJlbW92ZWQoZW50cnlJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zRW50cnlJZCh0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZSwgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVCwgZW50cnlJZCk7XG4gIH1cblxuICBlbnRyaWVzV2lsbEJlUmVtb3ZlZEZyb21SZWNpcGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zQWN0aW9uVHlwZSh0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZSwgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVF9GUk9NX1JFQ0lQRSk7XG4gIH1cblxuICBlbnRyeUlzQmVpbmdSZW1vdmVkKGVudHJ5SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3RDb250YWluc0VudHJ5SWQodGhpcy5hY3Rpb25zQmVpbmdQcm9jZXNzZWQsIEJhc2tldEFjdGlvblR5cGUuUkVNT1ZFX1BST0RVQ1QsIGVudHJ5SWQpO1xuICB9XG5cbiAgZW50cmllc0FyZUJlaW5nUmVtb3ZlZEZyb21SZWNpcGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zQWN0aW9uVHlwZSh0aGlzLmFjdGlvbnNCZWluZ1Byb2Nlc3NlZCwgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVF9GUk9NX1JFQ0lQRSk7XG4gIH1cblxuICBlbnRyeVdpbGxCZVVwZGF0ZWQoZW50cnlJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zRW50cnlJZCh0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZSwgQmFza2V0QWN0aW9uVHlwZS5VUERBVEVfUFJPRFVDVCwgZW50cnlJZCk7XG4gIH1cblxuICBlbnRyeUlzQmVpbmdVcGRhdGVkKGVudHJ5SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3RDb250YWluc0VudHJ5SWQodGhpcy5hY3Rpb25zQmVpbmdQcm9jZXNzZWQsIEJhc2tldEFjdGlvblR5cGUuVVBEQVRFX1BST0RVQ1QsIGVudHJ5SWQpO1xuICB9XG5cbiAgaXRlbVdpbGxCZUFkZGVkKGl0ZW1JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zSXRlbUlkKHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLCBCYXNrZXRBY3Rpb25UeXBlLkFERF9JVEVNLCBpdGVtSWQpO1xuICB9XG5cbiAgcmVjaXBlc1dpbGxCZUFkZGVkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5waXBlKG1hcChxdWV1ZSA9PiBxdWV1ZS5zb21lKGEgPT4gYS50eXBlID09PSBCYXNrZXRBY3Rpb25UeXBlLkFERF9SRUNJUEUpKSk7XG4gIH1cblxuICByZWNpcGVzV2lsbEJlUmVtb3ZlZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5iYXNrZXRBY3Rpb25zUXVldWUucGlwZShtYXAocXVldWUgPT4gcXVldWUuc29tZShhID0+IGEudHlwZSA9PT0gQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUkVDSVBFKSkpO1xuICB9XG5cbiAgcmVjaXBlc1dpbGxCZVVwZGF0ZWQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnBpcGUobWFwKHF1ZXVlID0+IHF1ZXVlLnNvbWUoYSA9PiBhLnR5cGUgPT09IEJhc2tldEFjdGlvblR5cGUuVVBEQVRFX1JFQ0lQRSkpKTtcbiAgfVxuXG4gIHByb2R1Y3RzV2lsbEJlQWRkZWQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5iYXNrZXRBY3Rpb25zUXVldWUucGlwZShtYXAocXVldWUgPT4gcXVldWUuZmlsdGVyKGEgPT4gYS50eXBlID09PSBCYXNrZXRBY3Rpb25UeXBlLkFERF9QUk9EVUNUKS5sZW5ndGgpKTtcbiAgfVxuXG4gIHByb2R1Y3RzV2lsbEJlVXBkYXRlZCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5waXBlKG1hcChxdWV1ZSA9PiBxdWV1ZS5maWx0ZXIoYSA9PiBhLnR5cGUgPT09IEJhc2tldEFjdGlvblR5cGUuVVBEQVRFX1BST0RVQ1QpLmxlbmd0aCkpO1xuICB9XG5cbiAgcHJvZHVjdHNXaWxsQmVSZW1vdmVkKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnBpcGUobWFwKHF1ZXVlID0+IHF1ZXVlLmZpbHRlcihhID0+IGEudHlwZSA9PT0gQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVCkubGVuZ3RoKSk7XG4gIH1cblxuICBwcm9kdWN0c0FyZUJlaW5nUmVtb3ZlZCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLmFjdGlvbnNCZWluZ1Byb2Nlc3NlZC5waXBlKG1hcChxdWV1ZSA9PiBxdWV1ZS5maWx0ZXIoYSA9PiBhLnR5cGUgPT09IEJhc2tldEFjdGlvblR5cGUuUkVNT1ZFX1BST0RVQ1QpLmxlbmd0aCkpO1xuICB9XG5cbiAgLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVVRJTFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi9cblxuICAvLyBDaGVjayBpZiB0aGUgcmVjaXBlSWQgaXMgaW4gdGhlIEJhc2tldCdzIHJlY2lwZXMtaW5mb3NcbiAgcmVjaXBlSXNJbkJhc2tldChyZWNpcGVJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuYmFza2V0JC5waXBlKFxuICAgICAgc2tpcFdoaWxlKGIgPT4gIWIpLFxuICAgICAgbWFwKGJhc2tldCA9PiBiYXNrZXQuaGFzUmVjaXBlKHJlY2lwZUlkKSlcbiAgICApO1xuICB9XG5cbiAgZ3Vlc3RzRm9yUmVjaXBlKHJlY2lwZUlkOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmJhc2tldCQudmFsdWU/Lmd1ZXN0c0ZvclJlY2lwZShyZWNpcGVJZCk7XG4gIH1cblxuICBwcml2YXRlIHNob3dSZWNpcGVBZGRlZFRvYXN0ZXIoKTogdm9pZCB7XG4gICAgbGV0IHByZXZpb3VzTnVtYmVyT2ZQcm9kdWN0VG9BZGQgPSAwO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5fZW50cmllcyQuc3Vic2NyaWJlKChlbnRyaWVzOiBCYXNrZXRFbnRyeVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvdGFsRW50cmllcyA9XG4gICAgICAgICAgZW50cmllcy5yZWR1Y2UoKHByZXZpb3VzVmFsdWU6IG51bWJlciwgY3VycmVudFZhbHVlOiBCYXNrZXRFbnRyeSkgPT5cbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZS5zdGF0dXMgPT09ICdhY3RpdmUnID8gKHByZXZpb3VzVmFsdWUgKyBjdXJyZW50VmFsdWUucXVhbnRpdHkpIDogcHJldmlvdXNWYWx1ZSwgMCk7XG4gICAgICAgIGlmIChwcmV2aW91c051bWJlck9mUHJvZHVjdFRvQWRkIDwgdG90YWxFbnRyaWVzKSB7XG4gICAgICAgICAgY29uc3QgYXJ0aWNsZSA9IHRvdGFsRW50cmllcyAtIHByZXZpb3VzTnVtYmVyT2ZQcm9kdWN0VG9BZGQgPT09IDEgPyAnYXJ0aWNsZSBham91dMOpJyA6ICdhcnRpY2xlcyBham91dMOpcyc7XG4gICAgICAgICAgY29uc3QgbXNnID0gYCR7dG90YWxFbnRyaWVzIC0gcHJldmlvdXNOdW1iZXJPZlByb2R1Y3RUb0FkZH0gJHthcnRpY2xlfSDDoCB2b3RyZSBwYW5pZXJgO1xuICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uuc2hvdyhNZXNzYWdlVHlwZS5TdWNjZXNzLCBtc2csICcnLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcHJldmlvdXNOdW1iZXJPZlByb2R1Y3RUb0FkZCA9IHRvdGFsRW50cmllcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMT0FEIC8gUkVMT0FEIC8gUkVTRVQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovXG5cbiAgcmVsb2FkQmFza2V0KCk6IE9ic2VydmFibGU8QmFza2V0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVmcmVzaEN1cnJlbnRCYXNrZXQoKS5waXBlKHRha2UoMSkpO1xuICB9XG5cbiAgaW5pdEJhc2tldCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYmFza2V0SW5pdENhbGxlZCkge1xuICAgICAgdGhpcy5iYXNrZXRJbml0Q2FsbGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMubG9hZEJhc2tldCgpLnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5sb2FkUHJldmlldygpLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHJlZnJlc2hDdXJyZW50QmFza2V0KCk6IE9ic2VydmFibGU8QmFza2V0PiB7XG4gICAgdGhpcy5jdXJyZW50QW5kUHJldmlld0ZldGNoaW5nLm5leHQodHJ1ZSk7XG4gICAgcmV0dXJuIHRoaXMucG9zU2VydmljZS53YWl0Rm9yUG9zLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgc3dpdGNoTWFwKHBvcyA9PiB7XG4gICAgICAgIG1lYWx6RGVidWcoJ1tNZWFsel0gcmVmcmVzaGluZyBiYXNrZXQnKTtcblxuICAgICAgICBjb25zdCBhdXRobGVzc0lkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ19taWFtL2F1dGhsZXNzSWQnKTtcbiAgICAgICAgY29uc3QgdXNlcklkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ19taWFtL3VzZXJJZCcpO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2tldE9ic2VydmFibGUgPSAoYXV0aGxlc3NJZCAmJiB1c2VySWQpXG4gICAgICAgICAgPyB0aGlzLnRyYW5zZmVyQXV0aGxlc3NCYXNrZXQocG9zLmlkLCBhdXRobGVzc0lkKVxuICAgICAgICAgIDogdGhpcy5mZXRjaEN1cnJlbnRCYXNrZXQocG9zLmlkKTtcblxuICAgICAgICBpZiAoYXV0aGxlc3NJZCAmJiB1c2VySWQpIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnX21pYW0vYXV0aGxlc3NJZCcpO1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdfbWlhbS9hdXRobGVzcy1mb3JiaWQtcHJvZmlsaW5nJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmN1cnJlbnRTdWJzY3JpcHRpb24gPSBiYXNrZXRPYnNlcnZhYmxlLnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmNoZWNrSWZJc0FmZmlsaWF0ZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2tldCQ7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSWZJc0FmZmlsaWF0ZWQoKTogdm9pZCB7XG4gICAgY29uc3QgZ2V0QWZmaWxpYXRlZFVybCA9IGAke2UubWlhbUFQSX0vYXBpL3YxL2Jhc2tldHMvYWZmaWxpYXRlZGA7XG4gICAgdGhpcy5odHRwLmdldDx7IGFmZmlsaWF0ZWQ6IHN0cmluZyB8IG51bGwgfT4oZ2V0QWZmaWxpYXRlZFVybCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoXG4gICAgICByZXNwb25zZSA9PiB7XG4gICAgICAgIGNvbnN0IGFmZmlsaWF0ZWQgPSByZXNwb25zZT8uYWZmaWxpYXRlZDtcbiAgICAgICAgaWYgKGFmZmlsaWF0ZWQpIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnX21pYW0vYWZmaWxpYXRlZCcsIGFmZmlsaWF0ZWQpO1xuICAgICAgICAgIHNldEFmZmlsaWF0ZShhZmZpbGlhdGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnX21pYW0vYWZmaWxpYXRlZCcpO1xuICAgICAgICAgIHNldEFmZmlsaWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZmVyQXV0aGxlc3NCYXNrZXQocG9zSWQ6IHN0cmluZywgYXV0aGxlc3NJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0ZXNTZXJ2aWNlLmNhbGxBdXRobGVzc1RyYW5zZmVyLm5leHQoKTtcbiAgICBjb25zdCB0cmFuc2ZlckF1dGhsZXNzQmFza2V0VXJsID1cbiAgICAgIGAke2UubWlhbUFQSX0vYXBpL3YxL2Jhc2tldHMvdHJhbnNmZXJfYXV0aGxlc3M/cG9pbnRfb2Zfc2FsZV9pZD0ke3Bvc0lkfSZhdXRobGVzc191c2VyX2lkPSR7YXV0aGxlc3NJZH1gO1xuICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2godHJhbnNmZXJBdXRobGVzc0Jhc2tldFVybCwge30pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHJlc3BvbnNlOiBEb2N1bWVudFJlc291cmNlPEJhc2tldD4pID0+IHtcbiAgICAgICAgY29uc3QgY29uZmlybWVkQmFza2V0OiBCYXNrZXQgPSB0aGlzLm5ldygpO1xuICAgICAgICBjb25maXJtZWRCYXNrZXQuZmlsbChyZXNwb25zZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUxvY2FsQmFza2V0KGNvbmZpcm1lZEJhc2tldCk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT5cbiAgICAgICAgLy8gSWYgYXV0aGxlc3MgdHJhbnNmZXIgcmV0dXJuZWQgYW4gZXJyb3IsIHRoZXJlIG1pZ2h0IGJlIHNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSBiYXNrZXRJZCBpbiBsb2NhbFN0b3JhZ2UsIHRodXMgd2UgZmV0Y2hDdXJyZW50XG4gICAgICAgIHRoaXMuZmV0Y2hDdXJyZW50QmFza2V0KHBvc0lkKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoQ3VycmVudEJhc2tldChwb3NJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgZ2V0VXJsID0gYGN1cnJlbnQ/cG9pbnRfb2Zfc2FsZV9pZD0ke3Bvc0lkfSZmaWVsZHNbYmFza2V0c109JHtCQVNLRVRfU1BBUlNFX0ZJRUxEUy5iYXNrZXRzLmpvaW4oJywnKX1gO1xuICAgIHJldHVybiB0aGlzLmdldChnZXRVcmwpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoYmFza2V0ID0+IHRoaXMudXBkYXRlTG9jYWxCYXNrZXQoYmFza2V0KSksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5wb3NTZXJ2aWNlLmVtaXRCYXNrZXRMb2FkZWRGb3JOZXdQb3MoKSlcbiAgICApO1xuICB9XG5cbiAgcmVzZXRCYXNrZXQoZXZlbnRUcmFjZTogRXZlbnRUcmFjZSA9IHsgb3JpZ2luUGF0aDogJycsIHByb3BzOiB7fSB9KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgbWVhbHpEZWJ1ZygnW01lYWx6XSByZXNldHRpbmcgYmFza2V0Jyk7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ19taWFtL2FmZmlsaWF0ZScpO1xuICAgIHNldEFmZmlsaWF0ZShudWxsKTtcbiAgICB0aGlzLmlnbm9yZWRCYXNrZXRzU2VydmljZS5yZXNldElnbm9yZWRJbmdyZWRpZW50cygpO1xuICAgIHJldHVybiB0aGlzLnBvc1NlcnZpY2Uud2FpdEZvclBvcy5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIHN3aXRjaE1hcChwb3MgPT4gdGhpcy53YWl0Rm9yQmFza2V0LnBpcGUoXG4gICAgICAgIHRhcChiYXNrZXQgPT4gdGhpcy5hbmFseXRpY3NTZXJ2aWNlLnNlbmRFdmVudHNPZlJlc2V0QmFza2V0KGJhc2tldCwgZXZlbnRUcmFjZSkpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5nZXQoYHJlc2V0P3BvaW50X29mX3NhbGVfaWQ9JHtwb3MuaWR9JmZpZWxkc1tiYXNrZXRzXT0ke0JBU0tFVF9TUEFSU0VfRklFTERTLmJhc2tldHMuam9pbignLCcpfWApLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKGJhc2tldCA9PiB0aGlzLnVwZGF0ZUxvY2FsQmFza2V0KGJhc2tldCkpXG4gICAgICAgICkpXG4gICAgICApKVxuICAgICk7XG4gIH1cblxuICAvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTkZJUk0gQkFTS0VUICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi9cblxuICAvKipcbiAgICogU2VuZHMgcGF5bWVudC5jb25maXJtIGV2ZW50IHRoZW4gY29uZmlybSBiYXNrZXQgaWYgcmV0YWlsZXIncyBjYXJ0IHByaWNlIGFuZCBNZWFseiBiYXNrZXQgcHJpY2UgYXJlIGJvdGggbm9uLXplcm9cbiAgICogQHBhcmFtIHRvdGFsUHJpY2UgVGhlIHByaWNlIG9mIHJldGFpbGVyJ3MgYmFza2V0XG4gICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IGJhc2tldFxuICAgKi9cbiAgY29uZmlybVBheW1lbnRBbmRCYXNrZXQodG90YWxQcmljZTogbnVtYmVyIHwgc3RyaW5nKTogT2JzZXJ2YWJsZTxCYXNrZXQ+IHtcbiAgICB0aGlzLmNvbmZpcm1pbmcubmV4dCh0cnVlKTtcbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQmFza2V0LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoYmFza2V0ID0+IHtcbiAgICAgICAgaWYgKCt0b3RhbFByaWNlID4gMCAmJiBiYXNrZXQudG90YWxQcmljZSA+IDApIHtcbiAgICAgICAgICB0aGlzLmFuYWx5dGljc1NlcnZpY2Uuc2VuZEV2ZW50KFxuICAgICAgICAgICAgJ3BheW1lbnQuY29uZmlybWVkJyxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBiYXNrZXRfaWQ6IGJhc2tldC5pZCxcbiAgICAgICAgICAgICAgbWlhbV9hbW91bnQ6IGJhc2tldC50b3RhbFByaWNlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIHRvdGFsX2Ftb3VudDogdG90YWxQcmljZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICBwb3NfaWQ6IHRoaXMucG9zU2VydmljZS5wb3MkLmdldFZhbHVlKCkuaWQsXG4gICAgICAgICAgICAgIHBvc19uYW1lOiB0aGlzLnBvc1NlcnZpY2UucG9zJC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZXMubmFtZSxcbiAgICAgICAgICAgICAgc3VwcGxpZXJfaWQ6IHRoaXMucG9zU2VydmljZS5wb3MkLmdldFZhbHVlKCkucmVsYXRpb25zaGlwcy5zdXBwbGllci5kYXRhLmlkLFxuICAgICAgICAgICAgICByZWNpcGVfY291bnQ6IGJhc2tldC5yZWNpcGVJbmZvcy5sZW5ndGgudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgbWlhbV9wcm9kdWN0czogYmFza2V0LmVudHJpZXMubGVuZ3RoLnRvU3RyaW5nKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpcm1CYXNrZXQoYmFza2V0LCB0b3RhbFByaWNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYmFza2V0JDtcbiAgICAgIH0pLFxuICAgICAgdGFwKCgpID0+IHRoaXMuY29uZmlybWluZy5uZXh0KGZhbHNlKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIGNvbmZpcm0gYmFza2V0LiBTZW5kcyBhbmFseXRpYyBldmVudCBhbmQgcmVmcmVzaCBjdXJyZW50IGJhc2tldCBvbiBzdWNjZXNzZnVsbCBjb25maXJtYXRpb25cbiAgICovXG4gIHByaXZhdGUgY29uZmlybUJhc2tldChiYXNrZXQ6IEJhc2tldCwgdG90YWxQcmljZTogbnVtYmVyIHwgc3RyaW5nKTogT2JzZXJ2YWJsZTxCYXNrZXQ+IHtcbiAgICBtZWFsekRlYnVnKCdbTWVhbHpdIENvbmZpcm0gTWVhbHogYmFza2V0Jyk7XG4gICAgcmV0dXJuIHRoaXMucG9zU2VydmljZS53YWl0Rm9yUG9zLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgc3dpdGNoTWFwKHBvcyA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGNoVXJsID0gYCR7ZS5taWFtQVBJfS9hcGkvdjEvYmFza2V0cy9jb25maXJtP3BvaW50X29mX3NhbGVfaWQ9JHtwb3MuaWR9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaChwYXRjaFVybCwge30pO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSxcbiAgICAgIHN3aXRjaE1hcChyZXN1bHQgPT4ge1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiBvZihudWxsIGFzIEJhc2tldCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLnNlbmRFdmVudChcbiAgICAgICAgICAnYmFza2V0LmNvbmZpcm1lZCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmFza2V0X2lkOiBiYXNrZXQuaWQsXG4gICAgICAgICAgICBtaWFtX2Ftb3VudDogYmFza2V0LnRvdGFsUHJpY2UudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRvdGFsX2Ftb3VudDogdG90YWxQcmljZS50b1N0cmluZygpLFxuICAgICAgICAgICAgcG9zX2lkOiB0aGlzLnBvc1NlcnZpY2UucG9zJC5nZXRWYWx1ZSgpLmlkLFxuICAgICAgICAgICAgcG9zX25hbWU6IHRoaXMucG9zU2VydmljZS5wb3MkLmdldFZhbHVlKCkuYXR0cmlidXRlcy5uYW1lLFxuICAgICAgICAgICAgc3VwcGxpZXJfaWQ6IHRoaXMucG9zU2VydmljZS5wb3MkLmdldFZhbHVlKCkucmVsYXRpb25zaGlwcy5zdXBwbGllci5kYXRhLmlkLFxuICAgICAgICAgICAgcmVjaXBlX2NvdW50OiBiYXNrZXQucmVjaXBlSW5mb3MubGVuZ3RoLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBtaWFtX3Byb2R1Y3RzOiBiYXNrZXQuZW50cmllcy5sZW5ndGgudG9TdHJpbmcoKVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaEN1cnJlbnRCYXNrZXQoKTtcbiAgICAgIH0pLFxuICAgICAgdGFrZSgxKVxuICAgICk7XG4gIH1cblxuICAvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQ1RJT05TIE9OIEVOVFJJRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi9cblxuICBiYXNrZXRFbnRyaWVzKCk6IE9ic2VydmFibGU8QmFza2V0RW50cnlbXT4ge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzJDtcbiAgfVxuXG4gIGFjdGl2ZUJhc2tldEVudHJpZXMoKTogT2JzZXJ2YWJsZTxCYXNrZXRFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuYmFza2V0RW50cmllcygpLnBpcGUoXG4gICAgICBtYXAoKGVudHJpZXM6IEJhc2tldEVudHJ5W10pID0+IGVudHJpZXMuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LnN0YXR1cyA9PT0gJ2FjdGl2ZScpKVxuICAgICk7XG4gIH1cblxuICAvLyBEZWNyZWFzZSBxdWFudGl0eSBvbiBhIGxpc3Qgb2YgYmFza2V0IGVudHJpZXNcbiAgLy8gSWYgdGhlIHF1YW50aXR5IGdvZXMgYmVsb3cgMSwgdGhlIGNvcnJlc3BvbmRpbmcgZ3JvY2VyaWVzIGVudHJ5J3Mgc3RhdHVzIGdldHMgZGVsZXRlZFxuICAvLyBSZWxvYWQgYmFza2V0IGFmdGVyIGFsbCBvYmplY3RzIGFyZSBzYXZlZFxuICByZW1vdmVCYXNrZXRFbnRyaWVzKGVudHJpZXNUb1JlbW92ZTogQ29tcGFyYWJsZVByb2R1Y3RbXSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKCF0aGlzLl9lbnRyaWVzJC52YWx1ZSkge1xuICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IHNhdmVPYnNlcnZhYmxlczogT2JzZXJ2YWJsZTxhbnk+W10gPSBlbnRyaWVzVG9SZW1vdmUubWFwKGVudHJ5VG9SZW1vdmUgPT4gdGhpcy5yZW1vdmVCYXNrZXRFbnRyeShlbnRyeVRvUmVtb3ZlKSk7XG4gICAgcmV0dXJuIGZvcmtKb2luKHNhdmVPYnNlcnZhYmxlcykucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnJlZnJlc2hDdXJyZW50QmFza2V0KCkpLFxuICAgICAgdGFrZSgxKVxuICAgICk7XG4gIH1cblxuICByZW1vdmVCYXNrZXRFbnRyeShlbnRyeVRvUmVtb3ZlOiBDb21wYXJhYmxlUHJvZHVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgYmFza2V0RW50cnkgPSB0aGlzLl9lbnRyaWVzJC52YWx1ZS5maW5kKGJlID0+IGJlLmlkID09PSBlbnRyeVRvUmVtb3ZlLmlkKTtcbiAgICBpZiAoIWJhc2tldEVudHJ5IHx8ICFlbnRyeVRvUmVtb3ZlLnF1YW50aXR5KSB7XG4gICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3UXVhbnRpdHkgPSBiYXNrZXRFbnRyeS5xdWFudGl0eSAtIGVudHJ5VG9SZW1vdmUucXVhbnRpdHk7XG4gICAgaWYgKG5ld1F1YW50aXR5ID49IDEpIHtcbiAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5zZW5kUHJvZHVjdHNDaGFuZ2VRdWFudGl0eUV2ZW50cyhbe1xuICAgICAgICB0eXBlOiBCYXNrZXRBY3Rpb25UeXBlLlVQREFURV9QUk9EVUNULCBwYXJhbXM6IHtcbiAgICAgICAgICByZWNpcGVJZDogJycsIGV2ZW50VHJhY2U6IHsgb3JpZ2luUGF0aDogJycsIHByb3BzOiB7fSB9LCBiYXNrZXRFbnRyeSwgbmV3UXVhbnRpdHlcbiAgICAgICAgfVxuICAgICAgfV0pO1xuICAgICAgYmFza2V0RW50cnkucXVhbnRpdHkgPSBuZXdRdWFudGl0eTtcbiAgICAgIHJldHVybiBiYXNrZXRFbnRyeS5zYXZlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhc2tldEVudHJ5LnF1YW50aXR5ID0gMTtcbiAgICAgIGJhc2tldEVudHJ5LnN0YXR1cyA9ICdkZWxldGVkJztcbiAgICAgIC8vIENyZWF0ZSBhIGZha2UgYmFza2V0QWN0aW9uICh3ZSBjYW4ndCB1c2UgdGhpcy5yZW1vdmVJdGVtc0ZvckluZ3JlZGllbnRzIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgaW5ncmVkaWVudElkKVxuICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLnNlbmRSZW1vdmVQcm9kdWN0c0V2ZW50cyhbe1xuICAgICAgICB0eXBlOiBCYXNrZXRBY3Rpb25UeXBlLlJFTU9WRV9QUk9EVUNULCBwYXJhbXM6IHsgcmVjaXBlSWQ6ICcnLCBldmVudFRyYWNlOiB7IG9yaWdpblBhdGg6ICcnLCBwcm9wczoge30gfSwgYmFza2V0RW50cnkgfVxuICAgICAgfV0pO1xuICAgICAgcmV0dXJuIGJhc2tldEVudHJ5LnNhdmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgQmFza2V0RW50cnkgZm9yIGFuIGluZ3JlZGllbnQgaWYgaXQgZXhpc3RzXG4gICAqIFJldHVybnMgYSBmYWtlIEJhc2tldEVudHJ5IHdpdGggaWQgPSAtMSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAqL1xuICBiYXNrZXRFbnRyeUZyb21JbmdyZWRpZW50KGluZ3JlZGllbnRJZDogc3RyaW5nLCBndWVzdHM6IG51bWJlciwgb25seVF1YW50aXR5ID0gZmFsc2UsIHNlbGVjdGVkSXRlbUlkPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxCYXNrZXRFbnRyeT4ge1xuICAgIHJldHVybiB0aGlzLndhaXRGb3JCYXNrZXQucGlwZShcbiAgICAgIHN3aXRjaE1hcChiYXNrZXQgPT4ge1xuICAgICAgICBsZXQgZ2V0VXJsID1cbiAgICAgICAgICBgJHtlLm1pYW1BUEl9L2FwaS92MS9iYXNrZXRzLyR7YmFza2V0LmlkfS9iYXNrZXQtZW50cmllcy9mcm9tLWluZ3JlZGllbnQ/aW5ncmVkaWVudF9pZD0ke2luZ3JlZGllbnRJZH0mZ3Vlc3RzPSR7Z3Vlc3RzfWA7XG4gICAgICAgIGlmIChzZWxlY3RlZEl0ZW1JZCkge1xuICAgICAgICAgIGdldFVybCArPSBgJnNlbGVjdGVkX2l0ZW1faWQ9JHtzZWxlY3RlZEl0ZW1JZH1gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbmx5UXVhbnRpdHkpIHtcbiAgICAgICAgICBnZXRVcmwgKz0gJyZmaWVsZHNbYmFza2V0LWVudHJpZXNdPXF1YW50aXR5LHF1YW50aXR5LXRvLWFkZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2V0VXJsICs9ICcmaW5jbHVkZT1zZWxlY3RlZC1pdGVtJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldChnZXRVcmwpIGFzIE9ic2VydmFibGU8RG9jdW1lbnRSZXNvdXJjZTxCYXNrZXRFbnRyeT4+O1xuICAgICAgfSksXG4gICAgICBza2lwV2hpbGUocmVzdWx0ID0+ICFyZXN1bHQpLFxuICAgICAgbWFwKHJlcyA9PiB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5iYXNrZXRFbnRyaWVzU2VydmljZS5uZXcoKTtcbiAgICAgICAgZW50cnkuZmlsbChyZXMpO1xuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUFJJQ0VCT09LICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqL1xuXG4gIC8vIHdpbGwgcGF0Y2ggYmFza2V0IHdpdGggZ2l2ZW4gcHJpY2Vib29rTmFtZVxuICAvLyBBcGkgd2lsbCBsb29rIGZvciBwcmljZXMgKHBvcyBpdGVtcykgY29ycmVzcG9uZGluZyB0byB0aGlzIHByaWNlYm9vayBrZXlcbiAgLy8gZmFsbCBjYXNlIHRvIGEgZGVmYXVsdCBwcmljZWJvb2tcbiAgdXBkYXRlUHJpY2Vib29rKHByaWNlYm9va05hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGlmICghcHJpY2Vib29rTmFtZSkge1xuICAgICAgbWVhbHpEZWJ1ZygnW01pYW1dIGVtcHR5IHByaWNlYm9vayBuYW1lJyk7XG4gICAgICByZXR1cm4gb2Y8dm9pZD4obnVsbCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLndhaXRGb3JCYXNrZXQucGlwZShcbiAgICAgIHN3aXRjaE1hcChiYXNrZXQgPT4ge1xuICAgICAgICBpZiAoYmFza2V0LnByaWNlYm9va0tleSA9PT0gcHJpY2Vib29rTmFtZSkge1xuICAgICAgICAgIG1lYWx6RGVidWcoYFtNZWFsel0gc2FtZSBwcmljZWJvb2sgJHtKU09OLnN0cmluZ2lmeShwcmljZWJvb2tOYW1lKX1gKTtcbiAgICAgICAgICByZXR1cm4gb2Y8dm9pZD4obnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgbWVhbHpEZWJ1ZyhgW01lYWx6XSB1cGRhdGUgcHJpY2Vib29rIHRvICR7SlNPTi5zdHJpbmdpZnkocHJpY2Vib29rTmFtZSl9YCk7XG4gICAgICAgIGNvbnN0IHBhdGNoVXJsID0gYCR7ZS5taWFtQVBJfS9hcGkvdjEvYmFza2V0cy91cGRhdGVfcHJpY2Vib29rP2AgK1xuICAgICAgICAgIGBwb2ludF9vZl9zYWxlX2lkPSR7dGhpcy5wb3NTZXJ2aWNlLnBvcyQudmFsdWUuaWR9JnByaWNlYm9va19rZXk9JHtwcmljZWJvb2tOYW1lfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2gocGF0Y2hVcmwsIHt9KS5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgocmVzcDogRG9jdW1lbnRSZXNvdXJjZTxCYXNrZXQ+KSA9PiB0aGlzLmZpbGxCYXNrZXQocmVzcCkpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUREIEZST00gUElDVFVSRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi9cblxuICAvKipcbiAgICogQWRkIGVudHJpZXMgdG8gYmFza2V0IGZyb20gYSBwaWN0dXJlIG9yIGZpbGVcbiAgICogQHBhcmFtIGZpbGUgYW4gaW1hZ2Ugb3IgUERGIG9mIGEgZ3JvY2VyaWVzIGxpc3RcbiAgICogQHBhcmFtIGluY2x1ZGVcbiAgICogQHBhcmFtIGlzU2Nob29sTGlzdCBpZiB0cnVlLCBpbmRpY2F0ZXMgdG8gdGhlIGFwaSB0aGF0IHRoZSBmaWxlIGlzIGEgc2Nob29sIHNob3BwaW5nIGxpc3RcbiAgICovXG4gIGFkZEVudHJpZXNGcm9tUGljdHVyZShmaWxlOiBGaWxlLCBpbmNsdWRlID0gW10sIGlzU2Nob29sTGlzdCA9IGZhbHNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMud2FpdEZvckJhc2tldC5waXBlKFxuICAgICAgc3dpdGNoTWFwKGJhc2tldCA9PiB0aGlzLnBvc1NlcnZpY2Uud2FpdEZvclBvcy5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBtYXAocG9zID0+IFtiYXNrZXQsIHBvc10pXG4gICAgICApKSxcbiAgICAgIHN3aXRjaE1hcCgoW2Jhc2tldCwgcG9zXSkgPT4ge1xuICAgICAgICBsZXQgcGF0Y2hVcmw6IHN0cmluZztcbiAgICAgICAgaWYgKGlzU2Nob29sTGlzdCkge1xuICAgICAgICAgIHBhdGNoVXJsID0gYCR7ZS5taWFtQVBJfS9hcGkvdjEvYmFza2V0cy9zY2hvb2wtbGlzdD9maWVsZHNbYmFza2V0c109JHtCQVNLRVRfU1BBUlNFX0ZJRUxEUy5iYXNrZXRzLmpvaW4oJywnKX1gICtcbiAgICAgICAgICAgIGAmcG9pbnRfb2Zfc2FsZV9pZD0ke3Bvcy5pZH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGNoVXJsID0gYCR7ZS5taWFtQVBJfS9hcGkvdjEvYmFza2V0cy8ke2Jhc2tldC5pZH0vYWRkLWVudHJpZXMtZnJvbS1waWN0dXJlYCArXG4gICAgICAgICAgICBgP2ZpZWxkc1tiYXNrZXRzXT0ke0JBU0tFVF9TUEFSU0VfRklFTERTLmJhc2tldHMuam9pbignLCcpfWA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgncGljdHVyZScsIGZpbGUpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2luY2x1ZGUnLCBpbmNsdWRlLmpvaW4oJywnKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2gocGF0Y2hVcmwsIGZvcm1EYXRhKS5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgocmVzcG9uc2U6IERvY3VtZW50UmVzb3VyY2U8QmFza2V0PikgPT4gdGhpcy5maWxsQmFza2V0KHJlc3BvbnNlKSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFERCBBQ1RJT05TIFRPIFRIRSBRVUVVRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqL1xuXG4gIC8qKlxuICAgKiBBZGRzIHJlY2lwZXMgdG8gdGhlIGJhc2tldCBhY3Rpb24gdG8gcXVldWUuXG4gICAqXG4gICAqIEBwYXJhbSByZWNpcGVJZHMgLSBUaGUgYXJyYXkgb2YgcmVjaXBlIElEcyB0byBhZGQuXG4gICAqIEBwYXJhbSBndWVzdHMgLSBUaGUgbnVtYmVyIG9mIGd1ZXN0cy5cbiAgICogQHBhcmFtIGV2ZW50VHJhY2UgLSBUaGUgZXZlbnQgdHJhY2UuXG4gICAqIEBwYXJhbSB3aXRoSW5ncmVkaWVudHMgLSBXaGV0aGVyIHRvIGluY2x1ZGUgaW5ncmVkaWVudHMuIERlZmF1bHQgaXMgdHJ1ZS5cbiAgICogQHJldHVybiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhbnl0aGluZy5cbiAgICovXG4gIGFkZFJlY2lwZXNUb0Jhc2tldChyZWNpcGVJZHM6IHN0cmluZ1tdLCBndWVzdHM6IG51bWJlciwgZXZlbnRUcmFjZTogRXZlbnRUcmFjZSwgd2l0aEluZ3JlZGllbnRzID0gdHJ1ZSk6IHZvaWQge1xuICAgIGNvbnN0IHRvQWRkID0gdGhpcy5iYXNrZXRBY3Rpb25zUXVldWUudmFsdWU7XG4gICAgcmVjaXBlSWRzLmZvckVhY2gocmVjaXBlSWQgPT5cbiAgICAgIHRvQWRkLnB1c2goe1xuICAgICAgICB0eXBlOiB3aXRoSW5ncmVkaWVudHMgPyBCYXNrZXRBY3Rpb25UeXBlLkFERF9SRUNJUEUgOiBCYXNrZXRBY3Rpb25UeXBlLkFERF9SRUNJUEVfTElHSFQsXG4gICAgICAgIHBhcmFtczogeyByZWNpcGVJZCwgZXZlbnRUcmFjZSwgZ3Vlc3RzIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5uZXh0KHRvQWRkKTtcbiAgfVxuXG4gIHJlbW92ZVJlY2lwZXNGcm9tQmFza2V0KHJlY2lwZUlkczogc3RyaW5nW10sIGV2ZW50VHJhY2U6IEV2ZW50VHJhY2UsIGxpZ2h0TW9kZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgdG9SZW1vdmUgPSB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS52YWx1ZTtcbiAgICByZWNpcGVJZHMuZm9yRWFjaChyZWNpcGVJZCA9PlxuICAgICAgdG9SZW1vdmUucHVzaCh7XG4gICAgICAgIHR5cGU6IGxpZ2h0TW9kZSA/IEJhc2tldEFjdGlvblR5cGUuUkVNT1ZFX1JFQ0lQRV9MSUdIVCA6IEJhc2tldEFjdGlvblR5cGUuUkVNT1ZFX1JFQ0lQRSxcbiAgICAgICAgcGFyYW1zOiB7IHJlY2lwZUlkLCBldmVudFRyYWNlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5uZXh0KHRvUmVtb3ZlKTtcbiAgfVxuXG4gIHVwZGF0ZVJlY2lwZXNJbkJhc2tldChyZWNpcGVJZHM6IHN0cmluZ1tdLCBndWVzdHM6IG51bWJlciwgZXZlbnRUcmFjZTogRXZlbnRUcmFjZSwgbGlnaHRNb2RlID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCB0b1VwZGF0ZSA9IHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnZhbHVlO1xuICAgIHJlY2lwZUlkcy5mb3JFYWNoKHJlY2lwZUlkID0+XG4gICAgICB0aGlzLnJlY2lwZUlzSW5CYXNrZXQocmVjaXBlSWQpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGluQmFza2V0ID0+IHtcbiAgICAgICAgaWYgKGluQmFza2V0KSB7XG4gICAgICAgICAgdG9VcGRhdGUucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBsaWdodE1vZGUgPyBCYXNrZXRBY3Rpb25UeXBlLlVQREFURV9SRUNJUEVfTElHSFQgOiBCYXNrZXRBY3Rpb25UeXBlLlVQREFURV9SRUNJUEUsXG4gICAgICAgICAgICBwYXJhbXM6IHsgcmVjaXBlSWQsIGV2ZW50VHJhY2UsIGd1ZXN0cyB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5uZXh0KHRvVXBkYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJvdGggaW4gdGhlIGNhcyBvZiBhZGRpbmcgYW4gaW5ncmVkaWVudCB0byBiYXNrZXQgYW5kIGluIHRoZSBjYXNlIG9mIHJlcGxhY2luZyB0aGUgaXRlbSBvZiBhbiBpbmdyZWRpZW50XG4gICAqIEJlY2F1c2UgdGhlIHNhbWUgcmVxdWVzdCBpcyBjYWxsZWQgYXQgdGhlIGVuZFxuICAgKiBAcGFyYW0gcmVjaXBlSWQgSWQgb2YgdGhlIHJlY2lwZSBpbiB3aGljaCB0aGUgaW5ncmVkaWVudCBpc1xuICAgKiBAcGFyYW0gaW5ncmVkaWVudElkc0FuZEVudHJpZXMgcGFpcnMgb2YgaW5ncmVkaWVudElkICsgYmFza2V0RW50cnkgdG8gYWRkIHRvIGJhc2tldFxuICAgKiBAcGFyYW0gZXZlbnRUcmFjZSBldmVudFRyYWNlXG4gICAqIEBwYXJhbSBwcmV2aW91c0l0ZW0gKG9wdGlvbmFsKSBwcmV2aW91c0l0ZW0gaW4gY2FzZSBvZiBhbiBpdGVtIHJlcGxhY2VtZW50IChmb3IgYW5hbHl0aWNzIHB1cnBvc2VzKVxuICAgKiBAcGFyYW0gc2VhcmNoU3RyaW5nIChvcHRpb25hbCkgc2VhcmNoX3Rlcm0gaW4gY2FzZSBvZiBhbiBpdGVtIHJlcGxhY2VtZW50IHdoZW4gYSBzZWFyY2ggaGFzIGJlZW4gdXNlZCAoZm9yIGFuYWx5dGljcyBwdXJwb3NlcylcbiAgICovXG4gIGFkZEluZ3JlZGllbnRzVG9CYXNrZXQocmVjaXBlSWQ6IHN0cmluZywgaW5ncmVkaWVudElkc0FuZEVudHJpZXM6IHsgaW5ncmVkaWVudElkOiBzdHJpbmc7IGVudHJ5OiBCYXNrZXRFbnRyeSB9W10sXG4gICAgZXZlbnRUcmFjZTogRXZlbnRUcmFjZSwgcHJldmlvdXNJdGVtPzogSXRlbSwgc2VhcmNoU3RyaW5nPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdG9BZGQgPSB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS52YWx1ZTtcbiAgICBpbmdyZWRpZW50SWRzQW5kRW50cmllcy5mb3JFYWNoKGluZ3JlZGllbnRJZEFuZEVudHJ5ID0+XG4gICAgICB0b0FkZC5wdXNoKHtcbiAgICAgICAgdHlwZTogQmFza2V0QWN0aW9uVHlwZS5BRERfUFJPRFVDVCxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgcmVjaXBlSWQsIGluZ3JlZGllbnRJZDogaW5ncmVkaWVudElkQW5kRW50cnkuaW5ncmVkaWVudElkLCBiYXNrZXRFbnRyeTogaW5ncmVkaWVudElkQW5kRW50cnkuZW50cnksIGV2ZW50VHJhY2UsIHByZXZpb3VzSXRlbSxcbiAgICAgICAgICBzZWFyY2hTdHJpbmdcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLm5leHQodG9BZGQpO1xuICB9XG5cbiAgYWRkSXRlbVRvQmFza2V0KGl0ZW06IEl0ZW0sIGV2ZW50VHJhY2U6IEV2ZW50VHJhY2UpOiB2b2lkIHtcbiAgICBjb25zdCB0b0FkZCA9IHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnZhbHVlO1xuICAgIHRvQWRkLnB1c2goe1xuICAgICAgdHlwZTogQmFza2V0QWN0aW9uVHlwZS5BRERfSVRFTSxcbiAgICAgIHBhcmFtczogeyBpdGVtLCBldmVudFRyYWNlIH1cbiAgICB9KTtcbiAgICB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5uZXh0KHRvQWRkKTtcbiAgfVxuXG4gIHJlbW92ZVByb2R1Y3RGcm9tUmVjaXBlKHByb2R1Y3RzOiB7IGluZ3JlZGllbnQ6IEluZ3JlZGllbnQ7IGJhc2tldEVudHJ5OiBCYXNrZXRFbnRyeSB9W10sIGV2ZW50VHJhY2U6IEV2ZW50VHJhY2UpOiB2b2lkIHtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnZhbHVlO1xuICAgIHByb2R1Y3RzLmZvckVhY2gocHJvZHVjdCA9PlxuICAgICAgdG9SZW1vdmUucHVzaCh7XG4gICAgICAgIHR5cGU6IEJhc2tldEFjdGlvblR5cGUuUkVNT1ZFX1BST0RVQ1RfRlJPTV9SRUNJUEUsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGJhc2tldEVudHJ5OiBwcm9kdWN0LmJhc2tldEVudHJ5LFxuICAgICAgICAgIGluZ3JlZGllbnRJZDogcHJvZHVjdC5pbmdyZWRpZW50LmlkLFxuICAgICAgICAgIGZvcmNlZFF1YW50aXR5OiBwcm9kdWN0LmJhc2tldEVudHJ5LnF1YW50aXR5ICsgcHJvZHVjdC5iYXNrZXRFbnRyeS5xdWFudGl0eVRvQWRkLFxuICAgICAgICAgIGV2ZW50VHJhY2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLm5leHQodG9SZW1vdmUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlbW92ZUluZ3JlZGllbnRzRnJvbUJhc2tldChiYXNrZXRFbnRyeTogQmFza2V0RW50cnksIHJlY2lwZUlkOiBzdHJpbmcsIGluZ3JlZGllbnRJZHM6IHN0cmluZ1tdLCBldmVudFRyYWNlOiBFdmVudFRyYWNlKTogdm9pZCB7XG4gICAgY29uc3QgdG9SZW1vdmUgPSB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS52YWx1ZTtcbiAgICBpbmdyZWRpZW50SWRzLmZvckVhY2goaW5ncmVkaWVudElkID0+XG4gICAgICB0b1JlbW92ZS5wdXNoKHtcbiAgICAgICAgdHlwZTogQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVCxcbiAgICAgICAgcGFyYW1zOiB7IGJhc2tldEVudHJ5LCByZWNpcGVJZCwgaW5ncmVkaWVudElkLCBldmVudFRyYWNlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5uZXh0KHRvUmVtb3ZlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICByZW1vdmVQcm9kdWN0KGJhc2tldEVudHJ5OiBCYXNrZXRFbnRyeSwgZXZlbnRUcmFjZTogRXZlbnRUcmFjZSwgcmVjaXBlSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnZhbHVlO1xuICAgIHRvUmVtb3ZlLnB1c2goe1xuICAgICAgdHlwZTogQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVCxcbiAgICAgIHBhcmFtczogeyBiYXNrZXRFbnRyeSwgcmVjaXBlSWQsIGV2ZW50VHJhY2UgfVxuICAgIH0pO1xuICAgIHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLm5leHQodG9SZW1vdmUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNoYW5nZVByb2R1Y3RRdWFudGl0eShiYXNrZXRFbnRyeTogQmFza2V0RW50cnksIG5ld1F1YW50aXR5OiBudW1iZXIsIGV2ZW50VHJhY2U6IEV2ZW50VHJhY2UsIHJlY2lwZUlkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgYmFza2V0RW50cnksXG4gICAgICByZWNpcGVJZCxcbiAgICAgIG5ld1F1YW50aXR5LFxuICAgICAgZXZlbnRUcmFjZVxuICAgIH07XG4gICAgY29uc3QgdG9VcGRhdGUgPSB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS52YWx1ZTtcbiAgICB0b1VwZGF0ZS5wdXNoKHtcbiAgICAgIHR5cGU6IEJhc2tldEFjdGlvblR5cGUuVVBEQVRFX1BST0RVQ1QsXG4gICAgICBwYXJhbXNcbiAgICB9KTtcbiAgICB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5uZXh0KHRvVXBkYXRlKTtcbiAgfVxuXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUFJPQ0VTUyBUSEUgQUNUSU9OUyBRVUVVRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovXG5cbiAgcHJpdmF0ZSBlbXB0eUFjdGlvbnNRdWV1ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5iYXNrZXRBY3Rpb25zUXVldWUudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYWN0aW9uc1RvUHJvY2VzcyA9IHRoaXMubmV4dEFjdGlvbnNCYXRjaCgpO1xuICAgICAgdGhpcy5hY3Rpb25zQmVpbmdQcm9jZXNzZWQubmV4dChbLi4uYWN0aW9uc1RvUHJvY2Vzc10pO1xuICAgICAgaWYgKGFjdGlvbnNUb1Byb2Nlc3MubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NBY3Rpb25zQmF0Y2goYWN0aW9uc1RvUHJvY2Vzcykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmFjdGlvbnNCZWluZ1Byb2Nlc3NlZC5uZXh0KFtdKTtcbiAgICAgICAgICB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5uZXh0KFxuICAgICAgICAgICAgdGhpcy5iYXNrZXRBY3Rpb25zUXVldWUudmFsdWUuZmlsdGVyKGkgPT4gIWFjdGlvbnNUb1Byb2Nlc3MuaW5jbHVkZXMoaSkgJiYgIXRoaXMuYWN0aW9uc0JlaW5nT3ZlcnJpZGRlbi5pbmNsdWRlcyhpKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuYWN0aW9uc0JlaW5nT3ZlcnJpZGRlbiA9IFtdO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgbXVsdGlwbGUgYWN0aW9ucyBvZiB0aGUgc2FtZSB0eXBlIGFyZSBuZXh0IHRvIGVhY2ggb3RoZXIgaW4gdGhlIHF1ZXVlLCB3ZSB3YW50IHRvIHByb2Nlc3MgdGhlbSBhcyBhIGJhdGNoLlxuICAgKiBAcmV0dXJucyB0aGUgbmV4dCBiYXRjaCBvZiBhY3Rpb25zIHRvIHByb2Nlc3NcbiAgICovXG4gIHByaXZhdGUgbmV4dEFjdGlvbnNCYXRjaCgpOiBCYXNrZXRBY3Rpb25bXSB7XG4gICAgY29uc3QgYmF0Y2g6IEJhc2tldEFjdGlvbltdID0gW107XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBjdXJyZW50QWN0aW9uID0gdGhpcy5iYXNrZXRBY3Rpb25zUXVldWUudmFsdWVbaV07XG4gICAgbGV0IHNob3VsZEZvcmNlU3RvcCA9IGZhbHNlO1xuICAgIHdoaWxlICh0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS52YWx1ZVtpXSAmJiB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS52YWx1ZVtpXS50eXBlID09PSBjdXJyZW50QWN0aW9uLnR5cGUgJiYgIXNob3VsZEZvcmNlU3RvcCkge1xuICAgICAgY3VycmVudEFjdGlvbiA9IHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnZhbHVlW2ldO1xuICAgICAgc2hvdWxkRm9yY2VTdG9wID0gdGhpcy5hZGRBY3Rpb25Ub0JhdGNoT3JTdG9wUHJvY2Vzc2luZ0JhdGNoKGJhdGNoLCBjdXJyZW50QWN0aW9uKTtcbiAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIGJhdGNoO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGJhdGNoIHNob3VsZCBzdG9wIHByb2Nlc3NpbmdcbiAgICovXG4gIHByaXZhdGUgYWRkQWN0aW9uVG9CYXRjaE9yU3RvcFByb2Nlc3NpbmdCYXRjaChiYXRjaDogQmFza2V0QWN0aW9uW10sIGN1cnJlbnRBY3Rpb246IEJhc2tldEFjdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlY2lwZUluZGV4ID0gdGhpcy5jaGVja0ZvckFjdGlvblRvT3ZlcnJpZGUoYmF0Y2gsIGN1cnJlbnRBY3Rpb24pO1xuICAgIGlmIChyZWNpcGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuYWN0aW9uc0JlaW5nT3ZlcnJpZGRlbi5wdXNoKGJhdGNoW3JlY2lwZUluZGV4XSk7XG4gICAgICBiYXRjaFtyZWNpcGVJbmRleF0gPSBjdXJyZW50QWN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRGb3JjZVN0b3BCYXRjaChiYXRjaCwgY3VycmVudEFjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXRjaC5wdXNoKGN1cnJlbnRBY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZEZvcmNlU3RvcEJhdGNoKGJhdGNoOiBCYXNrZXRBY3Rpb25bXSwgY3VycmVudEFjdGlvbjogQmFza2V0QWN0aW9uKTogYm9vbGVhbiB7XG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgYmF0Y2ggaXMgYW4gVVBEQVRFIGJhdGNoLCB3ZSBjYW4ndCB1cGRhdGUgbXVsdGlwbGUgcmVjaXBlcyB3aXRoIGRpZmZlcmVudHMgZ3Vlc3RzIHZhbHVlcyBhdCB0aGUgc2FtZSB0aW1lXG4gICAgLy8gc28gaW4gdGhpcyBjYXNlIHdlIHN0b3AgdGhlIGJhdGNoIGJlZm9yZSB0aGUgVVBEQVRFIHdpdGggYSBkaWZmZXJlbnQgZ3Vlc3RzIHZhbHVlXG4gICAgcmV0dXJuIChjdXJyZW50QWN0aW9uLnR5cGUgPT09IEJhc2tldEFjdGlvblR5cGUuVVBEQVRFX1JFQ0lQRSAmJlxuICAgICAgICBiYXRjaC5sZW5ndGggPiAwICYmXG4gICAgICAgICFiYXRjaC5zb21lKGEgPT4gYS5wYXJhbXMuZ3Vlc3RzID09PSBjdXJyZW50QWN0aW9uLnBhcmFtcy5ndWVzdHMpKSB8fFxuICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgYmF0Y2ggaXMgYW4gcHJvZHVjdCBhZGQvcmVtb3ZlIGJhdGNoLCB3ZSBjYW4ndCBhZGQgb3IgcmVtb3ZlIHByb2R1Y3RzIGZyb20gZGlmZmVyZW50IHJlY2lwZXMgYXQgdGhlIHNhbWUgdGltZVxuICAgICAgLy8gc28gaW4gdGhpcyBjYXNlIHdlIHN0b3AgdGhlIGJhdGNoIGJlZm9yZSB0aGUgYWRkL3JlbW92ZSB3aXRoIGEgZGlmZmVyZW50IHJlY2lwZVxuICAgICAgKChjdXJyZW50QWN0aW9uLnR5cGUgPT09IEJhc2tldEFjdGlvblR5cGUuQUREX1BST0RVQ1QgfHwgY3VycmVudEFjdGlvbi50eXBlID09PSBCYXNrZXRBY3Rpb25UeXBlLlJFTU9WRV9QUk9EVUNUKSAmJlxuICAgICAgICBiYXRjaC5sZW5ndGggPiAwICYmXG4gICAgICAgICFiYXRjaC5zb21lKGEgPT4gYS5wYXJhbXMucmVjaXBlSWQgPT09IGN1cnJlbnRBY3Rpb24ucGFyYW1zLnJlY2lwZUlkKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIGFjdGlvbnMgZm9yIHdoaWNoIG92ZXJyaWRpbmcgd291bGQgaGF2ZSB0aGUgc2FtZSByZXN1bHQgYXMgcHJvY2Vzc2luZyBib3RoIGluIG9yZGVyXG4gICAqL1xuICBwcml2YXRlIGNoZWNrRm9yQWN0aW9uVG9PdmVycmlkZShiYXRjaDogQmFza2V0QWN0aW9uW10sIGN1cnJlbnRBY3Rpb246IEJhc2tldEFjdGlvbik6IG51bWJlciB7XG4gICAgc3dpdGNoIChjdXJyZW50QWN0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgQmFza2V0QWN0aW9uVHlwZS5BRERfUFJPRFVDVDpcbiAgICAgICAgcmV0dXJuIGJhdGNoLmZpbmRJbmRleChhID0+XG4gICAgICAgICAgYS5wYXJhbXMuaW5ncmVkaWVudElkID09PSBjdXJyZW50QWN0aW9uLnBhcmFtcy5pbmdyZWRpZW50SWQgJiYgYS5wYXJhbXMucmVjaXBlSWQgPT09IGN1cnJlbnRBY3Rpb24ucGFyYW1zLnJlY2lwZUlkXG4gICAgICAgICk7XG5cbiAgICAgIGNhc2UgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVDpcbiAgICAgICAgcmV0dXJuIGJhdGNoLmZpbmRJbmRleChhID0+IHtcbiAgICAgICAgICBsZXQgY2hlY2tQcm9kdWN0OiBib29sZWFuO1xuICAgICAgICAgIGlmIChjdXJyZW50QWN0aW9uLnBhcmFtcy5iYXNrZXRFbnRyeT8uaWQpIHtcbiAgICAgICAgICAgIGNoZWNrUHJvZHVjdCA9IGEucGFyYW1zLmJhc2tldEVudHJ5LmlkID09PSBjdXJyZW50QWN0aW9uLnBhcmFtcy5iYXNrZXRFbnRyeS5pZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hlY2tQcm9kdWN0ID0gYS5wYXJhbXMuaW5ncmVkaWVudElkID09PSBjdXJyZW50QWN0aW9uLnBhcmFtcy5pbmdyZWRpZW50SWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjaGVja1Byb2R1Y3QgJiYgYS5wYXJhbXMucmVjaXBlSWQgPT09IGN1cnJlbnRBY3Rpb24ucGFyYW1zLnJlY2lwZUlkO1xuICAgICAgICB9KTtcblxuICAgICAgY2FzZSBCYXNrZXRBY3Rpb25UeXBlLlJFTU9WRV9QUk9EVUNUX0ZST01fUkVDSVBFOlxuICAgICAgICByZXR1cm4gYmF0Y2guZmluZEluZGV4KGEgPT5cbiAgICAgICAgICBhLnBhcmFtcy5pbmdyZWRpZW50SWQgPT09IGN1cnJlbnRBY3Rpb24ucGFyYW1zLmluZ3JlZGllbnRJZCAmJiBhLnBhcmFtcy5yZWNpcGVJZCA9PT0gY3VycmVudEFjdGlvbi5wYXJhbXMucmVjaXBlSWRcbiAgICAgICAgKTtcblxuICAgICAgY2FzZSBCYXNrZXRBY3Rpb25UeXBlLlVQREFURV9QUk9EVUNUOlxuICAgICAgICByZXR1cm4gYmF0Y2guZmluZEluZGV4KGEgPT4gYS5wYXJhbXMuYmFza2V0RW50cnkuaWQgPT09IGN1cnJlbnRBY3Rpb24ucGFyYW1zLmJhc2tldEVudHJ5LmlkKTtcblxuICAgICAgY2FzZSBCYXNrZXRBY3Rpb25UeXBlLlVQREFURV9SRUNJUEU6XG4gICAgICAgIGlmICghYmF0Y2guc29tZShhID0+IGEucGFyYW1zLnJlY2lwZUlkICE9PSBjdXJyZW50QWN0aW9uLnBhcmFtcy5yZWNpcGVJZCkpIHtcbiAgICAgICAgICByZXR1cm4gYmF0Y2guZmluZEluZGV4KGEgPT4gYS5wYXJhbXMucmVjaXBlSWQgPT09IGN1cnJlbnRBY3Rpb24ucGFyYW1zLnJlY2lwZUlkKTtcbiAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgb25seSB0aGUgc2FtZSByZWNpcGVJZCBhcyB0aGUgY3VycmVudEFjdGlvbiBpbiB0aGUgYmF0Y2ggYW5kIHdlIGFyZSB1cGRhdGluZyB0aGlzIHJlY2lwZSdzIGd1ZXN0c1xuICAgICAgICAgIC8vIHdlIGNhbiBzYWZlbHkgb3ZlcnJpZGUgdGhlIGFjdGlvbiBpbiB0aGUgYmF0Y2hcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG5cbiAgICAgIC8vIEFERF9SRUNJUEUgKyBBRERfUkVDSVBFX0xJR0hUICsgUkVNT1ZFX1JFQ0lQRVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGJhdGNoLmZpbmRJbmRleChhID0+IGEucGFyYW1zLnJlY2lwZUlkID09PSBjdXJyZW50QWN0aW9uLnBhcmFtcy5yZWNpcGVJZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzQWN0aW9uc0JhdGNoKGFjdGlvbnNUb1Byb2Nlc3M6IEJhc2tldEFjdGlvbltdKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgc3dpdGNoIChhY3Rpb25zVG9Qcm9jZXNzWzBdLnR5cGUpIHtcbiAgICAgIGNhc2UgQmFza2V0QWN0aW9uVHlwZS5BRERfUkVDSVBFOlxuICAgICAgICByZXR1cm4gdGhpcy5hZGRSZWNpcGVzKGFjdGlvbnNUb1Byb2Nlc3MpO1xuXG4gICAgICBjYXNlIEJhc2tldEFjdGlvblR5cGUuQUREX1JFQ0lQRV9MSUdIVDpcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmVjaXBlc1dpdGhvdXRJbmdyZWRpZW50cyhhY3Rpb25zVG9Qcm9jZXNzKTtcblxuICAgICAgY2FzZSBCYXNrZXRBY3Rpb25UeXBlLlJFTU9WRV9SRUNJUEU6XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZVJlY2lwZXMoYWN0aW9uc1RvUHJvY2Vzcyk7XG5cbiAgICAgIGNhc2UgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUkVDSVBFX0xJR0hUOlxuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVSZWNpcGVzKGFjdGlvbnNUb1Byb2Nlc3MsIHRydWUpO1xuXG4gICAgICBjYXNlIEJhc2tldEFjdGlvblR5cGUuVVBEQVRFX1JFQ0lQRTpcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUmVjaXBlc0d1ZXN0cyhhY3Rpb25zVG9Qcm9jZXNzKTtcblxuICAgICAgY2FzZSBCYXNrZXRBY3Rpb25UeXBlLlVQREFURV9SRUNJUEVfTElHSFQ6XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVJlY2lwZXNHdWVzdHMoYWN0aW9uc1RvUHJvY2VzcywgdHJ1ZSk7XG5cbiAgICAgIGNhc2UgQmFza2V0QWN0aW9uVHlwZS5BRERfUFJPRFVDVDpcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkSXRlbXNGb3JJbmdyZWRpZW50cyhhY3Rpb25zVG9Qcm9jZXNzKTtcblxuICAgICAgY2FzZSBCYXNrZXRBY3Rpb25UeXBlLkFERF9JVEVNOlxuICAgICAgICByZXR1cm4gdGhpcy5hZGRJdGVtc1RvQmFza2V0KGFjdGlvbnNUb1Byb2Nlc3MpO1xuXG4gICAgICBjYXNlIEJhc2tldEFjdGlvblR5cGUuUkVNT1ZFX1BST0RVQ1Q6XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRm9ySW5ncmVkaWVudHMoYWN0aW9uc1RvUHJvY2Vzcyk7XG5cbiAgICAgIGNhc2UgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVF9GUk9NX1JFQ0lQRTpcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlUHJvZHVjdFdpdGhGb3JjZWRRdWFudGl0eShhY3Rpb25zVG9Qcm9jZXNzKTtcblxuICAgICAgY2FzZSBCYXNrZXRBY3Rpb25UeXBlLlVQREFURV9QUk9EVUNUOlxuICAgICAgICByZXR1cm4gdGhpcy5jaGFuZ2VCYXNrZXRFbnRyaWVzUXVhbnRpdGllcyhhY3Rpb25zVG9Qcm9jZXNzKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUFJPQ0VTUyBUSEUgQUNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovXG5cbiAgLyoqXG4gICAqIEFkZHMgcmVjaXBlcyB0byB0aGUgYmFza2V0IEhUVFAgcmVxdWVzdC5cbiAgICpcbiAgICogQHBhcmFtIHJlY2lwZXNUb0FkZCAtIFRoZSByZWNpcGVzIHRvIGFkZCB0byB0aGUgYmFza2V0LlxuICAgKiBAcGFyYW0gd2l0aEluZ3JlZGllbnRzIC0gKG9wdGlvbmFsKSBXaGV0aGVyIHRvIGluY2x1ZGUgaW5ncmVkaWVudHMgaW4gdGhlIHJlcXVlc3QuIERlZmF1bHQgaXMgdHJ1ZS5cbiAgICogQHJldHVybiBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdm9pZCB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlZC5cbiAgICovXG4gIHByaXZhdGUgYWRkUmVjaXBlcyhyZWNpcGVzVG9BZGQ6IEJhc2tldEFjdGlvbltdLCB3aXRoSW5ncmVkaWVudHMgPSB0cnVlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG5cbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQmFza2V0LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoYmFza2V0ID0+IHtcbiAgICAgICAgY29uc3QgcmVjaXBlSWRzID0gcmVjaXBlc1RvQWRkXG4gICAgICAgICAgLm1hcChyID0+ICh7IHJlY2lwZV9pZDogci5wYXJhbXMucmVjaXBlSWQsIGd1ZXN0czogci5wYXJhbXMuZ3Vlc3RzIH0pKVxuICAgICAgICAgIC5maWx0ZXIociA9PiAhdGhpcy5jdXJyZW50bHlBZGRpbmdSZWNpcGVzLmluY2x1ZGVzKHIucmVjaXBlX2lkKSlcbiAgICAgICAgICAuZmlsdGVyKHIgPT4gIWJhc2tldC5oYXNSZWNpcGUoci5yZWNpcGVfaWQpKTtcbiAgICAgICAgaWYgKHJlY2lwZUlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCBhcyB2b2lkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRseUFkZGluZ1JlY2lwZXMgPSBbLi4udGhpcy5jdXJyZW50bHlBZGRpbmdSZWNpcGVzLCAuLi5yZWNpcGVJZHMubWFwKHIgPT4gci5yZWNpcGVfaWQpXTtcbiAgICAgICAgY29uc3QgcG9zdFVybCA9IGAke2UubWlhbUFQSX0vYXBpL3YxL2Jhc2tldHMvJHtiYXNrZXQuaWR9L3JlY2lwZXNgICtcbiAgICAgICAgICBgP2ZpZWxkc1tiYXNrZXRzXT0ke0JBU0tFVF9TUEFSU0VfRklFTERTLmJhc2tldHMuam9pbignLCcpfSR7d2l0aEluZ3JlZGllbnRzID8gJycgOiAnJmxpZ2h0X21vZGU9dHJ1ZSd9YDtcbiAgICAgICAgY29uc3QgYm9keSA9IHsgZGF0YTogcmVjaXBlSWRzIH07XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5zZW5kQWRkUmVjaXBlc0V2ZW50cyhyZWNpcGVzVG9BZGQpO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QocG9zdFVybCwgYm9keSkucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKGI6IERvY3VtZW50UmVzb3VyY2U8QmFza2V0PikgPT4gKGIuZGF0YT8uaWQpID8gdGhpcy5maWxsQmFza2V0KGIpIDogb2YobnVsbCBhcyB2b2lkKSksXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVjaXBlc0FkZGVkLmVtaXQocmVjaXBlSWRzLm1hcChyID0+IHIucmVjaXBlX2lkKSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRseUFkZGluZ1JlY2lwZXMgPSB0aGlzLmN1cnJlbnRseUFkZGluZ1JlY2lwZXMuZmlsdGVyKGlkID0+ICEodGhpcy5iYXNrZXQkLnZhbHVlLnJlY2lwZUluZm9zLmZpbmQoaSA9PiBpLmlkID09PSBpZCkpKTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwgYXMgdm9pZCkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUmVjaXBlc1dpdGhvdXRJbmdyZWRpZW50cyhyZWNpcGVzVG9BZGQ6IEJhc2tldEFjdGlvbltdKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRkUmVjaXBlcyhyZWNpcGVzVG9BZGQsIGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUmVjaXBlcyhyZWNpcGVzVG9SZW1vdmU6IEJhc2tldEFjdGlvbltdLCBsaWdodE1vZGUgPSBmYWxzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLndhaXRGb3JCYXNrZXQucGlwZShcbiAgICAgIHN3aXRjaE1hcChiYXNrZXQgPT4ge1xuICAgICAgICBsZXQgZGVsZXRlVXJsID0gYCR7ZS5taWFtQVBJfS9hcGkvdjEvYmFza2V0cy8ke2Jhc2tldC5pZH0vcmVjaXBlcz9yZWNpcGVfaWRzW109YCArXG4gICAgICAgICAgcmVjaXBlc1RvUmVtb3ZlLm1hcChyID0+IHIucGFyYW1zLnJlY2lwZUlkKS5qb2luKCcmcmVjaXBlX2lkc1tdPScpICtcbiAgICAgICAgICBgJmZpZWxkc1tiYXNrZXRzXT0ke0JBU0tFVF9TUEFSU0VfRklFTERTLmJhc2tldHMuam9pbignLCcpfWA7XG4gICAgICAgIGlmIChsaWdodE1vZGUpIHtcbiAgICAgICAgICBkZWxldGVVcmwgKz0gJyZsaWdodF9tb2RlPXRydWUnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5zZW5kUmVtb3ZlUmVjaXBlc0V2ZW50cyhyZWNpcGVzVG9SZW1vdmUpO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZShkZWxldGVVcmwpLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKChiOiBEb2N1bWVudFJlc291cmNlPEJhc2tldD4pID0+IChiLmRhdGE/LmlkKSA/IHRoaXMuZmlsbEJhc2tldChiKSA6IG9mKG51bGwgYXMgdm9pZCkpXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCBhcyB2b2lkKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVSZWNpcGVzR3Vlc3RzKHJlY2lwZXNUb1VwZGF0ZTogQmFza2V0QWN0aW9uW10sIGxpZ2h0TW9kZSA9IGZhbHNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgLy8gVE9ETyBiYXNrZXQtc3luY2hybzogU2VlIGlmIGl0IHJlYWN0cyBjb3JyZWN0bHlcbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQmFza2V0LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoYmFza2V0ID0+IHtcbiAgICAgICAgbGV0IHBhdGNoVXJsID0gYCR7ZS5taWFtQVBJfS9hcGkvdjEvYmFza2V0cy8ke2Jhc2tldC5pZH0vcmVjaXBlc19ndWVzdHM/Z3Vlc3RzPSR7cmVjaXBlc1RvVXBkYXRlWzBdLnBhcmFtcy5ndWVzdHN9JnJlY2lwZV9pZHNbXT1gICtcbiAgICAgICAgICByZWNpcGVzVG9VcGRhdGUubWFwKHIgPT4gci5wYXJhbXMucmVjaXBlSWQpLmpvaW4oJyZyZWNpcGVfaWRzW109JykgKyBgJmZpZWxkc1tiYXNrZXRzXT0ke0JBU0tFVF9TUEFSU0VfRklFTERTLmJhc2tldHMuam9pbignLCcpfWA7XG4gICAgICAgIGlmIChsaWdodE1vZGUpIHtcbiAgICAgICAgICBwYXRjaFVybCArPSAnJmxpZ2h0X21vZGU9dHJ1ZSc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLnNlbmRVcGRhdGVHdWVzdHNFdmVudHMocmVjaXBlc1RvVXBkYXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaChwYXRjaFVybCwge30pLnBpcGUoXG4gICAgICAgICAgc2tpcFdoaWxlKChiOiBEb2N1bWVudFJlc291cmNlPEJhc2tldD4pID0+ICFiKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoYiA9PiAoYi5kYXRhPy5pZCkgPyB0aGlzLmZpbGxCYXNrZXQoYikgOiBvZihudWxsIGFzIHZvaWQpKVxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwgYXMgdm9pZCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gaW5ncmVkaWVudHNUb0FkZFxuICAgKi9cbiAgcHJpdmF0ZSBhZGRJdGVtc0ZvckluZ3JlZGllbnRzKGluZ3JlZGllbnRzVG9BZGQ6IEJhc2tldEFjdGlvbltdKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMud2FpdEZvckJhc2tldC5waXBlKFxuICAgICAgc3dpdGNoTWFwKGJhc2tldCA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RzID0gaW5ncmVkaWVudHNUb0FkZC5tYXAoYWN0aW9uID0+IHtcbiAgICAgICAgICBjb25zdCBtb2RpZmllZEd1ZXN0cyA9IHRoaXMuZ3Vlc3RzRm9yUmVjaXBlKGFjdGlvbi5wYXJhbXMucmVjaXBlSWQpO1xuICAgICAgICAgIGNvbnN0IHBhdGNoVXJsID0gYCR7ZS5taWFtQVBJfS9hcGkvdjEvYmFza2V0cy8ke2Jhc2tldC5pZH0vYmFza2V0LWVudHJpZXMvJHthY3Rpb24ucGFyYW1zLmJhc2tldEVudHJ5LmlkfS9hZGQtaW5ncmVkaWVudGAgK1xuICAgICAgICAgICAgYD9pbmdyZWRpZW50X2lkPSR7YWN0aW9uLnBhcmFtcy5pbmdyZWRpZW50SWR9JnNlbGVjdGVkX2l0ZW1faWQ9JHthY3Rpb24ucGFyYW1zLmJhc2tldEVudHJ5LnNlbGVjdGVkSXRlbS5pZH1gICtcbiAgICAgICAgICAgIGAmZ3Vlc3RzPSR7bW9kaWZpZWRHdWVzdHN9JmZvcmNlZF9xdWFudGl0eT0ke2FjdGlvbi5wYXJhbXMuYmFza2V0RW50cnkucXVhbnRpdHl9YDtcbiAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBhdGNoKHBhdGNoVXJsLCB7fSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFuYWx5dGljc1NlcnZpY2Uuc2VuZEFkZFByb2R1Y3RzRXZlbnRzKGluZ3JlZGllbnRzVG9BZGQpO1xuICAgICAgICByZXR1cm4gZm9ya0pvaW4ocmVxdWVzdHMpO1xuICAgICAgfSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5yZWxvYWRCYXNrZXQoKSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gb2Y8dm9pZD4obnVsbCkpLCAvLyBKdXN0IHRvIGtlZXAgdGhlIHJldHVybiB0eXBlIGFzIE9ic2VydmFibGU8dm9pZD4gdG8gbWF0Y2ggd2l0aCB0aGUgb3RoZXIgbWV0aG9kc1xuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsIGFzIHZvaWQpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGl0ZW1zIHRvIHRoZSBiYXNrZXQgSFRUUCByZXF1ZXN0LlxuICAgKlxuICAgKiBAcGFyYW0gaXRlbXNUb0FkZCAtIGl0ZW1zIHRvIGFkZCB0byB0aGUgYmFza2V0XG4gICAqIEByZXR1cm4gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gdGhlIGl0ZW1zIGFyZSBzdWNjZXNzZnVsbHkgYWRkZWQuXG4gICAqL1xuICBwcml2YXRlIGFkZEl0ZW1zVG9CYXNrZXQoaXRlbXNUb0FkZDogQmFza2V0QWN0aW9uW10pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQmFza2V0LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoYmFza2V0ID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdHMgPSBpdGVtc1RvQWRkLm1hcChhY3Rpb24gPT4ge1xuICAgICAgICAgIGNvbnN0IHBvc3RVcmwgPSBgJHtlLm1pYW1BUEl9L2FwaS92MS9iYXNrZXRzLyR7YmFza2V0LmlkfS9iYXNrZXQtZW50cmllcy9mcm9tLWl0ZW1gICtcbiAgICAgICAgICAgIGA/aW5jbHVkZT1zZWxlY3RlZC1pdGVtJnNlbGVjdGVkX2l0ZW1faWQ9JHthY3Rpb24ucGFyYW1zLml0ZW0uaWR9YCArXG4gICAgICAgICAgICBgJm5hbWU9JHthY3Rpb24ucGFyYW1zLml0ZW0uYXR0cmlidXRlcy5uYW1lfWA7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuY29kZVVSSShwb3N0VXJsLnRyaW0oKSksIHt9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5zZW5kQWRkUHJvZHVjdHNFdmVudHMoaXRlbXNUb0FkZCk7XG4gICAgICAgIHJldHVybiBmb3JrSm9pbihyZXF1ZXN0cyk7XG4gICAgICB9KSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnJlbG9hZEJhc2tldCgpKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBvZjx2b2lkPihudWxsKSksIC8vIEp1c3QgdG8ga2VlcCB0aGUgcmV0dXJuIHR5cGUgYXMgT2JzZXJ2YWJsZTx2b2lkPiB0byBtYXRjaCB3aXRoIHRoZSBvdGhlciBtZXRob2RzXG4gICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwgYXMgdm9pZCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgaW5ncmVkaWVudHMgZnJvbSB0aGUgYmFza2V0IEhUVFAgcmVxdWVzdC5cbiAgICpcbiAgICogQHBhcmFtIGluZ3JlZGllbnRzVG9SZW1vdmUgLSBUaGUgbGlzdCBvZiBpbmdyZWRpZW50cyB0byByZW1vdmUgZnJvbSB0aGUgYmFza2V0LlxuICAgKiBAcmV0dXJuIEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB3aGVuIHRoZSBpbmdyZWRpZW50cyBhcmUgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAqL1xuICBwcml2YXRlIHJlbW92ZUl0ZW1zRm9ySW5ncmVkaWVudHMoaW5ncmVkaWVudHNUb1JlbW92ZTogQmFza2V0QWN0aW9uW10pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCByZXF1ZXN0cyA9IGluZ3JlZGllbnRzVG9SZW1vdmUubWFwKGFjdGlvbiA9PiB0aGlzLnJlbW92ZUluZ3JlZGllbnQoYWN0aW9uLnBhcmFtcy5iYXNrZXRFbnRyeSkpO1xuICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5zZW5kUmVtb3ZlUHJvZHVjdHNFdmVudHMoaW5ncmVkaWVudHNUb1JlbW92ZSk7XG4gICAgcmV0dXJuIGZvcmtKb2luKHJlcXVlc3RzKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMucmVsb2FkQmFza2V0KCkpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9mPHZvaWQ+KG51bGwpKSwgLy8gSnVzdCB0byBrZWVwIHRoZSByZXR1cm4gdHlwZSBhcyBPYnNlcnZhYmxlPHZvaWQ+IHRvIG1hdGNoIHdpdGggdGhlIG90aGVyIG1ldGhvZHNcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCBhcyB2b2lkKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVQcm9kdWN0V2l0aEZvcmNlZFF1YW50aXR5KGJhc2tldEVudHJpZXNUb1JlbW92ZTogQmFza2V0QWN0aW9uW10pIHtcbiAgICBjb25zdCByZXF1ZXN0cyA9IGJhc2tldEVudHJpZXNUb1JlbW92ZS5tYXAoYWN0aW9uID0+XG4gICAgICB0aGlzLnJlbW92ZUluZ3JlZGllbnRGcm9tUmVjaXBlKGFjdGlvbi5wYXJhbXMuYmFza2V0RW50cnksIGFjdGlvbi5wYXJhbXMuaW5ncmVkaWVudElkLCBhY3Rpb24ucGFyYW1zLmZvcmNlZFF1YW50aXR5KSk7XG4gICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLnNlbmRSZW1vdmVQcm9kdWN0c0V2ZW50cyhiYXNrZXRFbnRyaWVzVG9SZW1vdmUpO1xuICAgIHJldHVybiBmb3JrSm9pbihyZXF1ZXN0cykucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnJlbG9hZEJhc2tldCgpKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBvZjx2b2lkPihudWxsKSksIC8vIEp1c3QgdG8ga2VlcCB0aGUgcmV0dXJuIHR5cGUgYXMgT2JzZXJ2YWJsZTx2b2lkPiB0byBtYXRjaCB3aXRoIHRoZSBvdGhlciBtZXRob2RzXG4gICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwgYXMgdm9pZCkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlSW5ncmVkaWVudEZyb21SZWNpcGUoYmFza2V0RW50cnk6IEJhc2tldEVudHJ5LCBpbmdyZWRpZW50SWQ6IHN0cmluZywgZm9yY2VkUXVhbnRpdHk6IG51bWJlcik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGlmICghYmFza2V0RW50cnkucmVjaXBlc0lkcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYmFza2V0RW50cnkuZGVsZXRlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMud2FpdEZvckJhc2tldC5waXBlKFxuICAgICAgc3dpdGNoTWFwKGJhc2tldCA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGNoVXJsID0gYCR7ZS5taWFtQVBJfS9hcGkvdjEvYmFza2V0cy8ke2Jhc2tldC5pZH0vYmFza2V0LWVudHJpZXMvJHtiYXNrZXRFbnRyeS5pZH1gICtcbiAgICAgICAgICBgL3JlbW92ZS1yZWNpcGU/aW5ncmVkaWVudF9pZD0ke2luZ3JlZGllbnRJZH0mZm9yY2VkX3F1YW50aXR5PSR7Zm9yY2VkUXVhbnRpdHl9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaChwYXRjaFVybCwge30pO1xuICAgICAgfSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gb2Y8dm9pZD4obnVsbCkpLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsIGFzIHZvaWQpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUluZ3JlZGllbnQoYmFza2V0RW50cnk6IEJhc2tldEVudHJ5KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgaWYgKCFiYXNrZXRFbnRyeS5yZWNpcGVzSWRzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBiYXNrZXRFbnRyeS5kZWxldGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQmFza2V0LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoYmFza2V0ID0+IHtcbiAgICAgICAgY29uc3QgcGF0Y2hVcmwgPSBgJHtlLm1pYW1BUEl9L2FwaS92MS9iYXNrZXRzLyR7YmFza2V0LmlkfS9iYXNrZXQtZW50cmllcy8ke2Jhc2tldEVudHJ5LmlkfS9yZW1vdmUtaW5ncmVkaWVudGA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2gocGF0Y2hVcmwsIHt9KTtcbiAgICAgIH0pLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9mPHZvaWQ+KG51bGwpKSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCBhcyB2b2lkKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIHF1YW50aXRpZXMgb2YgYmFza2V0IGVudHJpZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7QmFza2V0QWN0aW9uW119IHF1YW50aXRpZXNUb0NoYW5nZSAtIEFuIGFycmF5IG9mIEJhc2tldEFjdGlvbiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgcXVhbnRpdGllcyB0byBjaGFuZ2UuXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8dm9pZD59IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB2b2lkIHdoZW4gdGhlIHF1YW50aXRpZXMgaGF2ZSBiZWVuIGNoYW5nZWQuXG4gICAqL1xuICBwcml2YXRlIGNoYW5nZUJhc2tldEVudHJpZXNRdWFudGl0aWVzKHF1YW50aXRpZXNUb0NoYW5nZTogQmFza2V0QWN0aW9uW10pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICB0aGlzLmFuYWx5dGljc1NlcnZpY2Uuc2VuZFByb2R1Y3RzQ2hhbmdlUXVhbnRpdHlFdmVudHMocXVhbnRpdGllc1RvQ2hhbmdlKTtcbiAgICBjb25zdCByZXF1ZXN0cyA9IHF1YW50aXRpZXNUb0NoYW5nZS5tYXAoYWN0aW9uID0+XG4gICAgICB0aGlzLmJhc2tldEVudHJpZXNTZXJ2aWNlLnVwZGF0ZVF1YW50aXR5KGFjdGlvbi5wYXJhbXMuYmFza2V0RW50cnkuaWQsIGFjdGlvbi5wYXJhbXMubmV3UXVhbnRpdHkpXG4gICAgKTtcbiAgICByZXR1cm4gZm9ya0pvaW4ocmVxdWVzdHMpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5yZWxvYWRCYXNrZXQoKSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gb2Y8dm9pZD4obnVsbCkpLCAvLyBKdXN0IHRvIGtlZXAgdGhlIHJldHVybiB0eXBlIGFzIE9ic2VydmFibGU8dm9pZD4gdG8gbWF0Y2ggd2l0aCB0aGUgb3RoZXIgbWV0aG9kc1xuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsIGFzIHZvaWQpKVxuICAgICk7XG4gIH1cblxuICAvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVQREFUSU5HIFRIRSBCQVNLRVQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqL1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgX2Jhc2tldCQgY29udGVudCAmIHNhdmUgYmFza2V0SWQgaW4gdGhlIGxvY2FsU3RvcmFnZSBpZiB0aGUgdXNlciBpcyBub3QgbG9nZ3VlZCBpbiBzbyB3ZSBjYW4gbWVyZ2VXaXRoIHdoZW4gdGhleSBsb2cgaW5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlTG9jYWxCYXNrZXQoYmFza2V0OiBCYXNrZXQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICB0aGlzLmJhc2tldFByZXZpZXdJc0NhbGN1bGF0aW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuX2Jhc2tldCQubmV4dChiYXNrZXQpO1xuICAgIHJldHVybiB0aGlzLmxvYWRQcmV2aWV3KCkucGlwZSh0YXAoKCkgPT4ge1xuICAgICAgdGhpcy5iYXNrZXRJc0ZldGNoaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMuY3VycmVudEFuZFByZXZpZXdGZXRjaGluZy5uZXh0KGZhbHNlKTtcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogc2F2ZSgpIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgaXNuJ3QgYSByZXNvdXJjZSBzbyBtZXRob2RzIGFyZW4ndCBhdHRhY2hlZCwgc28gd2UgaGF2ZSB0byBkbyBhIGxpdHRsZSB0cmlja1xuICAgKiBAcGFyYW0gcmVzIHJlc3VsdCBvZiB0aGUgc2F2ZVxuICAgKiBAcmV0dXJucyBjb3JyZWN0IEJhc2tldCB3aXRoIHRoZSByaWdodCBhdHRyaWJ1dGVzICYgbWV0aG9kc1xuICAgKi9cbiAgcHJpdmF0ZSBmaWxsQmFza2V0KHJlczogRG9jdW1lbnRSZXNvdXJjZTxCYXNrZXQ+KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgYmFza2V0ID0gdGhpcy5uZXcoKTtcbiAgICBiYXNrZXQuZmlsbChyZXMpO1xuICAgIHRoaXMuYmFza2V0UHJldmlld0lzQ2FsY3VsYXRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5fYmFza2V0JC5uZXh0KGJhc2tldCk7XG4gICAgcmV0dXJuIHRoaXMubG9hZFByZXZpZXcoKTtcbiAgfVxuXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOSVRJQUwgTE9BRCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqL1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNlIHRoZSBiYXNrZXQgbG9hZGluZyB3aGVuIHRoZSBwb3MgaXMgaW5pdGlhbGlzZWQgb3IgbW9kaWZpZWRcbiAgICogQHJldHVybnMgX2Jhc2tldCRcbiAgICovXG4gIHByaXZhdGUgbG9hZEJhc2tldCgpOiBPYnNlcnZhYmxlPEJhc2tldD4ge1xuICAgIHJldHVybiB0aGlzLnBvc1NlcnZpY2Uud2FpdEZvclBvcy5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMucmVmcmVzaEN1cnJlbnRCYXNrZXQoKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkUHJldmlldygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQmFza2V0LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoYmFza2V0ID0+IHRoaXMucmVjaXBlc1NlcnZpY2UubG9hZFJlY2lwZXMoYmFza2V0LnJlY2lwZUluZm9zKSksXG4gICAgICBzd2l0Y2hNYXAoKHJlY2lwZXM6IFJlY2lwZVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2tldDogQmFza2V0ID0gdGhpcy5fYmFza2V0JC52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hCYXNrZXRFbnRyaWVzKGJhc2tldCkucGlwZShcbiAgICAgICAgICBtYXAoZW50cmllcyA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaW5lRW50cmllcyA9IHRoaXMuZ3JvdXBCYXNrZXRFbnRyaWVzKHJlY2lwZXMsIGVudHJpZXMpO1xuICAgICAgICAgICAgY29uc3QgbGluZXMgPSB0aGlzLnJlY2lwZXNBbmRMaW5lRW50cmllc1RvQmFza2V0UHJldmlld0xpbmUocmVjaXBlcywgbGluZUVudHJpZXMpO1xuICAgICAgICAgICAgdGhpcy5fYmFza2V0UHJldmlldyQubmV4dChsaW5lcyk7XG4gICAgICAgICAgICB0aGlzLmJhc2tldFByZXZpZXdJc0NhbGN1bGF0aW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuYmFza2V0U3RhdHMkLm5leHQodGhpcy5idWlsZFN0YXRzKGxpbmVzKSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hCYXNrZXRFbnRyaWVzKGJhc2tldDogQmFza2V0KTogT2JzZXJ2YWJsZTxCYXNrZXRFbnRyeVtdPiB7XG4gICAgaWYgKCFiYXNrZXQgfHwgIWJhc2tldC5jb21wbGV0aW9uIHx8IGJhc2tldC5jb21wbGV0aW9uLnRvdGFsIDwgMSkge1xuICAgICAgdGhpcy5fZW50cmllcyQubmV4dChbXSk7XG4gICAgICByZXR1cm4gdGhpcy5fZW50cmllcyQucGlwZSh0YWtlKDEpKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlc0NvdW50ID0gTWF0aC5jZWlsKGJhc2tldC5jb21wbGV0aW9uLnRvdGFsIC8gQmFza2V0c1NlcnZpY2UuZW50cmllc1BlclBhZ2VzKTtcbiAgICByZXR1cm4gZm9ya0pvaW4oQXJyYXkocGFnZXNDb3VudCkuZmlsbCgwKS5tYXAoKHYsIGkpID0+IHRoaXMuZmV0Y2hCYXNrZXRFbnRyaWVzUGFnZShiYXNrZXQsIGkgKyAxKSkpLnBpcGUoXG4gICAgICBtYXAoKGNvbGxlY3Rpb25zOiBEb2N1bWVudENvbGxlY3Rpb248QmFza2V0RW50cnk+W10pID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbFxuICAgICAgICBjb25zdCBlbnRyaWVzID0gKGZsYXR0ZW4oY29sbGVjdGlvbnMubWFwKGNvbCA9PiBjb2wuZGF0YSkpIGFzIEJhc2tldEVudHJ5W10pO1xuICAgICAgICB0aGlzLl9lbnRyaWVzJC5uZXh0KGVudHJpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZW50cmllcyQudmFsdWU7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3RhdHMobGluZXM6IEJhc2tldFByZXZpZXdMaW5lW10pOiBCYXNrZXRTdGF0cyB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsXG4gICAgY29uc3QgZW50cmllc0ZvdW5kOiBCYXNrZXRFbnRyeVtdID0gdW5pb25CeSguLi5saW5lcy5tYXAobGluZSA9PiBsaW5lLmVudHJpZXMuZm91bmQpLCAnaWQnKTtcblxuICAgIGNvbnN0IHRvdGFsUHJpY2UgPSBlbnRyaWVzRm91bmQucmVkdWNlKCh0b3RhbCwgZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IGJhc2tldEVudHJpZXNJdGVtID0gZW50cnkuYXR0cmlidXRlc1snYmFza2V0LWVudHJpZXMtaXRlbXMnXS5maW5kKGkgPT4gaS5pdGVtX2lkID09PSBlbnRyeS5hdHRyaWJ1dGVzWydzZWxlY3RlZC1pdGVtLWlkJ10pO1xuICAgICAgdG90YWwgKz0gKGVudHJ5LmF0dHJpYnV0ZXMucXVhbnRpdHkgfHwgMCkgKiBwYXJzZUZsb2F0KGJhc2tldEVudHJpZXNJdGVtWyd1bml0LXByaWNlJ10pO1xuICAgICAgcmV0dXJuIHRvdGFsO1xuICAgIH0sIDApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY2lwZXNDb3VudDogbGluZXMubGVuZ3RoLFxuICAgICAgZW50cmllc0NvdW50OiBlbnRyaWVzRm91bmQubGVuZ3RoLFxuICAgICAgdG90YWxQcmljZVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGZldGNoQmFza2V0RW50cmllc1BhZ2UoYmFza2V0OiBCYXNrZXQsIHBhZ2U6IG51bWJlcik6IE9ic2VydmFibGU8RG9jdW1lbnRDb2xsZWN0aW9uPEJhc2tldEVudHJ5Pj4ge1xuICAgIGxldCBnZXRVcmwgPSBgJHtlLm1pYW1BUEl9L2FwaS92MS9iYXNrZXRzLyR7YmFza2V0LmlkfS9iYXNrZXQtZW50cmllc2A7XG4gICAgZ2V0VXJsID0gYCR7Z2V0VXJsfT9pbmNsdWRlPWl0ZW1zLHNlbGVjdGVkLWl0ZW0mcGFnZVtudW1iZXJdPSR7cGFnZX0mcGFnZVtzaXplXT0ke0Jhc2tldHNTZXJ2aWNlLmVudHJpZXNQZXJQYWdlc31gO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZ2V0VXJsKS5waXBlKFxuICAgICAgbWFwKChyZXNwOiBEb2N1bWVudENvbGxlY3Rpb248QmFza2V0RW50cnk+KSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2tldEVudHJpZXMgPSB0aGlzLmJhc2tldEVudHJpZXNTZXJ2aWNlLm5ld0NvbGxlY3Rpb24oKTtcbiAgICAgICAgYmFza2V0RW50cmllcy5maWxsKHJlc3ApO1xuICAgICAgICByZXR1cm4gYmFza2V0RW50cmllcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjaXBlc0FuZExpbmVFbnRyaWVzVG9CYXNrZXRQcmV2aWV3TGluZShyZWNpcGVzOiBSZWNpcGVbXSwgbGluZUVudHJpZXM6IExpbmVFbnRyaWVzW10pOiBCYXNrZXRQcmV2aWV3TGluZVtdIHtcbiAgICByZXR1cm4gcmVjaXBlcy5tYXAoKHJlY2lwZSwgaWR4KSA9PiB7XG4gICAgICBjb25zdCBpdGVtc0NvdW50ID0gbGluZUVudHJpZXNbaWR4XS5mb3VuZC5sZW5ndGg7XG4gICAgICBsZXQgcmVjaXBlUHJpY2UgPSAwLjA7XG4gICAgICBjb25zdCBndWVzdHMgPSByZWNpcGUubW9kaWZpZWRHdWVzdHMgfHwgcGFyc2VJbnQocmVjaXBlLmd1ZXN0cywgMTApO1xuXG4gICAgICBsaW5lRW50cmllc1tpZHhdLmZvdW5kLmZvckVhY2goZW50cnkgPT4ge1xuICAgICAgICBjb25zdCBxdHkgPSBlbnRyeS5hdHRyaWJ1dGVzLnF1YW50aXR5O1xuICAgICAgICBjb25zdCB1bml0UHJpY2UgPSB0aGlzLnByaWNlU2VydmljZS5nZXRDdXJyZW50UHJpY2UodGhpcy5wcmljZVNlcnZpY2UuZ2V0UHJpY2VGcm9tQmFza2V0RW50cnkoZW50cnkpKTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZSZWNpcGVzRm9yRW50cnkgPSBlbnRyeS5yZWNpcGVzSWRzLmxlbmd0aCB8fCAxO1xuXG4gICAgICAgIHJlY2lwZVByaWNlICs9IChxdHkgKiB1bml0UHJpY2UpIC8gbnVtYmVyT2ZSZWNpcGVzRm9yRW50cnk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHByaWNlUGVyR3Vlc3QgPSByZWNpcGVQcmljZSAvIGd1ZXN0cztcblxuICAgICAgcmV0dXJuIEJhc2tldFByZXZpZXdMaW5lLmZyb21SZWNpcGUocmVjaXBlLCBpdGVtc0NvdW50LCBwcmljZVBlckd1ZXN0LCByZWNpcGVQcmljZSwgbGluZUVudHJpZXNbaWR4XSk7XG4gICAgfSkuc29ydCgoYSwgYikgPT4gcmVjaXBlcy5maW5kSW5kZXgociA9PiByLmlkID09PSBiLmlkKSAtIHJlY2lwZXMuZmluZEluZGV4KHIgPT4gci5pZCA9PT0gYS5pZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBncm91cEJhc2tldEVudHJpZXMocmVjaXBlczogUmVjaXBlW10sIGVudHJpZXM6IEJhc2tldEVudHJ5W10pOiBMaW5lRW50cmllc1tdIHtcbiAgICByZXR1cm4gcmVjaXBlcy5tYXAocmVjaXBlID0+IHtcbiAgICAgIGNvbnN0IGxpbmVFbnRyaWVzID0geyBmb3VuZDogW10sIG5vdEZvdW5kOiBbXSwgb2Z0ZW5EZWxldGVkOiBbXSwgcmVtb3ZlZDogW10sIGFsbDogW10gfSBhcyBMaW5lRW50cmllcztcbiAgICAgIGVudHJpZXNcbiAgICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeS5yZWNpcGVzSWRzLmluY2x1ZGVzKCtyZWNpcGUuaWQpKVxuICAgICAgICAuZm9yRWFjaChlbnRyeSA9PiB7XG4gICAgICAgICAgY29uc3QgYXZhaWxhYmxlID0gZW50cnkuYXR0cmlidXRlc1snc2VsZWN0ZWQtaXRlbS1pZCddO1xuICAgICAgICAgIGlmIChhdmFpbGFibGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZW50cnkuc3RhdHVzKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ29mdGVuX2RlbGV0ZWQnOiB7XG4gICAgICAgICAgICAgICAgbGluZUVudHJpZXMub2Z0ZW5EZWxldGVkLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZWQnOiB7XG4gICAgICAgICAgICAgICAgbGluZUVudHJpZXMucmVtb3ZlZC5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgbGluZUVudHJpZXMuZm91bmQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGluZUVudHJpZXMubm90Rm91bmQucHVzaChlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxpbmVFbnRyaWVzLmFsbC5wdXNoKGVudHJ5KTtcbiAgICAgICAgfSk7XG4gICAgICByZXR1cm4gbGluZUVudHJpZXM7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
953
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFza2V0cy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctbWlhbS9zcmMvbGliL19zZXJ2aWNlcy9iYXNrZXRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQXdDLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM5RixPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEcsT0FBTyxFQUFFLE1BQU0sRUFBZSxpQkFBaUIsRUFBeUMsTUFBTSxZQUFZLENBQUM7QUFFM0csT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFJckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxJQUFJLENBQUMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hF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NEJBQ3BCLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUNyQyxNQUFNO3lCQUNQO3dCQUNELEtBQUssU0FBUyxDQUFDLENBQUM7NEJBQ2QsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ2hDLE1BQU07eUJBQ1A7d0JBQ0QsT0FBTyxDQUFDLENBQUM7NEJBQ1AsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQzlCLE1BQU07eUJBQ1A7cUJBQ0Y7aUJBQ0Y7cUJBQU07b0JBQ0wsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2xDO2dCQUNELFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLENBQUMsQ0FBQyxDQUFDO1lBQ0wsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQTVxQ00sOEJBQWUsR0FBRyxFQUFFLENBQUM7NEVBRGpCLGNBQWM7c0RBQWQsY0FBYyxXQUFkLGNBQWMsbUJBRmIsTUFBTTt1RkFFUCxjQUFjO2NBSDFCLFVBQVU7ZUFBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZsYXR0ZW4sIHVuaW9uQnkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgc2V0QWZmaWxpYXRlIH0gZnJvbSAnbWVhbHotc2hhcmVkLWFuYWx5dGljcyc7XG5pbXBvcnQgeyBEb2N1bWVudENvbGxlY3Rpb24sIERvY3VtZW50UmVzb3VyY2UsIFNlcnZpY2UgfSBmcm9tICdtaWFtLWpzb25hcGknO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBtYXAsIHNraXBXaGlsZSwgc3dpdGNoTWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCYXNrZXQsIEJhc2tldEVudHJ5LCBCYXNrZXRQcmV2aWV3TGluZSwgSW5ncmVkaWVudCwgSXRlbSwgTGluZUVudHJpZXMsIFJlY2lwZSB9IGZyb20gJy4uL19tb2RlbHMnO1xuaW1wb3J0IHsgQmFza2V0QWN0aW9uIH0gZnJvbSAnLi4vX3R5cGVzL2Jhc2tldC1hY3Rpb24nO1xuaW1wb3J0IHsgQmFza2V0QWN0aW9uVHlwZSB9IGZyb20gJy4uL190eXBlcy9iYXNrZXQtYWN0aW9uLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBCYXNrZXRTdGF0cyB9IGZyb20gJy4uL190eXBlcy9iYXNrZXQtc3RhdHMnO1xuaW1wb3J0IHsgQ29tcGFyYWJsZVByb2R1Y3QgfSBmcm9tICcuLi9fdHlwZXMvYnVpbGRlZC9jb21wYXJhYmxlLXByb2R1Y3QnO1xuaW1wb3J0IHsgRXZlbnRUcmFjZSB9IGZyb20gJy4uL190eXBlcy9ldmVudC10cmFjZSc7XG5pbXBvcnQgeyBNZXNzYWdlVHlwZSB9IGZyb20gJy4uL190eXBlcy9tZXNzYWdlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBtZWFsekRlYnVnIH0gZnJvbSAnLi4vX3V0aWxzL21ldGhvZHMvbG9nZ2luZyc7XG5pbXBvcnQgeyBlbnZpcm9ubWVudCBhcyBlIH0gZnJvbSAnLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50JztcbmltcG9ydCB7IEFuYWx5dGljc1NlcnZpY2UgfSBmcm9tICcuL2FuYWx5dGljcy5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2tldEVudHJpZXNTZXJ2aWNlIH0gZnJvbSAnLi9iYXNrZXQtZW50cmllcy5zZXJ2aWNlJztcbmltcG9ydCB7IElnbm9yZWRJbmdyZWRpZW50c1NlcnZpY2UgfSBmcm9tICcuL2lnbm9yZWQtaW5ncmVkaWVudHMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2ludE9mU2FsZXNTZXJ2aWNlIH0gZnJvbSAnLi9wb2ludC1vZi1zYWxlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFByaWNlU2VydmljZSB9IGZyb20gJy4vcHJpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBSZWNpcGVzU2VydmljZSB9IGZyb20gJy4vcmVjaXBlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRlc1NlcnZpY2UgfSBmcm9tICcuL3N0YXRlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnLi90b2FzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuL3VzZXIuc2VydmljZSc7XG5cbmV4cG9ydCBjb25zdCBCQVNLRVRfU1BBUlNFX0ZJRUxEUyA9IHtcbiAgYmFza2V0czogWyd0b3RhbC1wcmljZScsICdyZWNpcGVzLWluZm9zJywgJ2NvbXBsZXRpb24nLCAnc3RhdHVzJ11cbn07XG5cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQmFza2V0c1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlPEJhc2tldD4ge1xuICBzdGF0aWMgZW50cmllc1BlclBhZ2VzID0gMzA7XG5cbiAgcmVzb3VyY2UgPSBCYXNrZXQ7XG4gIHR5cGUgPSAnYmFza2V0cyc7XG4gIF9iYXNrZXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxCYXNrZXQ+KG51bGwpO1xuICBfYmFza2V0UHJldmlldyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEJhc2tldFByZXZpZXdMaW5lW10+KG51bGwpO1xuICBiYXNrZXRTdGF0cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEJhc2tldFN0YXRzPihudWxsKTtcbiAgY3VycmVudEFuZFByZXZpZXdGZXRjaGluZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBiYXNrZXRJc0ZldGNoaW5nJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIGJhc2tldFByZXZpZXdJc0NhbGN1bGF0aW5nJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcbiAgYmFza2V0SW5pdENhbGxlZCA9IGZhbHNlO1xuICByZWNpcGVzQWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuICBjb25maXJtaW5nID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGN1cnJlbnRseUFkZGluZ1JlY2lwZXM6IHN0cmluZ1tdID0gW107XG5cbiAgcHJpdmF0ZSBiYXNrZXRBY3Rpb25zUXVldWUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEJhc2tldEFjdGlvbltdPihbXSk7XG4gIHByaXZhdGUgY3VycmVudFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF9lbnRyaWVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QmFza2V0RW50cnlbXT4oW10pO1xuICBwcml2YXRlIGFjdGlvbnNCZWluZ1Byb2Nlc3NlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QmFza2V0QWN0aW9uW10+KFtdKTtcbiAgcHJpdmF0ZSBhY3Rpb25zQmVpbmdPdmVycmlkZGVuOiBCYXNrZXRBY3Rpb25bXSA9IFtdO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgYmFza2V0RW50cmllc1NlcnZpY2U6IEJhc2tldEVudHJpZXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgcG9zU2VydmljZTogUG9pbnRPZlNhbGVzU2VydmljZSxcbiAgICBwcml2YXRlIHJlY2lwZXNTZXJ2aWNlOiBSZWNpcGVzU2VydmljZSxcbiAgICBwcml2YXRlIGFuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2Vyc1NlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RlclNlcnZpY2U6IFRvYXN0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgaWdub3JlZEJhc2tldHNTZXJ2aWNlOiBJZ25vcmVkSW5ncmVkaWVudHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RhdGVzU2VydmljZTogU3RhdGVzU2VydmljZSxcbiAgICBwcml2YXRlIHByaWNlU2VydmljZTogUHJpY2VTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yZWdpc3RlcigpO1xuICAgIHRoaXMuaW5pdFF1ZXVlRW1wdHlpbmcoKTtcbiAgICB0aGlzLmluaXRUb2FzdGVyT25SZWNpcGVBZGRlZCgpO1xuICB9XG5cbiAgLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBHRVRURVJTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi9cblxuICAvKipcbiAgICogV2Ugd2FudCBiYXNrZXQkIHRvIGJlIGEgc2luZ2xldG9uIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgYmFza2V0LCBzbyBpdCBpcyBmZXRjaGVkIG9ubHkgd2hlbiBuZWNlc3NhcnkuXG4gICAqIEF0IGFueSBwb2ludCBpbiB0aW1lIHRoZSBiYXNrZXQgY2FuIGJlIGZldGNoZWQgdmlhIHRoZSBpbml0QmFza2V0IGZ1bmN0aW9uIChpZiB3ZSB3YW50IHRvIGZldGNoIGl0IG9uIHN0YXJ0dXAgdG8gc2F2ZSB0aW1lIGxhdGVyKVxuICAgKiBCdXQgaWYgaW5pdEJhc2tldCBpcyBub3QgY2FsbGVkLCB0aGUgYmFza2V0IHdpbGwgb25seSBiZSBmZXRjaGVkIHRoZSAxc3QgdGltZSBpdCBpcyBuZWVkZWQuXG4gICAqL1xuICBnZXQgYmFza2V0JCgpOiBCZWhhdmlvclN1YmplY3Q8QmFza2V0PiB7XG4gICAgaWYgKCF0aGlzLl9iYXNrZXQkLnZhbHVlICYmICF0aGlzLmJhc2tldElzRmV0Y2hpbmckLnZhbHVlKSB7XG4gICAgICB0aGlzLmJhc2tldElzRmV0Y2hpbmckLm5leHQodHJ1ZSk7XG4gICAgICB0aGlzLmluaXRCYXNrZXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Jhc2tldCQ7XG4gIH1cblxuICAvKipcbiAgICogYmFza2V0UHJldmlldyQgc2hvdWxkIGFsc28gYmUgYSBzaW5nbGV0b24sIGFuZCBhcyB3ZWxsIGFzIGJhc2tldCQgaXQgd2lsbCBiZSBjYWxjdWxhdGVkIGZvciB0aGUgZmlyc3QgdGltZSBvbmx5IHdoZW4gbmVjZXNzYXJ5XG4gICAqIG9yIGlmIGxvYWRQcmV2aWV3IGlzIGNhbGxlZCBiZWZvcmVcbiAgICovXG4gIGdldCBiYXNrZXRQcmV2aWV3JCgpOiBCZWhhdmlvclN1YmplY3Q8QmFza2V0UHJldmlld0xpbmVbXT4ge1xuICAgIGlmICghdGhpcy5fYmFza2V0UHJldmlldyQudmFsdWUgJiYgIXRoaXMuYmFza2V0UHJldmlld0lzQ2FsY3VsYXRpbmckLnZhbHVlKSB7XG4gICAgICB0aGlzLmJhc2tldFByZXZpZXdJc0NhbGN1bGF0aW5nJC5uZXh0KHRydWUpO1xuICAgICAgdGhpcy5pbml0QmFza2V0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9iYXNrZXRQcmV2aWV3JDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyB1c2Ugd2hlbiBuZWVkaW5nIHRvIGJlIHN1cmUgdGhhdCBiYXNrZXQgd2FzIGZldGNoZWQgYmVmb3JlIGRvaW5nIGFuIGFjdGlvbiB0aGF0IGRvZXNuJ3QgbmVlZCB0byBzdGF5IHN1YnNjcmliZWQgdG8gYmFza2V0JFxuICAgKiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSBhbiBlcXVpdmFsZW50IG9mIGJhc2tldCQudmFsdWUgYnV0IGFzeW5jaHJvbm91c1xuICAgKi9cbiAgZ2V0IHdhaXRGb3JCYXNrZXQoKTogT2JzZXJ2YWJsZTxCYXNrZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5iYXNrZXQkLnBpcGUoXG4gICAgICBza2lwV2hpbGUoYiA9PiAhYiksXG4gICAgICB0YWtlKDEpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyB1c2Ugd2hlbiBuZWVkaW5nIHRvIGJlIHN1cmUgdGhhdCBiYXNrZXQgd2FzIGZldGNoZWQgYmVmb3JlIGRvaW5nIGFuIGFjdGlvbiB0aGF0IGRvZXNuJ3QgbmVlZCB0byBzdGF5IHN1YnNjcmliZWQgdG8gYmFza2V0JFxuICAgKiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSBhbiBlcXVpdmFsZW50IG9mIGJhc2tldCQudmFsdWUgYnV0IGFzeW5jaHJvbm91c1xuICAgKi9cbiAgZ2V0IHdhaXRGb3JCYXNrZXRFbnRyaWVzKCk6IE9ic2VydmFibGU8QmFza2V0RW50cnlbXT4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFt0aGlzLl9lbnRyaWVzJCwgdGhpcy5iYXNrZXRQcmV2aWV3SXNDYWxjdWxhdGluZyRdKS5waXBlKFxuICAgICAgc2tpcFdoaWxlKChbYiwgYnBDYWxjdWxhdGluZ10pID0+ICFiIHx8ICF0aGlzLmJhc2tldEluaXRDYWxsZWQgfHwgYnBDYWxjdWxhdGluZyksXG4gICAgICB0YWtlKDEpLFxuICAgICAgbWFwKChbYl0pID0+IGIpXG4gICAgKTtcbiAgfVxuXG5cbiAgcmVjaXBlc0luQmFza2V0JCgpOiBPYnNlcnZhYmxlPHsgaWQ6IHN0cmluZzsgcHJpY2U6IHN0cmluZyB9W10+IHtcbiAgICByZXR1cm4gdGhpcy5iYXNrZXRQcmV2aWV3JC5waXBlKFxuICAgICAgc2tpcFdoaWxlKHByZXZpZXcgPT4gIXByZXZpZXcgfHwgcHJldmlldy5sZW5ndGggPT09IDApLFxuICAgICAgbWFwKChhcnJheTogQmFza2V0UHJldmlld0xpbmVbXSkgPT4gYXJyYXkubWFwKGl0ZW0gPT4gKHtcbiAgICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICAgIHByaWNlOiBpdGVtLnByaWNlXG4gICAgICB9KSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5JVCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovXG5cbiAgcHJpdmF0ZSBpbml0UXVldWVFbXB0eWluZygpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgzNTApLFxuICAgICAgICBza2lwV2hpbGUoYWN0aW9ucyA9PiBhY3Rpb25zLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmFjdGlvbnNCZWluZ1Byb2Nlc3NlZC52YWx1ZS5sZW5ndGggPiAwKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuZW1wdHlBY3Rpb25zUXVldWUoKSlcbiAgICAgICkuc3Vic2NyaWJlKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0VG9hc3Rlck9uUmVjaXBlQWRkZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjaXBlc1NlcnZpY2UuY29uZmlybWF0aW9uVG9hc3Rlcikge1xuICAgICAgdGhpcy5zaG93UmVjaXBlQWRkZWRUb2FzdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFFVRVVFIFVUSUxTIFRPIExPQ0sgTU9SRSBBQ1RJT05TIE9SIERJU1BMQVkgTE9BREVSUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi9cblxuICAvLyBVdGlsIG1ldGhvZCB0byBhdm9pZCByZXBlYXRpbmcgdG9vIG11Y2ggZm9yIHRoZSBuZXh0IDYgbWV0aG9kc1xuICBwcml2YXRlIHN1YmplY3RDb250YWluc1JlY2lwZUlkKHN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxCYXNrZXRBY3Rpb25bXT4sIHR5cGU6IEJhc2tldEFjdGlvblR5cGUsIHJlY2lwZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB0eXBlTWF0Y2ggPSAoYTogQmFza2V0QWN0aW9uKTogYm9vbGVhbiA9PiB0eXBlID09PSBhLnR5cGU7XG4gICAgcmV0dXJuIHN1YmplY3QucGlwZShtYXAodmFsdWUgPT4gdmFsdWUuc29tZShhID0+IHR5cGVNYXRjaChhKSAmJiBhLnBhcmFtcy5yZWNpcGVJZCA9PT0gcmVjaXBlSWQpKSk7XG4gIH1cblxuICAvLyBVdGlsIG1ldGhvZCB0byBhdm9pZCByZXBlYXRpbmcgdG9vIG11Y2ggZm9yIHRoZSBuZXh0IDYgbWV0aG9kc1xuICBwcml2YXRlIHN1YmplY3RDb250YWluc0luZ3JlZGllbnRJZChcbiAgICBzdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QmFza2V0QWN0aW9uW10+LCB0eXBlOiBCYXNrZXRBY3Rpb25UeXBlLCBpbmdyZWRpZW50SWQ6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gc3ViamVjdC5waXBlKG1hcCh2YWx1ZSA9PiB2YWx1ZS5zb21lKGEgPT4gYS50eXBlID09PSB0eXBlICYmIGEucGFyYW1zLmluZ3JlZGllbnRJZCA9PT0gaW5ncmVkaWVudElkKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJqZWN0Q29udGFpbnNFbnRyeUlkKFxuICAgIHN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxCYXNrZXRBY3Rpb25bXT4sIHR5cGU6IEJhc2tldEFjdGlvblR5cGUsIGVudHJ5SWQ6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gc3ViamVjdC5waXBlKG1hcCh2YWx1ZSA9PiB2YWx1ZS5zb21lKGEgPT4gYS50eXBlID09PSB0eXBlICYmIGEucGFyYW1zLmJhc2tldEVudHJ5Py5pZCA9PT0gZW50cnlJZCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3ViamVjdENvbnRhaW5zSXRlbUlkKFxuICAgIHN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxCYXNrZXRBY3Rpb25bXT4sIHR5cGU6IEJhc2tldEFjdGlvblR5cGUsIGl0ZW1JZDogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBzdWJqZWN0LnBpcGUobWFwKHZhbHVlID0+IHZhbHVlLnNvbWUoYSA9PiBhLnR5cGUgPT09IHR5cGUgJiYgYS5wYXJhbXMuaXRlbS5pZCA9PT0gaXRlbUlkKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJqZWN0Q29udGFpbnNBY3Rpb25UeXBlKFxuICAgIHN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxCYXNrZXRBY3Rpb25bXT4sIHR5cGU6IEJhc2tldEFjdGlvblR5cGVcbiAgKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHN1YmplY3QucGlwZShtYXAodmFsdWUgPT4gdmFsdWUuc29tZShhID0+IGEudHlwZSA9PT0gdHlwZSkpKTtcbiAgfVxuXG4gIHJlY2lwZVdpbGxCZUFkZGVkKHJlY2lwZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0Q29udGFpbnNSZWNpcGVJZCh0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZSwgQmFza2V0QWN0aW9uVHlwZS5BRERfUkVDSVBFLCByZWNpcGVJZCk7XG4gIH1cblxuICByZWNpcGVXaWxsQmVSZW1vdmVkKHJlY2lwZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0Q29udGFpbnNSZWNpcGVJZCh0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZSwgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUkVDSVBFLCByZWNpcGVJZCk7XG4gIH1cblxuICByZWNpcGVXaWxsQmVVcGRhdGVkKHJlY2lwZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0Q29udGFpbnNSZWNpcGVJZCh0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZSwgQmFza2V0QWN0aW9uVHlwZS5VUERBVEVfUkVDSVBFLCByZWNpcGVJZCk7XG4gIH1cblxuICByZWNpcGVJc0JlaW5nQWRkZWQocmVjaXBlSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3RDb250YWluc1JlY2lwZUlkKHRoaXMuYWN0aW9uc0JlaW5nUHJvY2Vzc2VkLCBCYXNrZXRBY3Rpb25UeXBlLkFERF9SRUNJUEUsIHJlY2lwZUlkKTtcbiAgfVxuXG4gIHJlY2lwZUlzQmVpbmdSZW1vdmVkKHJlY2lwZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0Q29udGFpbnNSZWNpcGVJZCh0aGlzLmFjdGlvbnNCZWluZ1Byb2Nlc3NlZCwgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUkVDSVBFLCByZWNpcGVJZCk7XG4gIH1cblxuICByZWNpcGVJc0JlaW5nVXBkYXRlZChyZWNpcGVJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zUmVjaXBlSWQodGhpcy5hY3Rpb25zQmVpbmdQcm9jZXNzZWQsIEJhc2tldEFjdGlvblR5cGUuVVBEQVRFX1JFQ0lQRSwgcmVjaXBlSWQpO1xuICB9XG5cbiAgaW5ncmVkaWVudFdpbGxCZUFkZGVkKGluZ3JlZGllbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zSW5ncmVkaWVudElkKHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLCBCYXNrZXRBY3Rpb25UeXBlLkFERF9QUk9EVUNULCBpbmdyZWRpZW50SWQpO1xuICB9XG5cbiAgaW5ncmVkaWVudElzQmVpbmdSZW1vdmVkKGluZ3JlZGllbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zSW5ncmVkaWVudElkKHRoaXMuYWN0aW9uc0JlaW5nUHJvY2Vzc2VkLCBCYXNrZXRBY3Rpb25UeXBlLlJFTU9WRV9QUk9EVUNULCBpbmdyZWRpZW50SWQpO1xuICB9XG5cbiAgaW5ncmVkaWVudFdpbGxCZVJlbW92ZWQoaW5ncmVkaWVudElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0Q29udGFpbnNJbmdyZWRpZW50SWQodGhpcy5iYXNrZXRBY3Rpb25zUXVldWUsIEJhc2tldEFjdGlvblR5cGUuUkVNT1ZFX1BST0RVQ1QsIGluZ3JlZGllbnRJZCk7XG4gIH1cblxuICBlbnRyeVdpbGxCZVJlbW92ZWQoZW50cnlJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zRW50cnlJZCh0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZSwgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVCwgZW50cnlJZCk7XG4gIH1cblxuICBlbnRyaWVzV2lsbEJlUmVtb3ZlZEZyb21SZWNpcGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zQWN0aW9uVHlwZSh0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZSwgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVF9GUk9NX1JFQ0lQRSk7XG4gIH1cblxuICBlbnRyeUlzQmVpbmdSZW1vdmVkKGVudHJ5SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3RDb250YWluc0VudHJ5SWQodGhpcy5hY3Rpb25zQmVpbmdQcm9jZXNzZWQsIEJhc2tldEFjdGlvblR5cGUuUkVNT1ZFX1BST0RVQ1QsIGVudHJ5SWQpO1xuICB9XG5cbiAgZW50cmllc0FyZUJlaW5nUmVtb3ZlZEZyb21SZWNpcGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zQWN0aW9uVHlwZSh0aGlzLmFjdGlvbnNCZWluZ1Byb2Nlc3NlZCwgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVF9GUk9NX1JFQ0lQRSk7XG4gIH1cblxuICBlbnRyeVdpbGxCZVVwZGF0ZWQoZW50cnlJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zRW50cnlJZCh0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZSwgQmFza2V0QWN0aW9uVHlwZS5VUERBVEVfUFJPRFVDVCwgZW50cnlJZCk7XG4gIH1cblxuICBlbnRyeUlzQmVpbmdVcGRhdGVkKGVudHJ5SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3RDb250YWluc0VudHJ5SWQodGhpcy5hY3Rpb25zQmVpbmdQcm9jZXNzZWQsIEJhc2tldEFjdGlvblR5cGUuVVBEQVRFX1BST0RVQ1QsIGVudHJ5SWQpO1xuICB9XG5cbiAgaXRlbVdpbGxCZUFkZGVkKGl0ZW1JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdENvbnRhaW5zSXRlbUlkKHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLCBCYXNrZXRBY3Rpb25UeXBlLkFERF9JVEVNLCBpdGVtSWQpO1xuICB9XG5cbiAgcmVjaXBlc1dpbGxCZUFkZGVkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5waXBlKG1hcChxdWV1ZSA9PiBxdWV1ZS5zb21lKGEgPT4gYS50eXBlID09PSBCYXNrZXRBY3Rpb25UeXBlLkFERF9SRUNJUEUpKSk7XG4gIH1cblxuICByZWNpcGVzV2lsbEJlUmVtb3ZlZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5iYXNrZXRBY3Rpb25zUXVldWUucGlwZShtYXAocXVldWUgPT4gcXVldWUuc29tZShhID0+IGEudHlwZSA9PT0gQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUkVDSVBFKSkpO1xuICB9XG5cbiAgcmVjaXBlc1dpbGxCZVVwZGF0ZWQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnBpcGUobWFwKHF1ZXVlID0+IHF1ZXVlLnNvbWUoYSA9PiBhLnR5cGUgPT09IEJhc2tldEFjdGlvblR5cGUuVVBEQVRFX1JFQ0lQRSkpKTtcbiAgfVxuXG4gIHByb2R1Y3RzV2lsbEJlQWRkZWQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5iYXNrZXRBY3Rpb25zUXVldWUucGlwZShtYXAocXVldWUgPT4gcXVldWUuZmlsdGVyKGEgPT4gYS50eXBlID09PSBCYXNrZXRBY3Rpb25UeXBlLkFERF9QUk9EVUNUKS5sZW5ndGgpKTtcbiAgfVxuXG4gIHByb2R1Y3RzV2lsbEJlVXBkYXRlZCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5waXBlKG1hcChxdWV1ZSA9PiBxdWV1ZS5maWx0ZXIoYSA9PiBhLnR5cGUgPT09IEJhc2tldEFjdGlvblR5cGUuVVBEQVRFX1BST0RVQ1QpLmxlbmd0aCkpO1xuICB9XG5cbiAgcHJvZHVjdHNXaWxsQmVSZW1vdmVkKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnBpcGUobWFwKHF1ZXVlID0+IHF1ZXVlLmZpbHRlcihhID0+IGEudHlwZSA9PT0gQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVCkubGVuZ3RoKSk7XG4gIH1cblxuICBwcm9kdWN0c0FyZUJlaW5nUmVtb3ZlZCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLmFjdGlvbnNCZWluZ1Byb2Nlc3NlZC5waXBlKG1hcChxdWV1ZSA9PiBxdWV1ZS5maWx0ZXIoYSA9PiBhLnR5cGUgPT09IEJhc2tldEFjdGlvblR5cGUuUkVNT1ZFX1BST0RVQ1QpLmxlbmd0aCkpO1xuICB9XG5cbiAgLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVVRJTFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi9cblxuICAvLyBDaGVjayBpZiB0aGUgcmVjaXBlSWQgaXMgaW4gdGhlIEJhc2tldCdzIHJlY2lwZXMtaW5mb3NcbiAgcmVjaXBlSXNJbkJhc2tldChyZWNpcGVJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuYmFza2V0JC5waXBlKFxuICAgICAgc2tpcFdoaWxlKGIgPT4gIWIpLFxuICAgICAgbWFwKGJhc2tldCA9PiBiYXNrZXQuaGFzUmVjaXBlKHJlY2lwZUlkKSlcbiAgICApO1xuICB9XG5cbiAgZ3Vlc3RzRm9yUmVjaXBlKHJlY2lwZUlkOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmJhc2tldCQudmFsdWU/Lmd1ZXN0c0ZvclJlY2lwZShyZWNpcGVJZCk7XG4gIH1cblxuICBwcml2YXRlIHNob3dSZWNpcGVBZGRlZFRvYXN0ZXIoKTogdm9pZCB7XG4gICAgbGV0IHByZXZpb3VzTnVtYmVyT2ZQcm9kdWN0VG9BZGQgPSAwO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5fZW50cmllcyQuc3Vic2NyaWJlKChlbnRyaWVzOiBCYXNrZXRFbnRyeVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvdGFsRW50cmllcyA9XG4gICAgICAgICAgZW50cmllcy5yZWR1Y2UoKHByZXZpb3VzVmFsdWU6IG51bWJlciwgY3VycmVudFZhbHVlOiBCYXNrZXRFbnRyeSkgPT5cbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZS5zdGF0dXMgPT09ICdhY3RpdmUnID8gKHByZXZpb3VzVmFsdWUgKyBjdXJyZW50VmFsdWUucXVhbnRpdHkpIDogcHJldmlvdXNWYWx1ZSwgMCk7XG4gICAgICAgIGlmIChwcmV2aW91c051bWJlck9mUHJvZHVjdFRvQWRkIDwgdG90YWxFbnRyaWVzKSB7XG4gICAgICAgICAgY29uc3QgYXJ0aWNsZSA9IHRvdGFsRW50cmllcyAtIHByZXZpb3VzTnVtYmVyT2ZQcm9kdWN0VG9BZGQgPT09IDEgPyAnYXJ0aWNsZSBham91dMOpJyA6ICdhcnRpY2xlcyBham91dMOpcyc7XG4gICAgICAgICAgY29uc3QgbXNnID0gYCR7dG90YWxFbnRyaWVzIC0gcHJldmlvdXNOdW1iZXJPZlByb2R1Y3RUb0FkZH0gJHthcnRpY2xlfSDDoCB2b3RyZSBwYW5pZXJgO1xuICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uuc2hvdyhNZXNzYWdlVHlwZS5TdWNjZXNzLCBtc2csICcnLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcHJldmlvdXNOdW1iZXJPZlByb2R1Y3RUb0FkZCA9IHRvdGFsRW50cmllcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMT0FEIC8gUkVMT0FEIC8gUkVTRVQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovXG5cbiAgcmVsb2FkQmFza2V0KCk6IE9ic2VydmFibGU8QmFza2V0PiB7XG4gICAgcmV0dXJuIHRoaXMucmVmcmVzaEN1cnJlbnRCYXNrZXQoKS5waXBlKHRha2UoMSkpO1xuICB9XG5cbiAgaW5pdEJhc2tldCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYmFza2V0SW5pdENhbGxlZCkge1xuICAgICAgdGhpcy5iYXNrZXRJbml0Q2FsbGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMubG9hZEJhc2tldCgpLnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5sb2FkUHJldmlldygpLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHJlZnJlc2hDdXJyZW50QmFza2V0KCk6IE9ic2VydmFibGU8QmFza2V0PiB7XG4gICAgdGhpcy5jdXJyZW50QW5kUHJldmlld0ZldGNoaW5nLm5leHQodHJ1ZSk7XG4gICAgcmV0dXJuIHRoaXMucG9zU2VydmljZS53YWl0Rm9yUG9zLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgc3dpdGNoTWFwKHBvcyA9PiB7XG4gICAgICAgIG1lYWx6RGVidWcoJ1tNZWFsel0gcmVmcmVzaGluZyBiYXNrZXQnKTtcblxuICAgICAgICBjb25zdCBhdXRobGVzc0lkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ19taWFtL2F1dGhsZXNzSWQnKTtcbiAgICAgICAgY29uc3QgdXNlcklkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ19taWFtL3VzZXJJZCcpO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2tldE9ic2VydmFibGUgPSAoYXV0aGxlc3NJZCAmJiB1c2VySWQpXG4gICAgICAgICAgPyB0aGlzLnRyYW5zZmVyQXV0aGxlc3NCYXNrZXQocG9zLmlkLCBhdXRobGVzc0lkKVxuICAgICAgICAgIDogdGhpcy5mZXRjaEN1cnJlbnRCYXNrZXQocG9zLmlkKTtcblxuICAgICAgICBpZiAoYXV0aGxlc3NJZCAmJiB1c2VySWQpIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnX21pYW0vYXV0aGxlc3NJZCcpO1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdfbWlhbS9hdXRobGVzcy1mb3JiaWQtcHJvZmlsaW5nJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmN1cnJlbnRTdWJzY3JpcHRpb24gPSBiYXNrZXRPYnNlcnZhYmxlLnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmNoZWNrSWZJc0FmZmlsaWF0ZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2tldCQ7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSWZJc0FmZmlsaWF0ZWQoKTogdm9pZCB7XG4gICAgY29uc3QgZ2V0QWZmaWxpYXRlZFVybCA9IGAke2UubWlhbUFQSX0vYXBpL3YxL2Jhc2tldHMvYWZmaWxpYXRlZGA7XG4gICAgdGhpcy5odHRwLmdldDx7IGFmZmlsaWF0ZWQ6IHN0cmluZyB8IG51bGwgfT4oZ2V0QWZmaWxpYXRlZFVybCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoXG4gICAgICByZXNwb25zZSA9PiB7XG4gICAgICAgIGNvbnN0IGFmZmlsaWF0ZWQgPSByZXNwb25zZT8uYWZmaWxpYXRlZDtcbiAgICAgICAgaWYgKGFmZmlsaWF0ZWQpIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnX21pYW0vYWZmaWxpYXRlZCcsIGFmZmlsaWF0ZWQpO1xuICAgICAgICAgIHNldEFmZmlsaWF0ZShhZmZpbGlhdGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnX21pYW0vYWZmaWxpYXRlZCcpO1xuICAgICAgICAgIHNldEFmZmlsaWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZmVyQXV0aGxlc3NCYXNrZXQocG9zSWQ6IHN0cmluZywgYXV0aGxlc3NJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0ZXNTZXJ2aWNlLmNhbGxBdXRobGVzc1RyYW5zZmVyLm5leHQoKTtcbiAgICBjb25zdCB0cmFuc2ZlckF1dGhsZXNzQmFza2V0VXJsID1cbiAgICAgIGAke2UubWlhbUFQSX0vYXBpL3YxL2Jhc2tldHMvdHJhbnNmZXJfYXV0aGxlc3M/cG9pbnRfb2Zfc2FsZV9pZD0ke3Bvc0lkfSZhdXRobGVzc191c2VyX2lkPSR7YXV0aGxlc3NJZH1gO1xuICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2godHJhbnNmZXJBdXRobGVzc0Jhc2tldFVybCwge30pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHJlc3BvbnNlOiBEb2N1bWVudFJlc291cmNlPEJhc2tldD4pID0+IHtcbiAgICAgICAgY29uc3QgY29uZmlybWVkQmFza2V0OiBCYXNrZXQgPSB0aGlzLm5ldygpO1xuICAgICAgICBjb25maXJtZWRCYXNrZXQuZmlsbChyZXNwb25zZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUxvY2FsQmFza2V0KGNvbmZpcm1lZEJhc2tldCk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT5cbiAgICAgICAgLy8gSWYgYXV0aGxlc3MgdHJhbnNmZXIgcmV0dXJuZWQgYW4gZXJyb3IsIHRoZXJlIG1pZ2h0IGJlIHNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSBiYXNrZXRJZCBpbiBsb2NhbFN0b3JhZ2UsIHRodXMgd2UgZmV0Y2hDdXJyZW50XG4gICAgICAgIHRoaXMuZmV0Y2hDdXJyZW50QmFza2V0KHBvc0lkKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoQ3VycmVudEJhc2tldChwb3NJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgZ2V0VXJsID0gYGN1cnJlbnQ/cG9pbnRfb2Zfc2FsZV9pZD0ke3Bvc0lkfSZmaWVsZHNbYmFza2V0c109JHtCQVNLRVRfU1BBUlNFX0ZJRUxEUy5iYXNrZXRzLmpvaW4oJywnKX1gO1xuICAgIHJldHVybiB0aGlzLmdldChnZXRVcmwpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoYmFza2V0ID0+IHRoaXMudXBkYXRlTG9jYWxCYXNrZXQoYmFza2V0KSksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5wb3NTZXJ2aWNlLmVtaXRCYXNrZXRMb2FkZWRGb3JOZXdQb3MoKSlcbiAgICApO1xuICB9XG5cbiAgcmVzZXRCYXNrZXQoZXZlbnRUcmFjZTogRXZlbnRUcmFjZSA9IHsgb3JpZ2luUGF0aDogJycsIHByb3BzOiB7fSB9KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgbWVhbHpEZWJ1ZygnW01lYWx6XSByZXNldHRpbmcgYmFza2V0Jyk7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ19taWFtL2FmZmlsaWF0ZScpO1xuICAgIHNldEFmZmlsaWF0ZShudWxsKTtcbiAgICB0aGlzLmlnbm9yZWRCYXNrZXRzU2VydmljZS5yZXNldElnbm9yZWRJbmdyZWRpZW50cygpO1xuICAgIHJldHVybiB0aGlzLnBvc1NlcnZpY2Uud2FpdEZvclBvcy5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIHN3aXRjaE1hcChwb3MgPT4gdGhpcy53YWl0Rm9yQmFza2V0LnBpcGUoXG4gICAgICAgIHRhcChiYXNrZXQgPT4gdGhpcy5hbmFseXRpY3NTZXJ2aWNlLnNlbmRFdmVudHNPZlJlc2V0QmFza2V0KGJhc2tldCwgZXZlbnRUcmFjZSkpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5nZXQoYHJlc2V0P3BvaW50X29mX3NhbGVfaWQ9JHtwb3MuaWR9JmZpZWxkc1tiYXNrZXRzXT0ke0JBU0tFVF9TUEFSU0VfRklFTERTLmJhc2tldHMuam9pbignLCcpfWApLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKGJhc2tldCA9PiB0aGlzLnVwZGF0ZUxvY2FsQmFza2V0KGJhc2tldCkpXG4gICAgICAgICkpXG4gICAgICApKVxuICAgICk7XG4gIH1cblxuICAvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTkZJUk0gQkFTS0VUICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi9cblxuICAvKipcbiAgICogU2VuZHMgcGF5bWVudC5jb25maXJtIGV2ZW50IHRoZW4gY29uZmlybSBiYXNrZXQgaWYgcmV0YWlsZXIncyBjYXJ0IHByaWNlIGFuZCBNZWFseiBiYXNrZXQgcHJpY2UgYXJlIGJvdGggbm9uLXplcm9cbiAgICogQHBhcmFtIHRvdGFsUHJpY2UgVGhlIHByaWNlIG9mIHJldGFpbGVyJ3MgYmFza2V0XG4gICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IGJhc2tldFxuICAgKi9cbiAgY29uZmlybVBheW1lbnRBbmRCYXNrZXQodG90YWxQcmljZTogbnVtYmVyIHwgc3RyaW5nKTogT2JzZXJ2YWJsZTxCYXNrZXQ+IHtcbiAgICB0aGlzLmNvbmZpcm1pbmcubmV4dCh0cnVlKTtcbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQmFza2V0LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoYmFza2V0ID0+IHtcbiAgICAgICAgaWYgKCt0b3RhbFByaWNlID4gMCAmJiBiYXNrZXQudG90YWxQcmljZSA+IDApIHtcbiAgICAgICAgICB0aGlzLmFuYWx5dGljc1NlcnZpY2Uuc2VuZEV2ZW50KFxuICAgICAgICAgICAgJ3BheW1lbnQuY29uZmlybWVkJyxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBiYXNrZXRfaWQ6IGJhc2tldC5pZCxcbiAgICAgICAgICAgICAgbWlhbV9hbW91bnQ6IGJhc2tldC50b3RhbFByaWNlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIHRvdGFsX2Ftb3VudDogdG90YWxQcmljZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICBwb3NfaWQ6IHRoaXMucG9zU2VydmljZS5wb3MkLmdldFZhbHVlKCkuaWQsXG4gICAgICAgICAgICAgIHBvc19uYW1lOiB0aGlzLnBvc1NlcnZpY2UucG9zJC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZXMubmFtZSxcbiAgICAgICAgICAgICAgc3VwcGxpZXJfaWQ6IHRoaXMucG9zU2VydmljZS5wb3MkLmdldFZhbHVlKCkucmVsYXRpb25zaGlwcy5zdXBwbGllci5kYXRhLmlkLFxuICAgICAgICAgICAgICByZWNpcGVfY291bnQ6IGJhc2tldC5yZWNpcGVJbmZvcy5sZW5ndGgudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgbWlhbV9wcm9kdWN0czogYmFza2V0LmVudHJpZXMubGVuZ3RoLnRvU3RyaW5nKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpcm1CYXNrZXQoYmFza2V0LCB0b3RhbFByaWNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYmFza2V0JDtcbiAgICAgIH0pLFxuICAgICAgdGFwKCgpID0+IHRoaXMuY29uZmlybWluZy5uZXh0KGZhbHNlKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIGNvbmZpcm0gYmFza2V0LiBTZW5kcyBhbmFseXRpYyBldmVudCBhbmQgcmVmcmVzaCBjdXJyZW50IGJhc2tldCBvbiBzdWNjZXNzZnVsbCBjb25maXJtYXRpb25cbiAgICovXG4gIHByaXZhdGUgY29uZmlybUJhc2tldChiYXNrZXQ6IEJhc2tldCwgdG90YWxQcmljZTogbnVtYmVyIHwgc3RyaW5nKTogT2JzZXJ2YWJsZTxCYXNrZXQ+IHtcbiAgICBtZWFsekRlYnVnKCdbTWVhbHpdIENvbmZpcm0gTWVhbHogYmFza2V0Jyk7XG4gICAgcmV0dXJuIHRoaXMucG9zU2VydmljZS53YWl0Rm9yUG9zLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgc3dpdGNoTWFwKHBvcyA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGNoVXJsID0gYCR7ZS5taWFtQVBJfS9hcGkvdjEvYmFza2V0cy9jb25maXJtP3BvaW50X29mX3NhbGVfaWQ9JHtwb3MuaWR9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaChwYXRjaFVybCwge30pO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSxcbiAgICAgIHN3aXRjaE1hcChyZXN1bHQgPT4ge1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiBvZihudWxsIGFzIEJhc2tldCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLnNlbmRFdmVudChcbiAgICAgICAgICAnYmFza2V0LmNvbmZpcm1lZCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmFza2V0X2lkOiBiYXNrZXQuaWQsXG4gICAgICAgICAgICBtaWFtX2Ftb3VudDogYmFza2V0LnRvdGFsUHJpY2UudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRvdGFsX2Ftb3VudDogdG90YWxQcmljZS50b1N0cmluZygpLFxuICAgICAgICAgICAgcG9zX2lkOiB0aGlzLnBvc1NlcnZpY2UucG9zJC5nZXRWYWx1ZSgpLmlkLFxuICAgICAgICAgICAgcG9zX25hbWU6IHRoaXMucG9zU2VydmljZS5wb3MkLmdldFZhbHVlKCkuYXR0cmlidXRlcy5uYW1lLFxuICAgICAgICAgICAgc3VwcGxpZXJfaWQ6IHRoaXMucG9zU2VydmljZS5wb3MkLmdldFZhbHVlKCkucmVsYXRpb25zaGlwcy5zdXBwbGllci5kYXRhLmlkLFxuICAgICAgICAgICAgcmVjaXBlX2NvdW50OiBiYXNrZXQucmVjaXBlSW5mb3MubGVuZ3RoLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBtaWFtX3Byb2R1Y3RzOiBiYXNrZXQuZW50cmllcy5sZW5ndGgudG9TdHJpbmcoKVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaEN1cnJlbnRCYXNrZXQoKTtcbiAgICAgIH0pLFxuICAgICAgdGFrZSgxKVxuICAgICk7XG4gIH1cblxuICAvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBQ1RJT05TIE9OIEVOVFJJRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi9cblxuICBiYXNrZXRFbnRyaWVzKCk6IE9ic2VydmFibGU8QmFza2V0RW50cnlbXT4ge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzJDtcbiAgfVxuXG4gIGFjdGl2ZUJhc2tldEVudHJpZXMoKTogT2JzZXJ2YWJsZTxCYXNrZXRFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuYmFza2V0RW50cmllcygpLnBpcGUoXG4gICAgICBtYXAoKGVudHJpZXM6IEJhc2tldEVudHJ5W10pID0+IGVudHJpZXMuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LnN0YXR1cyA9PT0gJ2FjdGl2ZScpKVxuICAgICk7XG4gIH1cblxuICAvLyBEZWNyZWFzZSBxdWFudGl0eSBvbiBhIGxpc3Qgb2YgYmFza2V0IGVudHJpZXNcbiAgLy8gSWYgdGhlIHF1YW50aXR5IGdvZXMgYmVsb3cgMSwgdGhlIGNvcnJlc3BvbmRpbmcgZ3JvY2VyaWVzIGVudHJ5J3Mgc3RhdHVzIGdldHMgZGVsZXRlZFxuICAvLyBSZWxvYWQgYmFza2V0IGFmdGVyIGFsbCBvYmplY3RzIGFyZSBzYXZlZFxuICByZW1vdmVCYXNrZXRFbnRyaWVzKGVudHJpZXNUb1JlbW92ZTogQ29tcGFyYWJsZVByb2R1Y3RbXSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKCF0aGlzLl9lbnRyaWVzJC52YWx1ZSkge1xuICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IHNhdmVPYnNlcnZhYmxlczogT2JzZXJ2YWJsZTxhbnk+W10gPSBlbnRyaWVzVG9SZW1vdmUubWFwKGVudHJ5VG9SZW1vdmUgPT4gdGhpcy5yZW1vdmVCYXNrZXRFbnRyeShlbnRyeVRvUmVtb3ZlKSk7XG4gICAgcmV0dXJuIGZvcmtKb2luKHNhdmVPYnNlcnZhYmxlcykucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnJlZnJlc2hDdXJyZW50QmFza2V0KCkpLFxuICAgICAgdGFrZSgxKVxuICAgICk7XG4gIH1cblxuICByZW1vdmVCYXNrZXRFbnRyeShlbnRyeVRvUmVtb3ZlOiBDb21wYXJhYmxlUHJvZHVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgYmFza2V0RW50cnkgPSB0aGlzLl9lbnRyaWVzJC52YWx1ZS5maW5kKGJlID0+IGJlLmlkID09PSBlbnRyeVRvUmVtb3ZlLmlkKTtcbiAgICBpZiAoIWJhc2tldEVudHJ5IHx8ICFlbnRyeVRvUmVtb3ZlLnF1YW50aXR5KSB7XG4gICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3UXVhbnRpdHkgPSBiYXNrZXRFbnRyeS5xdWFudGl0eSAtIGVudHJ5VG9SZW1vdmUucXVhbnRpdHk7XG4gICAgaWYgKG5ld1F1YW50aXR5ID49IDEpIHtcbiAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5zZW5kUHJvZHVjdHNDaGFuZ2VRdWFudGl0eUV2ZW50cyhbe1xuICAgICAgICB0eXBlOiBCYXNrZXRBY3Rpb25UeXBlLlVQREFURV9QUk9EVUNULCBwYXJhbXM6IHtcbiAgICAgICAgICByZWNpcGVJZDogJycsIGV2ZW50VHJhY2U6IHsgb3JpZ2luUGF0aDogJycsIHByb3BzOiB7fSB9LCBiYXNrZXRFbnRyeSwgbmV3UXVhbnRpdHlcbiAgICAgICAgfVxuICAgICAgfV0pO1xuICAgICAgYmFza2V0RW50cnkucXVhbnRpdHkgPSBuZXdRdWFudGl0eTtcbiAgICAgIHJldHVybiBiYXNrZXRFbnRyeS5zYXZlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhc2tldEVudHJ5LnF1YW50aXR5ID0gMTtcbiAgICAgIGJhc2tldEVudHJ5LnN0YXR1cyA9ICdkZWxldGVkJztcbiAgICAgIC8vIENyZWF0ZSBhIGZha2UgYmFza2V0QWN0aW9uICh3ZSBjYW4ndCB1c2UgdGhpcy5yZW1vdmVJdGVtc0ZvckluZ3JlZGllbnRzIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgaW5ncmVkaWVudElkKVxuICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLnNlbmRSZW1vdmVQcm9kdWN0c0V2ZW50cyhbe1xuICAgICAgICB0eXBlOiBCYXNrZXRBY3Rpb25UeXBlLlJFTU9WRV9QUk9EVUNULCBwYXJhbXM6IHsgcmVjaXBlSWQ6ICcnLCBldmVudFRyYWNlOiB7IG9yaWdpblBhdGg6ICcnLCBwcm9wczoge30gfSwgYmFza2V0RW50cnkgfVxuICAgICAgfV0pO1xuICAgICAgcmV0dXJuIGJhc2tldEVudHJ5LnNhdmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgQmFza2V0RW50cnkgZm9yIGFuIGluZ3JlZGllbnQgaWYgaXQgZXhpc3RzXG4gICAqIFJldHVybnMgYSBmYWtlIEJhc2tldEVudHJ5IHdpdGggaWQgPSAtMSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAqL1xuICBiYXNrZXRFbnRyeUZyb21JbmdyZWRpZW50KGluZ3JlZGllbnRJZDogc3RyaW5nLCBndWVzdHM6IG51bWJlciwgb25seVF1YW50aXR5ID0gZmFsc2UsIHNlbGVjdGVkSXRlbUlkPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxCYXNrZXRFbnRyeT4ge1xuICAgIHJldHVybiB0aGlzLndhaXRGb3JCYXNrZXQucGlwZShcbiAgICAgIHN3aXRjaE1hcChiYXNrZXQgPT4ge1xuICAgICAgICBsZXQgZ2V0VXJsID1cbiAgICAgICAgICBgJHtlLm1pYW1BUEl9L2FwaS92MS9iYXNrZXRzLyR7YmFza2V0LmlkfS9iYXNrZXQtZW50cmllcy9mcm9tLWluZ3JlZGllbnQ/aW5ncmVkaWVudF9pZD0ke2luZ3JlZGllbnRJZH0mZ3Vlc3RzPSR7Z3Vlc3RzfWA7XG4gICAgICAgIGlmIChzZWxlY3RlZEl0ZW1JZCkge1xuICAgICAgICAgIGdldFVybCArPSBgJnNlbGVjdGVkX2l0ZW1faWQ9JHtzZWxlY3RlZEl0ZW1JZH1gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbmx5UXVhbnRpdHkpIHtcbiAgICAgICAgICBnZXRVcmwgKz0gJyZmaWVsZHNbYmFza2V0LWVudHJpZXNdPXF1YW50aXR5LHF1YW50aXR5LXRvLWFkZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2V0VXJsICs9ICcmaW5jbHVkZT1zZWxlY3RlZC1pdGVtJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldChnZXRVcmwpIGFzIE9ic2VydmFibGU8RG9jdW1lbnRSZXNvdXJjZTxCYXNrZXRFbnRyeT4+O1xuICAgICAgfSksXG4gICAgICBza2lwV2hpbGUocmVzdWx0ID0+ICFyZXN1bHQpLFxuICAgICAgbWFwKHJlcyA9PiB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5iYXNrZXRFbnRyaWVzU2VydmljZS5uZXcoKTtcbiAgICAgICAgZW50cnkuZmlsbChyZXMpO1xuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUREIEZST00gUElDVFVSRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi9cblxuICAvKipcbiAgICogQWRkIGVudHJpZXMgdG8gYmFza2V0IGZyb20gYSBwaWN0dXJlIG9yIGZpbGVcbiAgICogQHBhcmFtIGZpbGUgYW4gaW1hZ2Ugb3IgUERGIG9mIGEgZ3JvY2VyaWVzIGxpc3RcbiAgICogQHBhcmFtIGluY2x1ZGVcbiAgICogQHBhcmFtIGlzU2Nob29sTGlzdCBpZiB0cnVlLCBpbmRpY2F0ZXMgdG8gdGhlIGFwaSB0aGF0IHRoZSBmaWxlIGlzIGEgc2Nob29sIHNob3BwaW5nIGxpc3RcbiAgICovXG4gIGFkZEVudHJpZXNGcm9tUGljdHVyZShmaWxlOiBGaWxlLCBpbmNsdWRlID0gW10sIGlzU2Nob29sTGlzdCA9IGZhbHNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMud2FpdEZvckJhc2tldC5waXBlKFxuICAgICAgc3dpdGNoTWFwKGJhc2tldCA9PiB0aGlzLnBvc1NlcnZpY2Uud2FpdEZvclBvcy5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBtYXAocG9zID0+IFtiYXNrZXQsIHBvc10pXG4gICAgICApKSxcbiAgICAgIHN3aXRjaE1hcCgoW2Jhc2tldCwgcG9zXSkgPT4ge1xuICAgICAgICBsZXQgcGF0Y2hVcmw6IHN0cmluZztcbiAgICAgICAgaWYgKGlzU2Nob29sTGlzdCkge1xuICAgICAgICAgIHBhdGNoVXJsID0gYCR7ZS5taWFtQVBJfS9hcGkvdjEvYmFza2V0cy9zY2hvb2wtbGlzdD9maWVsZHNbYmFza2V0c109JHtCQVNLRVRfU1BBUlNFX0ZJRUxEUy5iYXNrZXRzLmpvaW4oJywnKX1gICtcbiAgICAgICAgICAgIGAmcG9pbnRfb2Zfc2FsZV9pZD0ke3Bvcy5pZH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGNoVXJsID0gYCR7ZS5taWFtQVBJfS9hcGkvdjEvYmFza2V0cy8ke2Jhc2tldC5pZH0vYWRkLWVudHJpZXMtZnJvbS1waWN0dXJlYCArXG4gICAgICAgICAgICBgP2ZpZWxkc1tiYXNrZXRzXT0ke0JBU0tFVF9TUEFSU0VfRklFTERTLmJhc2tldHMuam9pbignLCcpfWA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgncGljdHVyZScsIGZpbGUpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2luY2x1ZGUnLCBpbmNsdWRlLmpvaW4oJywnKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2gocGF0Y2hVcmwsIGZvcm1EYXRhKS5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgocmVzcG9uc2U6IERvY3VtZW50UmVzb3VyY2U8QmFza2V0PikgPT4gdGhpcy5maWxsQmFza2V0KHJlc3BvbnNlKSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFERCBBQ1RJT05TIFRPIFRIRSBRVUVVRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqL1xuXG4gIC8qKlxuICAgKiBBZGRzIHJlY2lwZXMgdG8gdGhlIGJhc2tldCBhY3Rpb24gdG8gcXVldWUuXG4gICAqXG4gICAqIEBwYXJhbSByZWNpcGVJZHMgLSBUaGUgYXJyYXkgb2YgcmVjaXBlIElEcyB0byBhZGQuXG4gICAqIEBwYXJhbSBndWVzdHMgLSBUaGUgbnVtYmVyIG9mIGd1ZXN0cy5cbiAgICogQHBhcmFtIGV2ZW50VHJhY2UgLSBUaGUgZXZlbnQgdHJhY2UuXG4gICAqIEBwYXJhbSB3aXRoSW5ncmVkaWVudHMgLSBXaGV0aGVyIHRvIGluY2x1ZGUgaW5ncmVkaWVudHMuIERlZmF1bHQgaXMgdHJ1ZS5cbiAgICogQHJldHVybiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhbnl0aGluZy5cbiAgICovXG4gIGFkZFJlY2lwZXNUb0Jhc2tldChyZWNpcGVJZHM6IHN0cmluZ1tdLCBndWVzdHM6IG51bWJlciwgZXZlbnRUcmFjZTogRXZlbnRUcmFjZSwgd2l0aEluZ3JlZGllbnRzID0gdHJ1ZSk6IHZvaWQge1xuICAgIGNvbnN0IHRvQWRkID0gdGhpcy5iYXNrZXRBY3Rpb25zUXVldWUudmFsdWU7XG4gICAgcmVjaXBlSWRzLmZvckVhY2gocmVjaXBlSWQgPT5cbiAgICAgIHRvQWRkLnB1c2goe1xuICAgICAgICB0eXBlOiB3aXRoSW5ncmVkaWVudHMgPyBCYXNrZXRBY3Rpb25UeXBlLkFERF9SRUNJUEUgOiBCYXNrZXRBY3Rpb25UeXBlLkFERF9SRUNJUEVfTElHSFQsXG4gICAgICAgIHBhcmFtczogeyByZWNpcGVJZCwgZXZlbnRUcmFjZSwgZ3Vlc3RzIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5uZXh0KHRvQWRkKTtcbiAgfVxuXG4gIHJlbW92ZVJlY2lwZXNGcm9tQmFza2V0KHJlY2lwZUlkczogc3RyaW5nW10sIGV2ZW50VHJhY2U6IEV2ZW50VHJhY2UsIGxpZ2h0TW9kZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgdG9SZW1vdmUgPSB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS52YWx1ZTtcbiAgICByZWNpcGVJZHMuZm9yRWFjaChyZWNpcGVJZCA9PlxuICAgICAgdG9SZW1vdmUucHVzaCh7XG4gICAgICAgIHR5cGU6IGxpZ2h0TW9kZSA/IEJhc2tldEFjdGlvblR5cGUuUkVNT1ZFX1JFQ0lQRV9MSUdIVCA6IEJhc2tldEFjdGlvblR5cGUuUkVNT1ZFX1JFQ0lQRSxcbiAgICAgICAgcGFyYW1zOiB7IHJlY2lwZUlkLCBldmVudFRyYWNlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5uZXh0KHRvUmVtb3ZlKTtcbiAgfVxuXG4gIHVwZGF0ZVJlY2lwZXNJbkJhc2tldChyZWNpcGVJZHM6IHN0cmluZ1tdLCBndWVzdHM6IG51bWJlciwgZXZlbnRUcmFjZTogRXZlbnRUcmFjZSwgbGlnaHRNb2RlID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCB0b1VwZGF0ZSA9IHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnZhbHVlO1xuICAgIHJlY2lwZUlkcy5mb3JFYWNoKHJlY2lwZUlkID0+XG4gICAgICB0aGlzLnJlY2lwZUlzSW5CYXNrZXQocmVjaXBlSWQpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGluQmFza2V0ID0+IHtcbiAgICAgICAgaWYgKGluQmFza2V0KSB7XG4gICAgICAgICAgdG9VcGRhdGUucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBsaWdodE1vZGUgPyBCYXNrZXRBY3Rpb25UeXBlLlVQREFURV9SRUNJUEVfTElHSFQgOiBCYXNrZXRBY3Rpb25UeXBlLlVQREFURV9SRUNJUEUsXG4gICAgICAgICAgICBwYXJhbXM6IHsgcmVjaXBlSWQsIGV2ZW50VHJhY2UsIGd1ZXN0cyB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5uZXh0KHRvVXBkYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJvdGggaW4gdGhlIGNhcyBvZiBhZGRpbmcgYW4gaW5ncmVkaWVudCB0byBiYXNrZXQgYW5kIGluIHRoZSBjYXNlIG9mIHJlcGxhY2luZyB0aGUgaXRlbSBvZiBhbiBpbmdyZWRpZW50XG4gICAqIEJlY2F1c2UgdGhlIHNhbWUgcmVxdWVzdCBpcyBjYWxsZWQgYXQgdGhlIGVuZFxuICAgKiBAcGFyYW0gcmVjaXBlSWQgSWQgb2YgdGhlIHJlY2lwZSBpbiB3aGljaCB0aGUgaW5ncmVkaWVudCBpc1xuICAgKiBAcGFyYW0gaW5ncmVkaWVudElkc0FuZEVudHJpZXMgcGFpcnMgb2YgaW5ncmVkaWVudElkICsgYmFza2V0RW50cnkgdG8gYWRkIHRvIGJhc2tldFxuICAgKiBAcGFyYW0gZXZlbnRUcmFjZSBldmVudFRyYWNlXG4gICAqIEBwYXJhbSBwcmV2aW91c0l0ZW0gKG9wdGlvbmFsKSBwcmV2aW91c0l0ZW0gaW4gY2FzZSBvZiBhbiBpdGVtIHJlcGxhY2VtZW50IChmb3IgYW5hbHl0aWNzIHB1cnBvc2VzKVxuICAgKiBAcGFyYW0gc2VhcmNoU3RyaW5nIChvcHRpb25hbCkgc2VhcmNoX3Rlcm0gaW4gY2FzZSBvZiBhbiBpdGVtIHJlcGxhY2VtZW50IHdoZW4gYSBzZWFyY2ggaGFzIGJlZW4gdXNlZCAoZm9yIGFuYWx5dGljcyBwdXJwb3NlcylcbiAgICovXG4gIGFkZEluZ3JlZGllbnRzVG9CYXNrZXQocmVjaXBlSWQ6IHN0cmluZywgaW5ncmVkaWVudElkc0FuZEVudHJpZXM6IHsgaW5ncmVkaWVudElkOiBzdHJpbmc7IGVudHJ5OiBCYXNrZXRFbnRyeSB9W10sXG4gICAgZXZlbnRUcmFjZTogRXZlbnRUcmFjZSwgcHJldmlvdXNJdGVtPzogSXRlbSwgc2VhcmNoU3RyaW5nPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdG9BZGQgPSB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS52YWx1ZTtcbiAgICBpbmdyZWRpZW50SWRzQW5kRW50cmllcy5mb3JFYWNoKGluZ3JlZGllbnRJZEFuZEVudHJ5ID0+XG4gICAgICB0b0FkZC5wdXNoKHtcbiAgICAgICAgdHlwZTogQmFza2V0QWN0aW9uVHlwZS5BRERfUFJPRFVDVCxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgcmVjaXBlSWQsIGluZ3JlZGllbnRJZDogaW5ncmVkaWVudElkQW5kRW50cnkuaW5ncmVkaWVudElkLCBiYXNrZXRFbnRyeTogaW5ncmVkaWVudElkQW5kRW50cnkuZW50cnksIGV2ZW50VHJhY2UsIHByZXZpb3VzSXRlbSxcbiAgICAgICAgICBzZWFyY2hTdHJpbmdcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLm5leHQodG9BZGQpO1xuICB9XG5cbiAgYWRkSXRlbVRvQmFza2V0KGl0ZW06IEl0ZW0sIGV2ZW50VHJhY2U6IEV2ZW50VHJhY2UpOiB2b2lkIHtcbiAgICBjb25zdCB0b0FkZCA9IHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnZhbHVlO1xuICAgIHRvQWRkLnB1c2goe1xuICAgICAgdHlwZTogQmFza2V0QWN0aW9uVHlwZS5BRERfSVRFTSxcbiAgICAgIHBhcmFtczogeyBpdGVtLCBldmVudFRyYWNlIH1cbiAgICB9KTtcbiAgICB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5uZXh0KHRvQWRkKTtcbiAgfVxuXG4gIHJlbW92ZVByb2R1Y3RGcm9tUmVjaXBlKHByb2R1Y3RzOiB7IGluZ3JlZGllbnQ6IEluZ3JlZGllbnQ7IGJhc2tldEVudHJ5OiBCYXNrZXRFbnRyeSB9W10sIGV2ZW50VHJhY2U6IEV2ZW50VHJhY2UpOiB2b2lkIHtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnZhbHVlO1xuICAgIHByb2R1Y3RzLmZvckVhY2gocHJvZHVjdCA9PlxuICAgICAgdG9SZW1vdmUucHVzaCh7XG4gICAgICAgIHR5cGU6IEJhc2tldEFjdGlvblR5cGUuUkVNT1ZFX1BST0RVQ1RfRlJPTV9SRUNJUEUsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGJhc2tldEVudHJ5OiBwcm9kdWN0LmJhc2tldEVudHJ5LFxuICAgICAgICAgIGluZ3JlZGllbnRJZDogcHJvZHVjdC5pbmdyZWRpZW50LmlkLFxuICAgICAgICAgIGZvcmNlZFF1YW50aXR5OiBwcm9kdWN0LmJhc2tldEVudHJ5LnF1YW50aXR5ICsgcHJvZHVjdC5iYXNrZXRFbnRyeS5xdWFudGl0eVRvQWRkLFxuICAgICAgICAgIGV2ZW50VHJhY2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLm5leHQodG9SZW1vdmUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlbW92ZUluZ3JlZGllbnRzRnJvbUJhc2tldChiYXNrZXRFbnRyeTogQmFza2V0RW50cnksIHJlY2lwZUlkOiBzdHJpbmcsIGluZ3JlZGllbnRJZHM6IHN0cmluZ1tdLCBldmVudFRyYWNlOiBFdmVudFRyYWNlKTogdm9pZCB7XG4gICAgY29uc3QgdG9SZW1vdmUgPSB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS52YWx1ZTtcbiAgICBpbmdyZWRpZW50SWRzLmZvckVhY2goaW5ncmVkaWVudElkID0+XG4gICAgICB0b1JlbW92ZS5wdXNoKHtcbiAgICAgICAgdHlwZTogQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVCxcbiAgICAgICAgcGFyYW1zOiB7IGJhc2tldEVudHJ5LCByZWNpcGVJZCwgaW5ncmVkaWVudElkLCBldmVudFRyYWNlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5uZXh0KHRvUmVtb3ZlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICByZW1vdmVQcm9kdWN0KGJhc2tldEVudHJ5OiBCYXNrZXRFbnRyeSwgZXZlbnRUcmFjZTogRXZlbnRUcmFjZSwgcmVjaXBlSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnZhbHVlO1xuICAgIHRvUmVtb3ZlLnB1c2goe1xuICAgICAgdHlwZTogQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVCxcbiAgICAgIHBhcmFtczogeyBiYXNrZXRFbnRyeSwgcmVjaXBlSWQsIGV2ZW50VHJhY2UgfVxuICAgIH0pO1xuICAgIHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLm5leHQodG9SZW1vdmUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNoYW5nZVByb2R1Y3RRdWFudGl0eShiYXNrZXRFbnRyeTogQmFza2V0RW50cnksIG5ld1F1YW50aXR5OiBudW1iZXIsIGV2ZW50VHJhY2U6IEV2ZW50VHJhY2UsIHJlY2lwZUlkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgYmFza2V0RW50cnksXG4gICAgICByZWNpcGVJZCxcbiAgICAgIG5ld1F1YW50aXR5LFxuICAgICAgZXZlbnRUcmFjZVxuICAgIH07XG4gICAgY29uc3QgdG9VcGRhdGUgPSB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS52YWx1ZTtcbiAgICB0b1VwZGF0ZS5wdXNoKHtcbiAgICAgIHR5cGU6IEJhc2tldEFjdGlvblR5cGUuVVBEQVRFX1BST0RVQ1QsXG4gICAgICBwYXJhbXNcbiAgICB9KTtcbiAgICB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5uZXh0KHRvVXBkYXRlKTtcbiAgfVxuXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUFJPQ0VTUyBUSEUgQUNUSU9OUyBRVUVVRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovXG5cbiAgcHJpdmF0ZSBlbXB0eUFjdGlvbnNRdWV1ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5iYXNrZXRBY3Rpb25zUXVldWUudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYWN0aW9uc1RvUHJvY2VzcyA9IHRoaXMubmV4dEFjdGlvbnNCYXRjaCgpO1xuICAgICAgdGhpcy5hY3Rpb25zQmVpbmdQcm9jZXNzZWQubmV4dChbLi4uYWN0aW9uc1RvUHJvY2Vzc10pO1xuICAgICAgaWYgKGFjdGlvbnNUb1Byb2Nlc3MubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NBY3Rpb25zQmF0Y2goYWN0aW9uc1RvUHJvY2Vzcykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmFjdGlvbnNCZWluZ1Byb2Nlc3NlZC5uZXh0KFtdKTtcbiAgICAgICAgICB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS5uZXh0KFxuICAgICAgICAgICAgdGhpcy5iYXNrZXRBY3Rpb25zUXVldWUudmFsdWUuZmlsdGVyKGkgPT4gIWFjdGlvbnNUb1Byb2Nlc3MuaW5jbHVkZXMoaSkgJiYgIXRoaXMuYWN0aW9uc0JlaW5nT3ZlcnJpZGRlbi5pbmNsdWRlcyhpKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuYWN0aW9uc0JlaW5nT3ZlcnJpZGRlbiA9IFtdO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgbXVsdGlwbGUgYWN0aW9ucyBvZiB0aGUgc2FtZSB0eXBlIGFyZSBuZXh0IHRvIGVhY2ggb3RoZXIgaW4gdGhlIHF1ZXVlLCB3ZSB3YW50IHRvIHByb2Nlc3MgdGhlbSBhcyBhIGJhdGNoLlxuICAgKiBAcmV0dXJucyB0aGUgbmV4dCBiYXRjaCBvZiBhY3Rpb25zIHRvIHByb2Nlc3NcbiAgICovXG4gIHByaXZhdGUgbmV4dEFjdGlvbnNCYXRjaCgpOiBCYXNrZXRBY3Rpb25bXSB7XG4gICAgY29uc3QgYmF0Y2g6IEJhc2tldEFjdGlvbltdID0gW107XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBjdXJyZW50QWN0aW9uID0gdGhpcy5iYXNrZXRBY3Rpb25zUXVldWUudmFsdWVbaV07XG4gICAgbGV0IHNob3VsZEZvcmNlU3RvcCA9IGZhbHNlO1xuICAgIHdoaWxlICh0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS52YWx1ZVtpXSAmJiB0aGlzLmJhc2tldEFjdGlvbnNRdWV1ZS52YWx1ZVtpXS50eXBlID09PSBjdXJyZW50QWN0aW9uLnR5cGUgJiYgIXNob3VsZEZvcmNlU3RvcCkge1xuICAgICAgY3VycmVudEFjdGlvbiA9IHRoaXMuYmFza2V0QWN0aW9uc1F1ZXVlLnZhbHVlW2ldO1xuICAgICAgc2hvdWxkRm9yY2VTdG9wID0gdGhpcy5hZGRBY3Rpb25Ub0JhdGNoT3JTdG9wUHJvY2Vzc2luZ0JhdGNoKGJhdGNoLCBjdXJyZW50QWN0aW9uKTtcbiAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIGJhdGNoO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGJhdGNoIHNob3VsZCBzdG9wIHByb2Nlc3NpbmdcbiAgICovXG4gIHByaXZhdGUgYWRkQWN0aW9uVG9CYXRjaE9yU3RvcFByb2Nlc3NpbmdCYXRjaChiYXRjaDogQmFza2V0QWN0aW9uW10sIGN1cnJlbnRBY3Rpb246IEJhc2tldEFjdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlY2lwZUluZGV4ID0gdGhpcy5jaGVja0ZvckFjdGlvblRvT3ZlcnJpZGUoYmF0Y2gsIGN1cnJlbnRBY3Rpb24pO1xuICAgIGlmIChyZWNpcGVJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuYWN0aW9uc0JlaW5nT3ZlcnJpZGRlbi5wdXNoKGJhdGNoW3JlY2lwZUluZGV4XSk7XG4gICAgICBiYXRjaFtyZWNpcGVJbmRleF0gPSBjdXJyZW50QWN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRGb3JjZVN0b3BCYXRjaChiYXRjaCwgY3VycmVudEFjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXRjaC5wdXNoKGN1cnJlbnRBY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZEZvcmNlU3RvcEJhdGNoKGJhdGNoOiBCYXNrZXRBY3Rpb25bXSwgY3VycmVudEFjdGlvbjogQmFza2V0QWN0aW9uKTogYm9vbGVhbiB7XG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgYmF0Y2ggaXMgYW4gVVBEQVRFIGJhdGNoLCB3ZSBjYW4ndCB1cGRhdGUgbXVsdGlwbGUgcmVjaXBlcyB3aXRoIGRpZmZlcmVudHMgZ3Vlc3RzIHZhbHVlcyBhdCB0aGUgc2FtZSB0aW1lXG4gICAgLy8gc28gaW4gdGhpcyBjYXNlIHdlIHN0b3AgdGhlIGJhdGNoIGJlZm9yZSB0aGUgVVBEQVRFIHdpdGggYSBkaWZmZXJlbnQgZ3Vlc3RzIHZhbHVlXG4gICAgcmV0dXJuIChjdXJyZW50QWN0aW9uLnR5cGUgPT09IEJhc2tldEFjdGlvblR5cGUuVVBEQVRFX1JFQ0lQRSAmJlxuICAgICAgICBiYXRjaC5sZW5ndGggPiAwICYmXG4gICAgICAgICFiYXRjaC5zb21lKGEgPT4gYS5wYXJhbXMuZ3Vlc3RzID09PSBjdXJyZW50QWN0aW9uLnBhcmFtcy5ndWVzdHMpKSB8fFxuICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgYmF0Y2ggaXMgYW4gcHJvZHVjdCBhZGQvcmVtb3ZlIGJhdGNoLCB3ZSBjYW4ndCBhZGQgb3IgcmVtb3ZlIHByb2R1Y3RzIGZyb20gZGlmZmVyZW50IHJlY2lwZXMgYXQgdGhlIHNhbWUgdGltZVxuICAgICAgLy8gc28gaW4gdGhpcyBjYXNlIHdlIHN0b3AgdGhlIGJhdGNoIGJlZm9yZSB0aGUgYWRkL3JlbW92ZSB3aXRoIGEgZGlmZmVyZW50IHJlY2lwZVxuICAgICAgKChjdXJyZW50QWN0aW9uLnR5cGUgPT09IEJhc2tldEFjdGlvblR5cGUuQUREX1BST0RVQ1QgfHwgY3VycmVudEFjdGlvbi50eXBlID09PSBCYXNrZXRBY3Rpb25UeXBlLlJFTU9WRV9QUk9EVUNUKSAmJlxuICAgICAgICBiYXRjaC5sZW5ndGggPiAwICYmXG4gICAgICAgICFiYXRjaC5zb21lKGEgPT4gYS5wYXJhbXMucmVjaXBlSWQgPT09IGN1cnJlbnRBY3Rpb24ucGFyYW1zLnJlY2lwZUlkKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIGFjdGlvbnMgZm9yIHdoaWNoIG92ZXJyaWRpbmcgd291bGQgaGF2ZSB0aGUgc2FtZSByZXN1bHQgYXMgcHJvY2Vzc2luZyBib3RoIGluIG9yZGVyXG4gICAqL1xuICBwcml2YXRlIGNoZWNrRm9yQWN0aW9uVG9PdmVycmlkZShiYXRjaDogQmFza2V0QWN0aW9uW10sIGN1cnJlbnRBY3Rpb246IEJhc2tldEFjdGlvbik6IG51bWJlciB7XG4gICAgc3dpdGNoIChjdXJyZW50QWN0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgQmFza2V0QWN0aW9uVHlwZS5BRERfUFJPRFVDVDpcbiAgICAgICAgcmV0dXJuIGJhdGNoLmZpbmRJbmRleChhID0+XG4gICAgICAgICAgYS5wYXJhbXMuaW5ncmVkaWVudElkID09PSBjdXJyZW50QWN0aW9uLnBhcmFtcy5pbmdyZWRpZW50SWQgJiYgYS5wYXJhbXMucmVjaXBlSWQgPT09IGN1cnJlbnRBY3Rpb24ucGFyYW1zLnJlY2lwZUlkXG4gICAgICAgICk7XG5cbiAgICAgIGNhc2UgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVDpcbiAgICAgICAgcmV0dXJuIGJhdGNoLmZpbmRJbmRleChhID0+IHtcbiAgICAgICAgICBsZXQgY2hlY2tQcm9kdWN0OiBib29sZWFuO1xuICAgICAgICAgIGlmIChjdXJyZW50QWN0aW9uLnBhcmFtcy5iYXNrZXRFbnRyeT8uaWQpIHtcbiAgICAgICAgICAgIGNoZWNrUHJvZHVjdCA9IGEucGFyYW1zLmJhc2tldEVudHJ5LmlkID09PSBjdXJyZW50QWN0aW9uLnBhcmFtcy5iYXNrZXRFbnRyeS5pZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hlY2tQcm9kdWN0ID0gYS5wYXJhbXMuaW5ncmVkaWVudElkID09PSBjdXJyZW50QWN0aW9uLnBhcmFtcy5pbmdyZWRpZW50SWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjaGVja1Byb2R1Y3QgJiYgYS5wYXJhbXMucmVjaXBlSWQgPT09IGN1cnJlbnRBY3Rpb24ucGFyYW1zLnJlY2lwZUlkO1xuICAgICAgICB9KTtcblxuICAgICAgY2FzZSBCYXNrZXRBY3Rpb25UeXBlLlJFTU9WRV9QUk9EVUNUX0ZST01fUkVDSVBFOlxuICAgICAgICByZXR1cm4gYmF0Y2guZmluZEluZGV4KGEgPT5cbiAgICAgICAgICBhLnBhcmFtcy5pbmdyZWRpZW50SWQgPT09IGN1cnJlbnRBY3Rpb24ucGFyYW1zLmluZ3JlZGllbnRJZCAmJiBhLnBhcmFtcy5yZWNpcGVJZCA9PT0gY3VycmVudEFjdGlvbi5wYXJhbXMucmVjaXBlSWRcbiAgICAgICAgKTtcblxuICAgICAgY2FzZSBCYXNrZXRBY3Rpb25UeXBlLlVQREFURV9QUk9EVUNUOlxuICAgICAgICByZXR1cm4gYmF0Y2guZmluZEluZGV4KGEgPT4gYS5wYXJhbXMuYmFza2V0RW50cnkuaWQgPT09IGN1cnJlbnRBY3Rpb24ucGFyYW1zLmJhc2tldEVudHJ5LmlkKTtcblxuICAgICAgY2FzZSBCYXNrZXRBY3Rpb25UeXBlLlVQREFURV9SRUNJUEU6XG4gICAgICAgIGlmICghYmF0Y2guc29tZShhID0+IGEucGFyYW1zLnJlY2lwZUlkICE9PSBjdXJyZW50QWN0aW9uLnBhcmFtcy5yZWNpcGVJZCkpIHtcbiAgICAgICAgICByZXR1cm4gYmF0Y2guZmluZEluZGV4KGEgPT4gYS5wYXJhbXMucmVjaXBlSWQgPT09IGN1cnJlbnRBY3Rpb24ucGFyYW1zLnJlY2lwZUlkKTtcbiAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgb25seSB0aGUgc2FtZSByZWNpcGVJZCBhcyB0aGUgY3VycmVudEFjdGlvbiBpbiB0aGUgYmF0Y2ggYW5kIHdlIGFyZSB1cGRhdGluZyB0aGlzIHJlY2lwZSdzIGd1ZXN0c1xuICAgICAgICAgIC8vIHdlIGNhbiBzYWZlbHkgb3ZlcnJpZGUgdGhlIGFjdGlvbiBpbiB0aGUgYmF0Y2hcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG5cbiAgICAgIC8vIEFERF9SRUNJUEUgKyBBRERfUkVDSVBFX0xJR0hUICsgUkVNT1ZFX1JFQ0lQRVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGJhdGNoLmZpbmRJbmRleChhID0+IGEucGFyYW1zLnJlY2lwZUlkID09PSBjdXJyZW50QWN0aW9uLnBhcmFtcy5yZWNpcGVJZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzQWN0aW9uc0JhdGNoKGFjdGlvbnNUb1Byb2Nlc3M6IEJhc2tldEFjdGlvbltdKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgc3dpdGNoIChhY3Rpb25zVG9Qcm9jZXNzWzBdLnR5cGUpIHtcbiAgICAgIGNhc2UgQmFza2V0QWN0aW9uVHlwZS5BRERfUkVDSVBFOlxuICAgICAgICByZXR1cm4gdGhpcy5hZGRSZWNpcGVzKGFjdGlvbnNUb1Byb2Nlc3MpO1xuXG4gICAgICBjYXNlIEJhc2tldEFjdGlvblR5cGUuQUREX1JFQ0lQRV9MSUdIVDpcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmVjaXBlc1dpdGhvdXRJbmdyZWRpZW50cyhhY3Rpb25zVG9Qcm9jZXNzKTtcblxuICAgICAgY2FzZSBCYXNrZXRBY3Rpb25UeXBlLlJFTU9WRV9SRUNJUEU6XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZVJlY2lwZXMoYWN0aW9uc1RvUHJvY2Vzcyk7XG5cbiAgICAgIGNhc2UgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUkVDSVBFX0xJR0hUOlxuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVSZWNpcGVzKGFjdGlvbnNUb1Byb2Nlc3MsIHRydWUpO1xuXG4gICAgICBjYXNlIEJhc2tldEFjdGlvblR5cGUuVVBEQVRFX1JFQ0lQRTpcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUmVjaXBlc0d1ZXN0cyhhY3Rpb25zVG9Qcm9jZXNzKTtcblxuICAgICAgY2FzZSBCYXNrZXRBY3Rpb25UeXBlLlVQREFURV9SRUNJUEVfTElHSFQ6XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVJlY2lwZXNHdWVzdHMoYWN0aW9uc1RvUHJvY2VzcywgdHJ1ZSk7XG5cbiAgICAgIGNhc2UgQmFza2V0QWN0aW9uVHlwZS5BRERfUFJPRFVDVDpcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkSXRlbXNGb3JJbmdyZWRpZW50cyhhY3Rpb25zVG9Qcm9jZXNzKTtcblxuICAgICAgY2FzZSBCYXNrZXRBY3Rpb25UeXBlLkFERF9JVEVNOlxuICAgICAgICByZXR1cm4gdGhpcy5hZGRJdGVtc1RvQmFza2V0KGFjdGlvbnNUb1Byb2Nlc3MpO1xuXG4gICAgICBjYXNlIEJhc2tldEFjdGlvblR5cGUuUkVNT1ZFX1BST0RVQ1Q6XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRm9ySW5ncmVkaWVudHMoYWN0aW9uc1RvUHJvY2Vzcyk7XG5cbiAgICAgIGNhc2UgQmFza2V0QWN0aW9uVHlwZS5SRU1PVkVfUFJPRFVDVF9GUk9NX1JFQ0lQRTpcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlUHJvZHVjdFdpdGhGb3JjZWRRdWFudGl0eShhY3Rpb25zVG9Qcm9jZXNzKTtcblxuICAgICAgY2FzZSBCYXNrZXRBY3Rpb25UeXBlLlVQREFURV9QUk9EVUNUOlxuICAgICAgICByZXR1cm4gdGhpcy5jaGFuZ2VCYXNrZXRFbnRyaWVzUXVhbnRpdGllcyhhY3Rpb25zVG9Qcm9jZXNzKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUFJPQ0VTUyBUSEUgQUNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovXG5cbiAgLyoqXG4gICAqIEFkZHMgcmVjaXBlcyB0byB0aGUgYmFza2V0IEhUVFAgcmVxdWVzdC5cbiAgICpcbiAgICogQHBhcmFtIHJlY2lwZXNUb0FkZCAtIFRoZSByZWNpcGVzIHRvIGFkZCB0byB0aGUgYmFza2V0LlxuICAgKiBAcGFyYW0gd2l0aEluZ3JlZGllbnRzIC0gKG9wdGlvbmFsKSBXaGV0aGVyIHRvIGluY2x1ZGUgaW5ncmVkaWVudHMgaW4gdGhlIHJlcXVlc3QuIERlZmF1bHQgaXMgdHJ1ZS5cbiAgICogQHJldHVybiBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdm9pZCB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlZC5cbiAgICovXG4gIHByaXZhdGUgYWRkUmVjaXBlcyhyZWNpcGVzVG9BZGQ6IEJhc2tldEFjdGlvbltdLCB3aXRoSW5ncmVkaWVudHMgPSB0cnVlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG5cbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQmFza2V0LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoYmFza2V0ID0+IHtcbiAgICAgICAgY29uc3QgcmVjaXBlSWRzID0gcmVjaXBlc1RvQWRkXG4gICAgICAgICAgLm1hcChyID0+ICh7IHJlY2lwZV9pZDogci5wYXJhbXMucmVjaXBlSWQsIGd1ZXN0czogci5wYXJhbXMuZ3Vlc3RzIH0pKVxuICAgICAgICAgIC5maWx0ZXIociA9PiAhdGhpcy5jdXJyZW50bHlBZGRpbmdSZWNpcGVzLmluY2x1ZGVzKHIucmVjaXBlX2lkKSlcbiAgICAgICAgICAuZmlsdGVyKHIgPT4gIWJhc2tldC5oYXNSZWNpcGUoci5yZWNpcGVfaWQpKTtcbiAgICAgICAgaWYgKHJlY2lwZUlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCBhcyB2b2lkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRseUFkZGluZ1JlY2lwZXMgPSBbLi4udGhpcy5jdXJyZW50bHlBZGRpbmdSZWNpcGVzLCAuLi5yZWNpcGVJZHMubWFwKHIgPT4gci5yZWNpcGVfaWQpXTtcbiAgICAgICAgY29uc3QgcG9zdFVybCA9IGAke2UubWlhbUFQSX0vYXBpL3YxL2Jhc2tldHMvJHtiYXNrZXQuaWR9L3JlY2lwZXNgICtcbiAgICAgICAgICBgP2ZpZWxkc1tiYXNrZXRzXT0ke0JBU0tFVF9TUEFSU0VfRklFTERTLmJhc2tldHMuam9pbignLCcpfSR7d2l0aEluZ3JlZGllbnRzID8gJycgOiAnJmxpZ2h0X21vZGU9dHJ1ZSd9YDtcbiAgICAgICAgY29uc3QgYm9keSA9IHsgZGF0YTogcmVjaXBlSWRzIH07XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5zZW5kQWRkUmVjaXBlc0V2ZW50cyhyZWNpcGVzVG9BZGQpO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QocG9zdFVybCwgYm9keSkucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKGI6IERvY3VtZW50UmVzb3VyY2U8QmFza2V0PikgPT4gKGIuZGF0YT8uaWQpID8gdGhpcy5maWxsQmFza2V0KGIpIDogb2YobnVsbCBhcyB2b2lkKSksXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVjaXBlc0FkZGVkLmVtaXQocmVjaXBlSWRzLm1hcChyID0+IHIucmVjaXBlX2lkKSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRseUFkZGluZ1JlY2lwZXMgPSB0aGlzLmN1cnJlbnRseUFkZGluZ1JlY2lwZXMuZmlsdGVyKGlkID0+ICEodGhpcy5iYXNrZXQkLnZhbHVlLnJlY2lwZUluZm9zLmZpbmQoaSA9PiBpLmlkID09PSBpZCkpKTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwgYXMgdm9pZCkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUmVjaXBlc1dpdGhvdXRJbmdyZWRpZW50cyhyZWNpcGVzVG9BZGQ6IEJhc2tldEFjdGlvbltdKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRkUmVjaXBlcyhyZWNpcGVzVG9BZGQsIGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUmVjaXBlcyhyZWNpcGVzVG9SZW1vdmU6IEJhc2tldEFjdGlvbltdLCBsaWdodE1vZGUgPSBmYWxzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLndhaXRGb3JCYXNrZXQucGlwZShcbiAgICAgIHN3aXRjaE1hcChiYXNrZXQgPT4ge1xuICAgICAgICBsZXQgZGVsZXRlVXJsID0gYCR7ZS5taWFtQVBJfS9hcGkvdjEvYmFza2V0cy8ke2Jhc2tldC5pZH0vcmVjaXBlcz9yZWNpcGVfaWRzW109YCArXG4gICAgICAgICAgcmVjaXBlc1RvUmVtb3ZlLm1hcChyID0+IHIucGFyYW1zLnJlY2lwZUlkKS5qb2luKCcmcmVjaXBlX2lkc1tdPScpICtcbiAgICAgICAgICBgJmZpZWxkc1tiYXNrZXRzXT0ke0JBU0tFVF9TUEFSU0VfRklFTERTLmJhc2tldHMuam9pbignLCcpfWA7XG4gICAgICAgIGlmIChsaWdodE1vZGUpIHtcbiAgICAgICAgICBkZWxldGVVcmwgKz0gJyZsaWdodF9tb2RlPXRydWUnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5zZW5kUmVtb3ZlUmVjaXBlc0V2ZW50cyhyZWNpcGVzVG9SZW1vdmUpO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZShkZWxldGVVcmwpLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKChiOiBEb2N1bWVudFJlc291cmNlPEJhc2tldD4pID0+IChiLmRhdGE/LmlkKSA/IHRoaXMuZmlsbEJhc2tldChiKSA6IG9mKG51bGwgYXMgdm9pZCkpXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCBhcyB2b2lkKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVSZWNpcGVzR3Vlc3RzKHJlY2lwZXNUb1VwZGF0ZTogQmFza2V0QWN0aW9uW10sIGxpZ2h0TW9kZSA9IGZhbHNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgLy8gVE9ETyBiYXNrZXQtc3luY2hybzogU2VlIGlmIGl0IHJlYWN0cyBjb3JyZWN0bHlcbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQmFza2V0LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoYmFza2V0ID0+IHtcbiAgICAgICAgbGV0IHBhdGNoVXJsID0gYCR7ZS5taWFtQVBJfS9hcGkvdjEvYmFza2V0cy8ke2Jhc2tldC5pZH0vcmVjaXBlc19ndWVzdHM/Z3Vlc3RzPSR7cmVjaXBlc1RvVXBkYXRlWzBdLnBhcmFtcy5ndWVzdHN9JnJlY2lwZV9pZHNbXT1gICtcbiAgICAgICAgICByZWNpcGVzVG9VcGRhdGUubWFwKHIgPT4gci5wYXJhbXMucmVjaXBlSWQpLmpvaW4oJyZyZWNpcGVfaWRzW109JykgKyBgJmZpZWxkc1tiYXNrZXRzXT0ke0JBU0tFVF9TUEFSU0VfRklFTERTLmJhc2tldHMuam9pbignLCcpfWA7XG4gICAgICAgIGlmIChsaWdodE1vZGUpIHtcbiAgICAgICAgICBwYXRjaFVybCArPSAnJmxpZ2h0X21vZGU9dHJ1ZSc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLnNlbmRVcGRhdGVHdWVzdHNFdmVudHMocmVjaXBlc1RvVXBkYXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaChwYXRjaFVybCwge30pLnBpcGUoXG4gICAgICAgICAgc2tpcFdoaWxlKChiOiBEb2N1bWVudFJlc291cmNlPEJhc2tldD4pID0+ICFiKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoYiA9PiAoYi5kYXRhPy5pZCkgPyB0aGlzLmZpbGxCYXNrZXQoYikgOiBvZihudWxsIGFzIHZvaWQpKVxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwgYXMgdm9pZCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gaW5ncmVkaWVudHNUb0FkZFxuICAgKi9cbiAgcHJpdmF0ZSBhZGRJdGVtc0ZvckluZ3JlZGllbnRzKGluZ3JlZGllbnRzVG9BZGQ6IEJhc2tldEFjdGlvbltdKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMud2FpdEZvckJhc2tldC5waXBlKFxuICAgICAgc3dpdGNoTWFwKGJhc2tldCA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RzID0gaW5ncmVkaWVudHNUb0FkZC5tYXAoYWN0aW9uID0+IHtcbiAgICAgICAgICBjb25zdCBtb2RpZmllZEd1ZXN0cyA9IHRoaXMuZ3Vlc3RzRm9yUmVjaXBlKGFjdGlvbi5wYXJhbXMucmVjaXBlSWQpO1xuICAgICAgICAgIGNvbnN0IHBhdGNoVXJsID0gYCR7ZS5taWFtQVBJfS9hcGkvdjEvYmFza2V0cy8ke2Jhc2tldC5pZH0vYmFza2V0LWVudHJpZXMvJHthY3Rpb24ucGFyYW1zLmJhc2tldEVudHJ5LmlkfS9hZGQtaW5ncmVkaWVudGAgK1xuICAgICAgICAgICAgYD9pbmdyZWRpZW50X2lkPSR7YWN0aW9uLnBhcmFtcy5pbmdyZWRpZW50SWR9JnNlbGVjdGVkX2l0ZW1faWQ9JHthY3Rpb24ucGFyYW1zLmJhc2tldEVudHJ5LnNlbGVjdGVkSXRlbS5pZH1gICtcbiAgICAgICAgICAgIGAmZ3Vlc3RzPSR7bW9kaWZpZWRHdWVzdHN9JmZvcmNlZF9xdWFudGl0eT0ke2FjdGlvbi5wYXJhbXMuYmFza2V0RW50cnkucXVhbnRpdHl9YDtcbiAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBhdGNoKHBhdGNoVXJsLCB7fSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFuYWx5dGljc1NlcnZpY2Uuc2VuZEFkZFByb2R1Y3RzRXZlbnRzKGluZ3JlZGllbnRzVG9BZGQpO1xuICAgICAgICByZXR1cm4gZm9ya0pvaW4ocmVxdWVzdHMpO1xuICAgICAgfSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5yZWxvYWRCYXNrZXQoKSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gb2Y8dm9pZD4obnVsbCkpLCAvLyBKdXN0IHRvIGtlZXAgdGhlIHJldHVybiB0eXBlIGFzIE9ic2VydmFibGU8dm9pZD4gdG8gbWF0Y2ggd2l0aCB0aGUgb3RoZXIgbWV0aG9kc1xuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsIGFzIHZvaWQpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGl0ZW1zIHRvIHRoZSBiYXNrZXQgSFRUUCByZXF1ZXN0LlxuICAgKlxuICAgKiBAcGFyYW0gaXRlbXNUb0FkZCAtIGl0ZW1zIHRvIGFkZCB0byB0aGUgYmFza2V0XG4gICAqIEByZXR1cm4gQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gdGhlIGl0ZW1zIGFyZSBzdWNjZXNzZnVsbHkgYWRkZWQuXG4gICAqL1xuICBwcml2YXRlIGFkZEl0ZW1zVG9CYXNrZXQoaXRlbXNUb0FkZDogQmFza2V0QWN0aW9uW10pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQmFza2V0LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoYmFza2V0ID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdHMgPSBpdGVtc1RvQWRkLm1hcChhY3Rpb24gPT4ge1xuICAgICAgICAgIGNvbnN0IHBvc3RVcmwgPSBgJHtlLm1pYW1BUEl9L2FwaS92MS9iYXNrZXRzLyR7YmFza2V0LmlkfS9iYXNrZXQtZW50cmllcy9mcm9tLWl0ZW1gICtcbiAgICAgICAgICAgIGA/aW5jbHVkZT1zZWxlY3RlZC1pdGVtJnNlbGVjdGVkX2l0ZW1faWQ9JHthY3Rpb24ucGFyYW1zLml0ZW0uaWR9YCArXG4gICAgICAgICAgICBgJm5hbWU9JHthY3Rpb24ucGFyYW1zLml0ZW0uYXR0cmlidXRlcy5uYW1lfWA7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuY29kZVVSSShwb3N0VXJsLnRyaW0oKSksIHt9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5zZW5kQWRkUHJvZHVjdHNFdmVudHMoaXRlbXNUb0FkZCk7XG4gICAgICAgIHJldHVybiBmb3JrSm9pbihyZXF1ZXN0cyk7XG4gICAgICB9KSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnJlbG9hZEJhc2tldCgpKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBvZjx2b2lkPihudWxsKSksIC8vIEp1c3QgdG8ga2VlcCB0aGUgcmV0dXJuIHR5cGUgYXMgT2JzZXJ2YWJsZTx2b2lkPiB0byBtYXRjaCB3aXRoIHRoZSBvdGhlciBtZXRob2RzXG4gICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwgYXMgdm9pZCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgaW5ncmVkaWVudHMgZnJvbSB0aGUgYmFza2V0IEhUVFAgcmVxdWVzdC5cbiAgICpcbiAgICogQHBhcmFtIGluZ3JlZGllbnRzVG9SZW1vdmUgLSBUaGUgbGlzdCBvZiBpbmdyZWRpZW50cyB0byByZW1vdmUgZnJvbSB0aGUgYmFza2V0LlxuICAgKiBAcmV0dXJuIEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB3aGVuIHRoZSBpbmdyZWRpZW50cyBhcmUgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAqL1xuICBwcml2YXRlIHJlbW92ZUl0ZW1zRm9ySW5ncmVkaWVudHMoaW5ncmVkaWVudHNUb1JlbW92ZTogQmFza2V0QWN0aW9uW10pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCByZXF1ZXN0cyA9IGluZ3JlZGllbnRzVG9SZW1vdmUubWFwKGFjdGlvbiA9PiB0aGlzLnJlbW92ZUluZ3JlZGllbnQoYWN0aW9uLnBhcmFtcy5iYXNrZXRFbnRyeSkpO1xuICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5zZW5kUmVtb3ZlUHJvZHVjdHNFdmVudHMoaW5ncmVkaWVudHNUb1JlbW92ZSk7XG4gICAgcmV0dXJuIGZvcmtKb2luKHJlcXVlc3RzKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMucmVsb2FkQmFza2V0KCkpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9mPHZvaWQ+KG51bGwpKSwgLy8gSnVzdCB0byBrZWVwIHRoZSByZXR1cm4gdHlwZSBhcyBPYnNlcnZhYmxlPHZvaWQ+IHRvIG1hdGNoIHdpdGggdGhlIG90aGVyIG1ldGhvZHNcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCBhcyB2b2lkKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVQcm9kdWN0V2l0aEZvcmNlZFF1YW50aXR5KGJhc2tldEVudHJpZXNUb1JlbW92ZTogQmFza2V0QWN0aW9uW10pIHtcbiAgICBjb25zdCByZXF1ZXN0cyA9IGJhc2tldEVudHJpZXNUb1JlbW92ZS5tYXAoYWN0aW9uID0+XG4gICAgICB0aGlzLnJlbW92ZUluZ3JlZGllbnRGcm9tUmVjaXBlKGFjdGlvbi5wYXJhbXMuYmFza2V0RW50cnksIGFjdGlvbi5wYXJhbXMuaW5ncmVkaWVudElkLCBhY3Rpb24ucGFyYW1zLmZvcmNlZFF1YW50aXR5KSk7XG4gICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLnNlbmRSZW1vdmVQcm9kdWN0c0V2ZW50cyhiYXNrZXRFbnRyaWVzVG9SZW1vdmUpO1xuICAgIHJldHVybiBmb3JrSm9pbihyZXF1ZXN0cykucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnJlbG9hZEJhc2tldCgpKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBvZjx2b2lkPihudWxsKSksIC8vIEp1c3QgdG8ga2VlcCB0aGUgcmV0dXJuIHR5cGUgYXMgT2JzZXJ2YWJsZTx2b2lkPiB0byBtYXRjaCB3aXRoIHRoZSBvdGhlciBtZXRob2RzXG4gICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwgYXMgdm9pZCkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlSW5ncmVkaWVudEZyb21SZWNpcGUoYmFza2V0RW50cnk6IEJhc2tldEVudHJ5LCBpbmdyZWRpZW50SWQ6IHN0cmluZywgZm9yY2VkUXVhbnRpdHk6IG51bWJlcik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGlmICghYmFza2V0RW50cnkucmVjaXBlc0lkcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYmFza2V0RW50cnkuZGVsZXRlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMud2FpdEZvckJhc2tldC5waXBlKFxuICAgICAgc3dpdGNoTWFwKGJhc2tldCA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGNoVXJsID0gYCR7ZS5taWFtQVBJfS9hcGkvdjEvYmFza2V0cy8ke2Jhc2tldC5pZH0vYmFza2V0LWVudHJpZXMvJHtiYXNrZXRFbnRyeS5pZH1gICtcbiAgICAgICAgICBgL3JlbW92ZS1yZWNpcGU/aW5ncmVkaWVudF9pZD0ke2luZ3JlZGllbnRJZH0mZm9yY2VkX3F1YW50aXR5PSR7Zm9yY2VkUXVhbnRpdHl9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaChwYXRjaFVybCwge30pO1xuICAgICAgfSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gb2Y8dm9pZD4obnVsbCkpLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsIGFzIHZvaWQpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUluZ3JlZGllbnQoYmFza2V0RW50cnk6IEJhc2tldEVudHJ5KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgaWYgKCFiYXNrZXRFbnRyeS5yZWNpcGVzSWRzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBiYXNrZXRFbnRyeS5kZWxldGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQmFza2V0LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoYmFza2V0ID0+IHtcbiAgICAgICAgY29uc3QgcGF0Y2hVcmwgPSBgJHtlLm1pYW1BUEl9L2FwaS92MS9iYXNrZXRzLyR7YmFza2V0LmlkfS9iYXNrZXQtZW50cmllcy8ke2Jhc2tldEVudHJ5LmlkfS9yZW1vdmUtaW5ncmVkaWVudGA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2gocGF0Y2hVcmwsIHt9KTtcbiAgICAgIH0pLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9mPHZvaWQ+KG51bGwpKSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCBhcyB2b2lkKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIHF1YW50aXRpZXMgb2YgYmFza2V0IGVudHJpZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7QmFza2V0QWN0aW9uW119IHF1YW50aXRpZXNUb0NoYW5nZSAtIEFuIGFycmF5IG9mIEJhc2tldEFjdGlvbiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgcXVhbnRpdGllcyB0byBjaGFuZ2UuXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8dm9pZD59IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB2b2lkIHdoZW4gdGhlIHF1YW50aXRpZXMgaGF2ZSBiZWVuIGNoYW5nZWQuXG4gICAqL1xuICBwcml2YXRlIGNoYW5nZUJhc2tldEVudHJpZXNRdWFudGl0aWVzKHF1YW50aXRpZXNUb0NoYW5nZTogQmFza2V0QWN0aW9uW10pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICB0aGlzLmFuYWx5dGljc1NlcnZpY2Uuc2VuZFByb2R1Y3RzQ2hhbmdlUXVhbnRpdHlFdmVudHMocXVhbnRpdGllc1RvQ2hhbmdlKTtcbiAgICBjb25zdCByZXF1ZXN0cyA9IHF1YW50aXRpZXNUb0NoYW5nZS5tYXAoYWN0aW9uID0+XG4gICAgICB0aGlzLmJhc2tldEVudHJpZXNTZXJ2aWNlLnVwZGF0ZVF1YW50aXR5KGFjdGlvbi5wYXJhbXMuYmFza2V0RW50cnkuaWQsIGFjdGlvbi5wYXJhbXMubmV3UXVhbnRpdHkpXG4gICAgKTtcbiAgICByZXR1cm4gZm9ya0pvaW4ocmVxdWVzdHMpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5yZWxvYWRCYXNrZXQoKSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gb2Y8dm9pZD4obnVsbCkpLCAvLyBKdXN0IHRvIGtlZXAgdGhlIHJldHVybiB0eXBlIGFzIE9ic2VydmFibGU8dm9pZD4gdG8gbWF0Y2ggd2l0aCB0aGUgb3RoZXIgbWV0aG9kc1xuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsIGFzIHZvaWQpKVxuICAgICk7XG4gIH1cblxuICAvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVQREFUSU5HIFRIRSBCQVNLRVQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqL1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgX2Jhc2tldCQgY29udGVudCAmIHNhdmUgYmFza2V0SWQgaW4gdGhlIGxvY2FsU3RvcmFnZSBpZiB0aGUgdXNlciBpcyBub3QgbG9nZ3VlZCBpbiBzbyB3ZSBjYW4gbWVyZ2VXaXRoIHdoZW4gdGhleSBsb2cgaW5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlTG9jYWxCYXNrZXQoYmFza2V0OiBCYXNrZXQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICB0aGlzLmJhc2tldFByZXZpZXdJc0NhbGN1bGF0aW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuX2Jhc2tldCQubmV4dChiYXNrZXQpO1xuICAgIHJldHVybiB0aGlzLmxvYWRQcmV2aWV3KCkucGlwZSh0YXAoKCkgPT4ge1xuICAgICAgdGhpcy5iYXNrZXRJc0ZldGNoaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMuY3VycmVudEFuZFByZXZpZXdGZXRjaGluZy5uZXh0KGZhbHNlKTtcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogc2F2ZSgpIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgaXNuJ3QgYSByZXNvdXJjZSBzbyBtZXRob2RzIGFyZW4ndCBhdHRhY2hlZCwgc28gd2UgaGF2ZSB0byBkbyBhIGxpdHRsZSB0cmlja1xuICAgKiBAcGFyYW0gcmVzIHJlc3VsdCBvZiB0aGUgc2F2ZVxuICAgKiBAcmV0dXJucyBjb3JyZWN0IEJhc2tldCB3aXRoIHRoZSByaWdodCBhdHRyaWJ1dGVzICYgbWV0aG9kc1xuICAgKi9cbiAgcHJpdmF0ZSBmaWxsQmFza2V0KHJlczogRG9jdW1lbnRSZXNvdXJjZTxCYXNrZXQ+KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgYmFza2V0ID0gdGhpcy5uZXcoKTtcbiAgICBiYXNrZXQuZmlsbChyZXMpO1xuICAgIHRoaXMuYmFza2V0UHJldmlld0lzQ2FsY3VsYXRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5fYmFza2V0JC5uZXh0KGJhc2tldCk7XG4gICAgcmV0dXJuIHRoaXMubG9hZFByZXZpZXcoKTtcbiAgfVxuXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOSVRJQUwgTE9BRCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqL1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNlIHRoZSBiYXNrZXQgbG9hZGluZyB3aGVuIHRoZSBwb3MgaXMgaW5pdGlhbGlzZWQgb3IgbW9kaWZpZWRcbiAgICogQHJldHVybnMgX2Jhc2tldCRcbiAgICovXG4gIHByaXZhdGUgbG9hZEJhc2tldCgpOiBPYnNlcnZhYmxlPEJhc2tldD4ge1xuICAgIHJldHVybiB0aGlzLnBvc1NlcnZpY2Uud2FpdEZvclBvcy5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMucmVmcmVzaEN1cnJlbnRCYXNrZXQoKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkUHJldmlldygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQmFza2V0LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoYmFza2V0ID0+IHRoaXMucmVjaXBlc1NlcnZpY2UubG9hZFJlY2lwZXMoYmFza2V0LnJlY2lwZUluZm9zKSksXG4gICAgICBzd2l0Y2hNYXAoKHJlY2lwZXM6IFJlY2lwZVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2tldDogQmFza2V0ID0gdGhpcy5fYmFza2V0JC52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hCYXNrZXRFbnRyaWVzKGJhc2tldCkucGlwZShcbiAgICAgICAgICBtYXAoZW50cmllcyA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaW5lRW50cmllcyA9IHRoaXMuZ3JvdXBCYXNrZXRFbnRyaWVzKHJlY2lwZXMsIGVudHJpZXMpO1xuICAgICAgICAgICAgY29uc3QgbGluZXMgPSB0aGlzLnJlY2lwZXNBbmRMaW5lRW50cmllc1RvQmFza2V0UHJldmlld0xpbmUocmVjaXBlcywgbGluZUVudHJpZXMpO1xuICAgICAgICAgICAgdGhpcy5fYmFza2V0UHJldmlldyQubmV4dChsaW5lcyk7XG4gICAgICAgICAgICB0aGlzLmJhc2tldFByZXZpZXdJc0NhbGN1bGF0aW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuYmFza2V0U3RhdHMkLm5leHQodGhpcy5idWlsZFN0YXRzKGxpbmVzKSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hCYXNrZXRFbnRyaWVzKGJhc2tldDogQmFza2V0KTogT2JzZXJ2YWJsZTxCYXNrZXRFbnRyeVtdPiB7XG4gICAgaWYgKCFiYXNrZXQgfHwgIWJhc2tldC5jb21wbGV0aW9uIHx8IGJhc2tldC5jb21wbGV0aW9uLnRvdGFsIDwgMSkge1xuICAgICAgdGhpcy5fZW50cmllcyQubmV4dChbXSk7XG4gICAgICByZXR1cm4gdGhpcy5fZW50cmllcyQucGlwZSh0YWtlKDEpKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlc0NvdW50ID0gTWF0aC5jZWlsKGJhc2tldC5jb21wbGV0aW9uLnRvdGFsIC8gQmFza2V0c1NlcnZpY2UuZW50cmllc1BlclBhZ2VzKTtcbiAgICByZXR1cm4gZm9ya0pvaW4oQXJyYXkocGFnZXNDb3VudCkuZmlsbCgwKS5tYXAoKHYsIGkpID0+IHRoaXMuZmV0Y2hCYXNrZXRFbnRyaWVzUGFnZShiYXNrZXQsIGkgKyAxKSkpLnBpcGUoXG4gICAgICBtYXAoKGNvbGxlY3Rpb25zOiBEb2N1bWVudENvbGxlY3Rpb248QmFza2V0RW50cnk+W10pID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbFxuICAgICAgICBjb25zdCBlbnRyaWVzID0gKGZsYXR0ZW4oY29sbGVjdGlvbnMubWFwKGNvbCA9PiBjb2wuZGF0YSkpIGFzIEJhc2tldEVudHJ5W10pO1xuICAgICAgICB0aGlzLl9lbnRyaWVzJC5uZXh0KGVudHJpZXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZW50cmllcyQudmFsdWU7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3RhdHMobGluZXM6IEJhc2tldFByZXZpZXdMaW5lW10pOiBCYXNrZXRTdGF0cyB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsXG4gICAgY29uc3QgZW50cmllc0ZvdW5kOiBCYXNrZXRFbnRyeVtdID0gdW5pb25CeSguLi5saW5lcy5tYXAobGluZSA9PiBsaW5lLmVudHJpZXMuZm91bmQpLCAnaWQnKTtcblxuICAgIGNvbnN0IHRvdGFsUHJpY2UgPSBlbnRyaWVzRm91bmQucmVkdWNlKCh0b3RhbCwgZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IGJhc2tldEVudHJpZXNJdGVtID0gZW50cnkuYXR0cmlidXRlc1snYmFza2V0LWVudHJpZXMtaXRlbXMnXS5maW5kKGkgPT4gaS5pdGVtX2lkID09PSBlbnRyeS5hdHRyaWJ1dGVzWydzZWxlY3RlZC1pdGVtLWlkJ10pO1xuICAgICAgdG90YWwgKz0gKGVudHJ5LmF0dHJpYnV0ZXMucXVhbnRpdHkgfHwgMCkgKiBwYXJzZUZsb2F0KGJhc2tldEVudHJpZXNJdGVtWyd1bml0LXByaWNlJ10pO1xuICAgICAgcmV0dXJuIHRvdGFsO1xuICAgIH0sIDApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY2lwZXNDb3VudDogbGluZXMubGVuZ3RoLFxuICAgICAgZW50cmllc0NvdW50OiBlbnRyaWVzRm91bmQubGVuZ3RoLFxuICAgICAgdG90YWxQcmljZVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGZldGNoQmFza2V0RW50cmllc1BhZ2UoYmFza2V0OiBCYXNrZXQsIHBhZ2U6IG51bWJlcik6IE9ic2VydmFibGU8RG9jdW1lbnRDb2xsZWN0aW9uPEJhc2tldEVudHJ5Pj4ge1xuICAgIGxldCBnZXRVcmwgPSBgJHtlLm1pYW1BUEl9L2FwaS92MS9iYXNrZXRzLyR7YmFza2V0LmlkfS9iYXNrZXQtZW50cmllc2A7XG4gICAgZ2V0VXJsID0gYCR7Z2V0VXJsfT9pbmNsdWRlPWl0ZW1zLHNlbGVjdGVkLWl0ZW0mcGFnZVtudW1iZXJdPSR7cGFnZX0mcGFnZVtzaXplXT0ke0Jhc2tldHNTZXJ2aWNlLmVudHJpZXNQZXJQYWdlc31gO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZ2V0VXJsKS5waXBlKFxuICAgICAgbWFwKChyZXNwOiBEb2N1bWVudENvbGxlY3Rpb248QmFza2V0RW50cnk+KSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2tldEVudHJpZXMgPSB0aGlzLmJhc2tldEVudHJpZXNTZXJ2aWNlLm5ld0NvbGxlY3Rpb24oKTtcbiAgICAgICAgYmFza2V0RW50cmllcy5maWxsKHJlc3ApO1xuICAgICAgICByZXR1cm4gYmFza2V0RW50cmllcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjaXBlc0FuZExpbmVFbnRyaWVzVG9CYXNrZXRQcmV2aWV3TGluZShyZWNpcGVzOiBSZWNpcGVbXSwgbGluZUVudHJpZXM6IExpbmVFbnRyaWVzW10pOiBCYXNrZXRQcmV2aWV3TGluZVtdIHtcbiAgICByZXR1cm4gcmVjaXBlcy5tYXAoKHJlY2lwZSwgaWR4KSA9PiB7XG4gICAgICBjb25zdCBpdGVtc0NvdW50ID0gbGluZUVudHJpZXNbaWR4XS5mb3VuZC5sZW5ndGg7XG4gICAgICBsZXQgcmVjaXBlUHJpY2UgPSAwLjA7XG4gICAgICBjb25zdCBndWVzdHMgPSByZWNpcGUubW9kaWZpZWRHdWVzdHMgfHwgcGFyc2VJbnQocmVjaXBlLmd1ZXN0cywgMTApO1xuXG4gICAgICBsaW5lRW50cmllc1tpZHhdLmZvdW5kLmZvckVhY2goZW50cnkgPT4ge1xuICAgICAgICBjb25zdCBxdHkgPSBlbnRyeS5hdHRyaWJ1dGVzLnF1YW50aXR5O1xuICAgICAgICBjb25zdCB1bml0UHJpY2UgPSB0aGlzLnByaWNlU2VydmljZS5nZXRDdXJyZW50UHJpY2UodGhpcy5wcmljZVNlcnZpY2UuZ2V0UHJpY2VGcm9tQmFza2V0RW50cnkoZW50cnkpKTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZSZWNpcGVzRm9yRW50cnkgPSBlbnRyeS5yZWNpcGVzSWRzLmxlbmd0aCB8fCAxO1xuXG4gICAgICAgIHJlY2lwZVByaWNlICs9IChxdHkgKiB1bml0UHJpY2UpIC8gbnVtYmVyT2ZSZWNpcGVzRm9yRW50cnk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHByaWNlUGVyR3Vlc3QgPSByZWNpcGVQcmljZSAvIGd1ZXN0cztcblxuICAgICAgcmV0dXJuIEJhc2tldFByZXZpZXdMaW5lLmZyb21SZWNpcGUocmVjaXBlLCBpdGVtc0NvdW50LCBwcmljZVBlckd1ZXN0LCByZWNpcGVQcmljZSwgbGluZUVudHJpZXNbaWR4XSk7XG4gICAgfSkuc29ydCgoYSwgYikgPT4gcmVjaXBlcy5maW5kSW5kZXgociA9PiByLmlkID09PSBiLmlkKSAtIHJlY2lwZXMuZmluZEluZGV4KHIgPT4gci5pZCA9PT0gYS5pZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBncm91cEJhc2tldEVudHJpZXMocmVjaXBlczogUmVjaXBlW10sIGVudHJpZXM6IEJhc2tldEVudHJ5W10pOiBMaW5lRW50cmllc1tdIHtcbiAgICByZXR1cm4gcmVjaXBlcy5tYXAocmVjaXBlID0+IHtcbiAgICAgIGNvbnN0IGxpbmVFbnRyaWVzID0geyBmb3VuZDogW10sIG5vdEZvdW5kOiBbXSwgb2Z0ZW5EZWxldGVkOiBbXSwgcmVtb3ZlZDogW10sIGFsbDogW10gfSBhcyBMaW5lRW50cmllcztcbiAgICAgIGVudHJpZXNcbiAgICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeS5yZWNpcGVzSWRzLmluY2x1ZGVzKCtyZWNpcGUuaWQpKVxuICAgICAgICAuZm9yRWFjaChlbnRyeSA9PiB7XG4gICAgICAgICAgY29uc3QgYXZhaWxhYmxlID0gZW50cnkuYXR0cmlidXRlc1snc2VsZWN0ZWQtaXRlbS1pZCddO1xuICAgICAgICAgIGlmIChhdmFpbGFibGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZW50cnkuc3RhdHVzKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ29mdGVuX2RlbGV0ZWQnOiB7XG4gICAgICAgICAgICAgICAgbGluZUVudHJpZXMub2Z0ZW5EZWxldGVkLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZWQnOiB7XG4gICAgICAgICAgICAgICAgbGluZUVudHJpZXMucmVtb3ZlZC5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgbGluZUVudHJpZXMuZm91bmQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGluZUVudHJpZXMubm90Rm91bmQucHVzaChlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxpbmVFbnRyaWVzLmFsbC5wdXNoKGVudHJ5KTtcbiAgICAgICAgfSk7XG4gICAgICByZXR1cm4gbGluZUVudHJpZXM7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==