@snabcentr/client-ui 4.14.8 → 4.14.20

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 (64) hide show
  1. package/esm2022/feedback/feedback-form/sc-feedback-form.component.mjs +21 -11
  2. package/esm2022/order/draft/sc-draft.component.mjs +15 -12
  3. package/esm2022/order/index.mjs +4 -3
  4. package/esm2022/order/models/sc-i-cart-items-by-direction.mjs +22 -0
  5. package/esm2022/order/order-direction-items/sc-order-direction-items.component.mjs +39 -0
  6. package/esm2022/order/order-form/sc-order-form.component.mjs +18 -6
  7. package/esm2022/order/order-items-list/sc-order-items-list.component.mjs +4 -3
  8. package/esm2022/order/order-items-list-by-directions/sc-order-items-list-by-directions.component.mjs +75 -0
  9. package/esm2022/providers/cleanup-recaptcha-artifacts.mjs +30 -0
  10. package/esm2022/providers/index.mjs +2 -1
  11. package/esm2022/public-api.mjs +1 -2
  12. package/esm2022/samples/sc-sample.module.mjs +10 -3
  13. package/esm2022/services/index.mjs +1 -2
  14. package/feedback/feedback-form/sc-feedback-form.component.d.ts +1 -1
  15. package/fesm2022/snabcentr-client-ui.mjs +168 -415
  16. package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
  17. package/order/draft/sc-draft.component.d.ts +8 -5
  18. package/order/index.d.ts +3 -2
  19. package/order/models/sc-i-cart-items-by-direction.d.ts +25 -0
  20. package/order/{new-order-items/sc-new-order-items.component.d.ts → order-direction-items/sc-order-direction-items.component.d.ts} +5 -5
  21. package/order/order-form/sc-order-form.component.d.ts +11 -2
  22. package/order/order-items-list/sc-order-items-list.component.d.ts +1 -0
  23. package/order/order-items-list-by-directions/sc-order-items-list-by-directions.component.d.ts +58 -0
  24. package/package.json +3 -2
  25. package/providers/cleanup-recaptcha-artifacts.d.ts +7 -0
  26. package/providers/index.d.ts +1 -0
  27. package/public-api.d.ts +0 -1
  28. package/release_notes.tmp +1 -1
  29. package/samples/sc-sample.module.d.ts +2 -1
  30. package/services/index.d.ts +0 -1
  31. package/styles/tailwind/tailwind.scss +2 -44
  32. package/esm2022/order/new-order-items/sc-new-order-items.component.mjs +0 -39
  33. package/esm2022/order/order-items-list-with-actions/sc-order-items-list-with-actions.component.mjs +0 -53
  34. package/esm2022/services/sc-scripts.service.mjs +0 -106
  35. package/esm2022/smart-captcha/index.mjs +0 -5
  36. package/esm2022/smart-captcha/interfaces/index.mjs +0 -6
  37. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-api.mjs +0 -2
  38. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-event.mjs +0 -2
  39. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-language.mjs +0 -2
  40. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-render-params.mjs +0 -2
  41. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-settings.mjs +0 -2
  42. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-window.mjs +0 -2
  43. package/esm2022/smart-captcha/sc-smart-captcha.component.mjs +0 -167
  44. package/esm2022/smart-captcha/services/index.mjs +0 -2
  45. package/esm2022/smart-captcha/services/sc-smart-captcha-loader.service.mjs +0 -87
  46. package/esm2022/smart-captcha/tokens/index.mjs +0 -3
  47. package/esm2022/smart-captcha/tokens/sc-smart-captcha-load-timeout.token.mjs +0 -8
  48. package/esm2022/smart-captcha/tokens/sc-smart-captcha-settings.token.mjs +0 -6
  49. package/order/order-items-list-with-actions/sc-order-items-list-with-actions.component.d.ts +0 -37
  50. package/services/sc-scripts.service.d.ts +0 -51
  51. package/smart-captcha/index.d.ts +0 -4
  52. package/smart-captcha/interfaces/index.d.ts +0 -5
  53. package/smart-captcha/interfaces/sc-smart-captcha-api.d.ts +0 -36
  54. package/smart-captcha/interfaces/sc-smart-captcha-event.d.ts +0 -4
  55. package/smart-captcha/interfaces/sc-smart-captcha-language.d.ts +0 -4
  56. package/smart-captcha/interfaces/sc-smart-captcha-render-params.d.ts +0 -16
  57. package/smart-captcha/interfaces/sc-smart-captcha-settings.d.ts +0 -16
  58. package/smart-captcha/interfaces/sc-smart-captcha-window.d.ts +0 -14
  59. package/smart-captcha/sc-smart-captcha.component.d.ts +0 -92
  60. package/smart-captcha/services/index.d.ts +0 -1
  61. package/smart-captcha/services/sc-smart-captcha-loader.service.d.ts +0 -50
  62. package/smart-captcha/tokens/index.d.ts +0 -2
  63. package/smart-captcha/tokens/sc-smart-captcha-load-timeout.token.d.ts +0 -5
  64. package/smart-captcha/tokens/sc-smart-captcha-settings.token.d.ts +0 -6
@@ -31,10 +31,19 @@ export class ScOrderFormComponent {
31
31
  * Инициализирует экземпляр класса {@link ScOrderFormComponent}.
32
32
  */
33
33
  constructor() {
34
+ /**
35
+ * Идентификатор направления продаж заказа.
36
+ */
37
+ this.directionId = input.required();
34
38
  /**
35
39
  * Требовать подтверждённые контактные данные для оформления. Для черновика — `false`.
36
40
  */
37
41
  this.enforceApprovedContacts = input(true);
42
+ /**
43
+ * Сохранять и восстанавливать черновые данные формы по направлению (метаданные). Для черновика — `false`.
44
+ * Работает только если предоставлен токен {@link SC_ORDER_FORM_CONFIG}.
45
+ */
46
+ this.persistMetadata = input(true);
38
47
  /**
39
48
  * Событие отправки валидной формы оформления. Полезная нагрузка — сырые значения формы.
40
49
  */
@@ -263,7 +272,10 @@ export class ScOrderFormComponent {
263
272
  }
264
273
  /** @inheritdoc */
265
274
  ngOnInit() {
266
- this.initMetadata();
275
+ // Восстанавливаем и сохраняем черновые данные формы по направлению.
276
+ if (this.persistMetadata()) {
277
+ this.initMetadata();
278
+ }
267
279
  }
268
280
  /**
269
281
  * Преобразует объекты в значения, отображаемое в поле ввода.
@@ -358,7 +370,7 @@ export class ScOrderFormComponent {
358
370
  });
359
371
  }
360
372
  /**
361
- * Восстанавливает черновые данные формы из метаданных и инициализирует их сохранение, если предоставлен токен {@link SC_ORDER_FORM_CONFIG}.
373
+ * Восстанавливает черновые данные формы из метаданных и инициализирует их сохранение.
362
374
  */
363
375
  initMetadata() {
364
376
  const { config } = this;
@@ -366,7 +378,7 @@ export class ScOrderFormComponent {
366
378
  return;
367
379
  }
368
380
  combineLatest({
369
- orderMetadata: this.uiService.getNewOrderMetadata$(),
381
+ orderMetadata: this.uiService.getNewOrderMetadata$(this.directionId()),
370
382
  user: this.user$.pipe(filter((user) => !user.isGuest)),
371
383
  })
372
384
  .pipe(first(), takeUntilDestroyed(this.destroyRef))
@@ -391,7 +403,7 @@ export class ScOrderFormComponent {
391
403
  }
392
404
  });
393
405
  this.form.valueChanges.pipe(debounceTime(config.debounceTime), takeUntilDestroyed(this.destroyRef)).subscribe((newOrder) => {
394
- this.uiService.setNewOrderMetadata(this.convertersService.removeNull(newOrder));
406
+ this.uiService.setNewOrderMetadata(this.directionId(), this.convertersService.removeNull(newOrder));
395
407
  });
396
408
  }
397
409
  /**
@@ -522,7 +534,7 @@ export class ScOrderFormComponent {
522
534
  reader.readAsDataURL(file);
523
535
  }
524
536
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScOrderFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
525
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScOrderFormComponent, isStandalone: true, selector: "sc-order-form", inputs: { enforceApprovedContacts: { classPropertyName: "enforceApprovedContacts", publicName: "enforceApprovedContacts", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { orderSubmit: "orderSubmit" }, providers: [TERMINAL_PROVIDERS], viewQueries: [{ propertyName: "unconfirmedDataWarning", first: true, predicate: ["unconfirmedDataWarning"], descendants: true, isSignal: true }], ngImport: i0, template: "@let user = user$ | async;\n\n<form\n [formGroup]=\"form\"\n scFocusFirstInvalidField\n [fieldOrder]=\"['contragentId', 'paymentType', 'deliveryType', 'warehouseId', 'addressId', 'deliveryDate', 'comment']\"\n (ngSubmit)=\"submit()\"\n class=\"flex flex-col gap-4\"\n>\n <ng-template #selectLoading> <tui-loader /> </ng-template>\n\n <!-- \u041A\u043E\u043D\u0442\u0440\u0430\u0433\u0435\u043D\u0442. -->\n @if (contragents$ | async; as contragents) {\n @if (contragents.length > 1 || user?.isOrg) {\n <div>\n <label tuiLabel>\n \u041A\u043E\u043D\u0442\u0440\u0430\u0433\u0435\u043D\u0442\n <tui-select\n formControlName=\"contragentId\"\n [valueContent]=\"contragents ? stringify(contragents) : selectLoading\"\n >\n \u041A\u043E\u043D\u0442\u0440\u0430\u0433\u0435\u043D\u0442\n <tui-data-list *tuiDataList>\n @for (contragent of contragents; track contragent.id) {\n <button\n tuiOption\n [value]=\"contragent.id\"\n >\n {{ contragent.name }}\n </button>\n }\n </tui-data-list>\n </tui-select>\n <tui-error\n formControlName=\"contragentId\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n <a\n tuiLink\n iconStart=\"@tui.plus\"\n (click)=\"addContragent()\"\n class=\"mt-2 block\"\n >\n \u041D\u043E\u0432\u044B\u0439\n </a>\n </div>\n }\n }\n\n <!-- \u0422\u0438\u043F \u043E\u043F\u043B\u0430\u0442\u044B. -->\n <label tuiLabel>\n \u0422\u0438\u043F \u043E\u043F\u043B\u0430\u0442\u044B\n @let paymentTypes = paymentTypes$ | async;\n <tui-select\n formControlName=\"paymentType\"\n [valueContent]=\"paymentTypes ? stringify(paymentTypes) : selectLoading\"\n >\n \u0422\u0438\u043F \u043E\u043F\u043B\u0430\u0442\u044B\n <tui-data-list *tuiDataList>\n @for (type of paymentTypes; track type.id) {\n <button\n tuiOption\n [value]=\"type.id\"\n >\n {{ type.name }}\n </button>\n }\n </tui-data-list>\n </tui-select>\n <tui-error\n formControlName=\"paymentType\"\n [error]=\"[] | tuiFieldError | async\"\n />\n @if (isCashPaymentSelected()) {\n <p class=\"text-xs text-tui-status-positive\">\u0417\u0430\u043A\u0430\u0437\u044B \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u044F\u0442\u0441\u044F \u043F\u043E \u043F\u0440\u0435\u0434\u043E\u043F\u043B\u0430\u0442\u0435</p>\n }\n </label>\n\n <!-- \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435 \u043E \u043D\u0435\u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043D\u043D\u044B\u0445 \u043A\u043E\u043D\u0442\u0430\u043A\u0442\u043D\u044B\u0445 \u0434\u0430\u043D\u043D\u044B\u0445. -->\n @if (!isPhoneApproved() || !isEmailApproved()) {\n <div\n #unconfirmedDataWarning\n class=\"text-tui-text-negative\"\n [class.warning-shake]=\"warningShake()\"\n >\n \u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435! \u0414\u043B\u044F \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F \u0437\u0430\u043A\u0430\u0437\u0430 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C\n @if (!isPhoneApproved()) {\n <span class=\"font-bold\"> \u043D\u043E\u043C\u0435\u0440 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 </span>\n }\n @if (!isPhoneApproved() && !isEmailApproved()) {\n <span> \u0438 </span>\n }\n @if (!isEmailApproved()) {\n <span class=\"font-bold\"> \u0430\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B </span>\n }\n <a\n tuiLink\n routerLink=\"/profile\"\n >\n \u0432 \u0432\u0430\u0448\u0435\u043C \u043F\u0440\u043E\u0444\u0438\u043B\u0435\n </a>\n </div>\n }\n\n <!-- \u0421\u043F\u043E\u0441\u043E\u0431 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438. -->\n <label tuiLabel>\n \u0421\u043F\u043E\u0441\u043E\u0431 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\n @let deliveryTypes = deliveryTypes$ | async;\n <tui-select\n formControlName=\"deliveryType\"\n [valueContent]=\"deliveryTypes ? stringify(deliveryTypes) : selectLoading\"\n >\n \u0421\u043F\u043E\u0441\u043E\u0431 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\n <tui-data-list *tuiDataList>\n @for (delivery of deliveryTypes; track delivery.id) {\n <button\n tuiOption\n [value]=\"delivery.id\"\n >\n {{ delivery.name }}\n </button>\n }\n </tui-data-list>\n </tui-select>\n <tui-error\n formControlName=\"deliveryType\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u0421\u043A\u043B\u0430\u0434. -->\n <label tuiLabel>\n \u0421\u043A\u043B\u0430\u0434\n @let warehouses = warehouses$ | async;\n <tui-select\n formControlName=\"warehouseId\"\n [valueContent]=\"warehouses ? stringify(warehouses) : selectLoading\"\n >\n \u0421\u043A\u043B\u0430\u0434\n <tui-data-list *tuiDataList>\n @if (!terminal.isRunningOnTerminal) {\n @for (warehouse of warehouses; track warehouse.id) {\n <button\n tuiOption\n [value]=\"warehouse.id\"\n >\n {{ warehouse.name }}\n </button>\n }\n } @else {\n @if (warehouseService.getCatalogWarehouseChange$() | async; as terminalWarehouse) {\n <button\n tuiOption\n [value]=\"terminalWarehouse.id\"\n >\n {{ terminalWarehouse.name }}\n </button>\n }\n }\n </tui-data-list>\n </tui-select>\n <tui-error\n formControlName=\"warehouseId\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u0410\u0434\u0440\u0435\u0441 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438. -->\n @if (isDelivery()) {\n @let addresses = addresses$ | async;\n <div>\n <label tuiLabel>\n \u0410\u0434\u0440\u0435\u0441 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\n <tui-select\n formControlName=\"addressId\"\n [valueContent]=\"addresses ? stringify(addresses) : selectLoading\"\n >\n \u0410\u0434\u0440\u0435\u0441 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\n <tui-data-list *tuiDataList>\n @for (address of addresses; track address.id) {\n <button\n tuiOption\n [value]=\"address.id\"\n >\n {{ address.address }}\n </button>\n }\n </tui-data-list>\n </tui-select>\n @if (addresses && addresses.length === 0) {\n <tui-error error=\"\u0423 \u043A\u043E\u043D\u0442\u0440\u0430\u0433\u0435\u043D\u0442\u0430 \u043D\u0435\u0442 \u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\" />\n }\n <tui-error\n formControlName=\"addressId\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n <a\n tuiLink\n iconStart=\"@tui.plus\"\n (click)=\"addDeliveryAddress()\"\n class=\"mt-2 block\"\n >\n \u041D\u043E\u0432\u044B\u0439\n </a>\n </div>\n }\n\n <!-- \u0414\u0430\u0442\u0430 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438/\u0441\u0430\u043C\u043E\u0432\u044B\u0432\u043E\u0437\u0430. -->\n <label tuiLabel>\n \u0416\u0435\u043B\u0430\u0435\u043C\u0430\u044F \u0434\u0430\u0442\u0430 {{ isDelivery() ? '\u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438' : '\u0441\u0430\u043C\u043E\u0432\u044B\u0432\u043E\u0437\u0430' }}\n <tui-input-date\n formControlName=\"deliveryDate\"\n [disabledItemHandler]=\"deliveryDateFilter\"\n [markerHandler]=\"deliveryDateMarker\"\n [max]=\"maxDeliveryDay()\"\n [min]=\"minDeliveryDay()\"\n >\n \u0416\u0435\u043B\u0430\u0435\u043C\u0430\u044F \u0434\u0430\u0442\u0430 {{ isDelivery() ? '\u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438' : '\u0441\u0430\u043C\u043E\u0432\u044B\u0432\u043E\u0437\u0430' }}\n </tui-input-date>\n <tui-error\n formControlName=\"deliveryDate\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043A\u043B\u0438\u0435\u043D\u0442\u0430. -->\n <label tuiLabel>\n \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043A\u043B\u0438\u0435\u043D\u0442\u0430 \u043A \u0437\u0430\u043A\u0430\u0437\u0443\n <tui-textarea\n formControlName=\"comment\"\n [expandable]=\"true\"\n [rows]=\"15\"\n >\n \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\n </tui-textarea>\n <tui-error\n formControlName=\"comment\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0435\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u0430 \u043A \u0437\u0430\u043A\u0430\u0437\u0443. -->\n <div>\n @if (!controlFile.value) {\n <label tuiInputFiles>\n <input\n accept=\"image/*\"\n tuiInputFiles\n [formControl]=\"controlFile\"\n />\n </label>\n }\n\n <tui-files class=\"tui-space_top-1\">\n @if (controlFile.value | tuiFileRejected: { accept: 'image/*' } | async; as file) {\n <tui-file\n state=\"error\"\n [file]=\"file\"\n (remove)=\"removeFile()\"\n />\n }\n\n @for (file of accepted$ | async; track file.name) {\n <tui-file\n [file]=\"file\"\n (remove)=\"removeFile()\"\n />\n }\n </tui-files>\n\n <tui-error\n [error]=\"['maxLength'] | tuiFieldError | async\"\n [formControl]=\"controlFile\"\n />\n <p class=\"tui-form__field-note\">\u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0444\u043E\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u044E \u043F\u043E\u0432\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439 \u0438 \u0434\u0435\u0444\u0444\u0435\u043A\u0442\u043E\u0432, \u0447\u0442\u043E \u043F\u043E\u0441\u043B\u0443\u0436\u0438\u0442 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u043E\u043C \u043D\u0435\u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044F \u0437\u0430\u044F\u0432\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u043E\u0432\u0430\u0440\u0430.</p>\n </div>\n</form>\n", styles: ["tui-calendar:has(.t-dots) .t-cell:has(.t-dots){opacity:1;font-weight:700;color:var(--tui-text-primary);border-radius:var(--tui-radius-m);box-shadow:inset 0 0 0 .125rem color-mix(in srgb,var(--tui-background-accent-1) 33%,transparent)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "directive", type: TuiLabel, selector: "label[tuiLabel]" }, { kind: "ngmodule", type: TuiSelectModule }, { kind: "component", type: i2.TuiSelectComponent, selector: "tui-select", inputs: ["stringify", "identityMatcher", "valueContent"] }, { kind: "directive", type: i2.TuiSelectDirective, selector: "tui-select" }, { kind: "component", type: i3.TuiDataListComponent, selector: "tui-data-list", inputs: ["emptyContent", "size"] }, { kind: "directive", type: i3.TuiDataListDirective, selector: "ng-template[tuiDataList]" }, { kind: "component", type: i3.TuiOption, selector: "button[tuiOption]:not([new]), a[tuiOption]:not([new]), label[tuiOption]:not([new])", inputs: ["disabled", "value"] }, { kind: "component", type: TuiError, selector: "tui-error", inputs: ["error"] }, { kind: "directive", type: TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "ngmodule", type: TuiInputDateModule }, { kind: "component", type: i2.TuiInputDateComponent, selector: "tui-input-date:not([multiple])", inputs: ["min", "max", "disabledItemHandler", "markerHandler", "items", "defaultActiveYearMonth"] }, { kind: "directive", type: i2.TuiInputDateDirective, selector: "tui-input-date:not([multiple])" }, { kind: "ngmodule", type: TuiTextareaModule }, { kind: "component", type: i2.TuiTextareaComponent, selector: "tui-textarea", inputs: ["rows", "maxLength", "expandable"] }, { kind: "directive", type: i2.TuiTextareaDirective, selector: "tui-textarea" }, { kind: "component", type: TuiInputFiles, selector: "label[tuiInputFiles]" }, { kind: "directive", type: TuiInputFilesDirective, selector: "input[tuiInputFiles]", outputs: ["reject"] }, { kind: "component", type: TuiFilesComponent, selector: "tui-files", inputs: ["max", "expanded"], outputs: ["expandedChange"] }, { kind: "component", type: TuiFile, selector: "tui-file,a[tuiFile],button[tuiFile]", inputs: ["file", "state", "size", "showDelete", "showSize", "leftContent"], outputs: ["remove"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TuiFieldErrorPipe, name: "tuiFieldError" }, { kind: "pipe", type: TuiFileRejectedPipe, name: "tuiFileRejected" }, { kind: "directive", type: ScFocusFirstInvalidFieldDirective, selector: "form[formGroup][scFocusFirstInvalidField]", inputs: ["fieldOrder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
537
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScOrderFormComponent, isStandalone: true, selector: "sc-order-form", inputs: { directionId: { classPropertyName: "directionId", publicName: "directionId", isSignal: true, isRequired: true, transformFunction: null }, enforceApprovedContacts: { classPropertyName: "enforceApprovedContacts", publicName: "enforceApprovedContacts", isSignal: true, isRequired: false, transformFunction: null }, persistMetadata: { classPropertyName: "persistMetadata", publicName: "persistMetadata", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { orderSubmit: "orderSubmit" }, providers: [TERMINAL_PROVIDERS], viewQueries: [{ propertyName: "unconfirmedDataWarning", first: true, predicate: ["unconfirmedDataWarning"], descendants: true, isSignal: true }], ngImport: i0, template: "@let user = user$ | async;\n\n<form\n [formGroup]=\"form\"\n scFocusFirstInvalidField\n [fieldOrder]=\"['contragentId', 'paymentType', 'deliveryType', 'warehouseId', 'addressId', 'deliveryDate', 'comment']\"\n (ngSubmit)=\"submit()\"\n class=\"flex flex-col gap-4\"\n>\n <ng-template #selectLoading> <tui-loader /> </ng-template>\n\n <!-- \u041A\u043E\u043D\u0442\u0440\u0430\u0433\u0435\u043D\u0442. -->\n @if (contragents$ | async; as contragents) {\n @if (contragents.length > 1 || user?.isOrg) {\n <div>\n <label tuiLabel>\n \u041A\u043E\u043D\u0442\u0440\u0430\u0433\u0435\u043D\u0442\n <tui-select\n formControlName=\"contragentId\"\n [valueContent]=\"contragents ? stringify(contragents) : selectLoading\"\n >\n \u041A\u043E\u043D\u0442\u0440\u0430\u0433\u0435\u043D\u0442\n <tui-data-list *tuiDataList>\n @for (contragent of contragents; track contragent.id) {\n <button\n tuiOption\n [value]=\"contragent.id\"\n >\n {{ contragent.name }}\n </button>\n }\n </tui-data-list>\n </tui-select>\n <tui-error\n formControlName=\"contragentId\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n <a\n tuiLink\n iconStart=\"@tui.plus\"\n (click)=\"addContragent()\"\n class=\"mt-2 block\"\n >\n \u041D\u043E\u0432\u044B\u0439\n </a>\n </div>\n }\n }\n\n <!-- \u0422\u0438\u043F \u043E\u043F\u043B\u0430\u0442\u044B. -->\n <label tuiLabel>\n \u0422\u0438\u043F \u043E\u043F\u043B\u0430\u0442\u044B\n @let paymentTypes = paymentTypes$ | async;\n <tui-select\n formControlName=\"paymentType\"\n [valueContent]=\"paymentTypes ? stringify(paymentTypes) : selectLoading\"\n >\n \u0422\u0438\u043F \u043E\u043F\u043B\u0430\u0442\u044B\n <tui-data-list *tuiDataList>\n @for (type of paymentTypes; track type.id) {\n <button\n tuiOption\n [value]=\"type.id\"\n >\n {{ type.name }}\n </button>\n }\n </tui-data-list>\n </tui-select>\n <tui-error\n formControlName=\"paymentType\"\n [error]=\"[] | tuiFieldError | async\"\n />\n @if (isCashPaymentSelected()) {\n <p class=\"text-xs text-tui-status-positive\">\u0417\u0430\u043A\u0430\u0437\u044B \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u044F\u0442\u0441\u044F \u043F\u043E \u043F\u0440\u0435\u0434\u043E\u043F\u043B\u0430\u0442\u0435</p>\n }\n </label>\n\n <!-- \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435 \u043E \u043D\u0435\u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043D\u043D\u044B\u0445 \u043A\u043E\u043D\u0442\u0430\u043A\u0442\u043D\u044B\u0445 \u0434\u0430\u043D\u043D\u044B\u0445. -->\n @if (!isPhoneApproved() || !isEmailApproved()) {\n <div\n #unconfirmedDataWarning\n class=\"text-tui-text-negative\"\n [class.warning-shake]=\"warningShake()\"\n >\n \u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435! \u0414\u043B\u044F \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F \u0437\u0430\u043A\u0430\u0437\u0430 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C\n @if (!isPhoneApproved()) {\n <span class=\"font-bold\"> \u043D\u043E\u043C\u0435\u0440 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 </span>\n }\n @if (!isPhoneApproved() && !isEmailApproved()) {\n <span> \u0438 </span>\n }\n @if (!isEmailApproved()) {\n <span class=\"font-bold\"> \u0430\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B </span>\n }\n <a\n tuiLink\n routerLink=\"/profile\"\n >\n \u0432 \u0432\u0430\u0448\u0435\u043C \u043F\u0440\u043E\u0444\u0438\u043B\u0435\n </a>\n </div>\n }\n\n <!-- \u0421\u043F\u043E\u0441\u043E\u0431 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438. -->\n <label tuiLabel>\n \u0421\u043F\u043E\u0441\u043E\u0431 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\n @let deliveryTypes = deliveryTypes$ | async;\n <tui-select\n formControlName=\"deliveryType\"\n [valueContent]=\"deliveryTypes ? stringify(deliveryTypes) : selectLoading\"\n >\n \u0421\u043F\u043E\u0441\u043E\u0431 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\n <tui-data-list *tuiDataList>\n @for (delivery of deliveryTypes; track delivery.id) {\n <button\n tuiOption\n [value]=\"delivery.id\"\n >\n {{ delivery.name }}\n </button>\n }\n </tui-data-list>\n </tui-select>\n <tui-error\n formControlName=\"deliveryType\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u0421\u043A\u043B\u0430\u0434. -->\n <label tuiLabel>\n \u0421\u043A\u043B\u0430\u0434\n @let warehouses = warehouses$ | async;\n <tui-select\n formControlName=\"warehouseId\"\n [valueContent]=\"warehouses ? stringify(warehouses) : selectLoading\"\n >\n \u0421\u043A\u043B\u0430\u0434\n <tui-data-list *tuiDataList>\n @if (!terminal.isRunningOnTerminal) {\n @for (warehouse of warehouses; track warehouse.id) {\n <button\n tuiOption\n [value]=\"warehouse.id\"\n >\n {{ warehouse.name }}\n </button>\n }\n } @else {\n @if (warehouseService.getCatalogWarehouseChange$() | async; as terminalWarehouse) {\n <button\n tuiOption\n [value]=\"terminalWarehouse.id\"\n >\n {{ terminalWarehouse.name }}\n </button>\n }\n }\n </tui-data-list>\n </tui-select>\n <tui-error\n formControlName=\"warehouseId\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u0410\u0434\u0440\u0435\u0441 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438. -->\n @if (isDelivery()) {\n @let addresses = addresses$ | async;\n <div>\n <label tuiLabel>\n \u0410\u0434\u0440\u0435\u0441 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\n <tui-select\n formControlName=\"addressId\"\n [valueContent]=\"addresses ? stringify(addresses) : selectLoading\"\n >\n \u0410\u0434\u0440\u0435\u0441 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\n <tui-data-list *tuiDataList>\n @for (address of addresses; track address.id) {\n <button\n tuiOption\n [value]=\"address.id\"\n >\n {{ address.address }}\n </button>\n }\n </tui-data-list>\n </tui-select>\n @if (addresses && addresses.length === 0) {\n <tui-error error=\"\u0423 \u043A\u043E\u043D\u0442\u0440\u0430\u0433\u0435\u043D\u0442\u0430 \u043D\u0435\u0442 \u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\" />\n }\n <tui-error\n formControlName=\"addressId\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n <a\n tuiLink\n iconStart=\"@tui.plus\"\n (click)=\"addDeliveryAddress()\"\n class=\"mt-2 block\"\n >\n \u041D\u043E\u0432\u044B\u0439\n </a>\n </div>\n }\n\n <!-- \u0414\u0430\u0442\u0430 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438/\u0441\u0430\u043C\u043E\u0432\u044B\u0432\u043E\u0437\u0430. -->\n <label tuiLabel>\n \u0416\u0435\u043B\u0430\u0435\u043C\u0430\u044F \u0434\u0430\u0442\u0430 {{ isDelivery() ? '\u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438' : '\u0441\u0430\u043C\u043E\u0432\u044B\u0432\u043E\u0437\u0430' }}\n <tui-input-date\n formControlName=\"deliveryDate\"\n [disabledItemHandler]=\"deliveryDateFilter\"\n [markerHandler]=\"deliveryDateMarker\"\n [max]=\"maxDeliveryDay()\"\n [min]=\"minDeliveryDay()\"\n >\n \u0416\u0435\u043B\u0430\u0435\u043C\u0430\u044F \u0434\u0430\u0442\u0430 {{ isDelivery() ? '\u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438' : '\u0441\u0430\u043C\u043E\u0432\u044B\u0432\u043E\u0437\u0430' }}\n </tui-input-date>\n <tui-error\n formControlName=\"deliveryDate\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043A\u043B\u0438\u0435\u043D\u0442\u0430. -->\n <label tuiLabel>\n \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043A\u043B\u0438\u0435\u043D\u0442\u0430 \u043A \u0437\u0430\u043A\u0430\u0437\u0443\n <tui-textarea\n formControlName=\"comment\"\n [expandable]=\"true\"\n [rows]=\"15\"\n >\n \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\n </tui-textarea>\n <tui-error\n formControlName=\"comment\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0435\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u0430 \u043A \u0437\u0430\u043A\u0430\u0437\u0443. -->\n <div>\n @if (!controlFile.value) {\n <label tuiInputFiles>\n <input\n accept=\"image/*\"\n tuiInputFiles\n [formControl]=\"controlFile\"\n />\n </label>\n }\n\n <tui-files class=\"tui-space_top-1\">\n @if (controlFile.value | tuiFileRejected: { accept: 'image/*' } | async; as file) {\n <tui-file\n state=\"error\"\n [file]=\"file\"\n (remove)=\"removeFile()\"\n />\n }\n\n @for (file of accepted$ | async; track file.name) {\n <tui-file\n [file]=\"file\"\n (remove)=\"removeFile()\"\n />\n }\n </tui-files>\n\n <tui-error\n [error]=\"['maxLength'] | tuiFieldError | async\"\n [formControl]=\"controlFile\"\n />\n <p class=\"tui-form__field-note\">\u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0444\u043E\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u044E \u043F\u043E\u0432\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439 \u0438 \u0434\u0435\u0444\u0444\u0435\u043A\u0442\u043E\u0432, \u0447\u0442\u043E \u043F\u043E\u0441\u043B\u0443\u0436\u0438\u0442 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u043E\u043C \u043D\u0435\u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044F \u0437\u0430\u044F\u0432\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u043E\u0432\u0430\u0440\u0430.</p>\n </div>\n</form>\n", styles: ["tui-calendar:has(.t-dots) .t-cell:has(.t-dots){opacity:1;font-weight:700;color:var(--tui-text-primary);border-radius:var(--tui-radius-m);box-shadow:inset 0 0 0 .125rem color-mix(in srgb,var(--tui-background-accent-1) 33%,transparent)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "directive", type: TuiLabel, selector: "label[tuiLabel]" }, { kind: "ngmodule", type: TuiSelectModule }, { kind: "component", type: i2.TuiSelectComponent, selector: "tui-select", inputs: ["stringify", "identityMatcher", "valueContent"] }, { kind: "directive", type: i2.TuiSelectDirective, selector: "tui-select" }, { kind: "component", type: i3.TuiDataListComponent, selector: "tui-data-list", inputs: ["emptyContent", "size"] }, { kind: "directive", type: i3.TuiDataListDirective, selector: "ng-template[tuiDataList]" }, { kind: "component", type: i3.TuiOption, selector: "button[tuiOption]:not([new]), a[tuiOption]:not([new]), label[tuiOption]:not([new])", inputs: ["disabled", "value"] }, { kind: "component", type: TuiError, selector: "tui-error", inputs: ["error"] }, { kind: "directive", type: TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "ngmodule", type: TuiInputDateModule }, { kind: "component", type: i2.TuiInputDateComponent, selector: "tui-input-date:not([multiple])", inputs: ["min", "max", "disabledItemHandler", "markerHandler", "items", "defaultActiveYearMonth"] }, { kind: "directive", type: i2.TuiInputDateDirective, selector: "tui-input-date:not([multiple])" }, { kind: "ngmodule", type: TuiTextareaModule }, { kind: "component", type: i2.TuiTextareaComponent, selector: "tui-textarea", inputs: ["rows", "maxLength", "expandable"] }, { kind: "directive", type: i2.TuiTextareaDirective, selector: "tui-textarea" }, { kind: "component", type: TuiInputFiles, selector: "label[tuiInputFiles]" }, { kind: "directive", type: TuiInputFilesDirective, selector: "input[tuiInputFiles]", outputs: ["reject"] }, { kind: "component", type: TuiFilesComponent, selector: "tui-files", inputs: ["max", "expanded"], outputs: ["expandedChange"] }, { kind: "component", type: TuiFile, selector: "tui-file,a[tuiFile],button[tuiFile]", inputs: ["file", "state", "size", "showDelete", "showSize", "leftContent"], outputs: ["remove"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TuiFieldErrorPipe, name: "tuiFieldError" }, { kind: "pipe", type: TuiFileRejectedPipe, name: "tuiFileRejected" }, { kind: "directive", type: ScFocusFirstInvalidFieldDirective, selector: "form[formGroup][scFocusFirstInvalidField]", inputs: ["fieldOrder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
526
538
  }
527
539
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScOrderFormComponent, decorators: [{
528
540
  type: Component,
@@ -550,4 +562,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
550
562
  ScFocusFirstInvalidFieldDirective,
551
563
  ], providers: [TERMINAL_PROVIDERS], template: "@let user = user$ | async;\n\n<form\n [formGroup]=\"form\"\n scFocusFirstInvalidField\n [fieldOrder]=\"['contragentId', 'paymentType', 'deliveryType', 'warehouseId', 'addressId', 'deliveryDate', 'comment']\"\n (ngSubmit)=\"submit()\"\n class=\"flex flex-col gap-4\"\n>\n <ng-template #selectLoading> <tui-loader /> </ng-template>\n\n <!-- \u041A\u043E\u043D\u0442\u0440\u0430\u0433\u0435\u043D\u0442. -->\n @if (contragents$ | async; as contragents) {\n @if (contragents.length > 1 || user?.isOrg) {\n <div>\n <label tuiLabel>\n \u041A\u043E\u043D\u0442\u0440\u0430\u0433\u0435\u043D\u0442\n <tui-select\n formControlName=\"contragentId\"\n [valueContent]=\"contragents ? stringify(contragents) : selectLoading\"\n >\n \u041A\u043E\u043D\u0442\u0440\u0430\u0433\u0435\u043D\u0442\n <tui-data-list *tuiDataList>\n @for (contragent of contragents; track contragent.id) {\n <button\n tuiOption\n [value]=\"contragent.id\"\n >\n {{ contragent.name }}\n </button>\n }\n </tui-data-list>\n </tui-select>\n <tui-error\n formControlName=\"contragentId\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n <a\n tuiLink\n iconStart=\"@tui.plus\"\n (click)=\"addContragent()\"\n class=\"mt-2 block\"\n >\n \u041D\u043E\u0432\u044B\u0439\n </a>\n </div>\n }\n }\n\n <!-- \u0422\u0438\u043F \u043E\u043F\u043B\u0430\u0442\u044B. -->\n <label tuiLabel>\n \u0422\u0438\u043F \u043E\u043F\u043B\u0430\u0442\u044B\n @let paymentTypes = paymentTypes$ | async;\n <tui-select\n formControlName=\"paymentType\"\n [valueContent]=\"paymentTypes ? stringify(paymentTypes) : selectLoading\"\n >\n \u0422\u0438\u043F \u043E\u043F\u043B\u0430\u0442\u044B\n <tui-data-list *tuiDataList>\n @for (type of paymentTypes; track type.id) {\n <button\n tuiOption\n [value]=\"type.id\"\n >\n {{ type.name }}\n </button>\n }\n </tui-data-list>\n </tui-select>\n <tui-error\n formControlName=\"paymentType\"\n [error]=\"[] | tuiFieldError | async\"\n />\n @if (isCashPaymentSelected()) {\n <p class=\"text-xs text-tui-status-positive\">\u0417\u0430\u043A\u0430\u0437\u044B \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u044F\u0442\u0441\u044F \u043F\u043E \u043F\u0440\u0435\u0434\u043E\u043F\u043B\u0430\u0442\u0435</p>\n }\n </label>\n\n <!-- \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435 \u043E \u043D\u0435\u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043D\u043D\u044B\u0445 \u043A\u043E\u043D\u0442\u0430\u043A\u0442\u043D\u044B\u0445 \u0434\u0430\u043D\u043D\u044B\u0445. -->\n @if (!isPhoneApproved() || !isEmailApproved()) {\n <div\n #unconfirmedDataWarning\n class=\"text-tui-text-negative\"\n [class.warning-shake]=\"warningShake()\"\n >\n \u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435! \u0414\u043B\u044F \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F \u0437\u0430\u043A\u0430\u0437\u0430 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C\n @if (!isPhoneApproved()) {\n <span class=\"font-bold\"> \u043D\u043E\u043C\u0435\u0440 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 </span>\n }\n @if (!isPhoneApproved() && !isEmailApproved()) {\n <span> \u0438 </span>\n }\n @if (!isEmailApproved()) {\n <span class=\"font-bold\"> \u0430\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B </span>\n }\n <a\n tuiLink\n routerLink=\"/profile\"\n >\n \u0432 \u0432\u0430\u0448\u0435\u043C \u043F\u0440\u043E\u0444\u0438\u043B\u0435\n </a>\n </div>\n }\n\n <!-- \u0421\u043F\u043E\u0441\u043E\u0431 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438. -->\n <label tuiLabel>\n \u0421\u043F\u043E\u0441\u043E\u0431 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\n @let deliveryTypes = deliveryTypes$ | async;\n <tui-select\n formControlName=\"deliveryType\"\n [valueContent]=\"deliveryTypes ? stringify(deliveryTypes) : selectLoading\"\n >\n \u0421\u043F\u043E\u0441\u043E\u0431 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\n <tui-data-list *tuiDataList>\n @for (delivery of deliveryTypes; track delivery.id) {\n <button\n tuiOption\n [value]=\"delivery.id\"\n >\n {{ delivery.name }}\n </button>\n }\n </tui-data-list>\n </tui-select>\n <tui-error\n formControlName=\"deliveryType\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u0421\u043A\u043B\u0430\u0434. -->\n <label tuiLabel>\n \u0421\u043A\u043B\u0430\u0434\n @let warehouses = warehouses$ | async;\n <tui-select\n formControlName=\"warehouseId\"\n [valueContent]=\"warehouses ? stringify(warehouses) : selectLoading\"\n >\n \u0421\u043A\u043B\u0430\u0434\n <tui-data-list *tuiDataList>\n @if (!terminal.isRunningOnTerminal) {\n @for (warehouse of warehouses; track warehouse.id) {\n <button\n tuiOption\n [value]=\"warehouse.id\"\n >\n {{ warehouse.name }}\n </button>\n }\n } @else {\n @if (warehouseService.getCatalogWarehouseChange$() | async; as terminalWarehouse) {\n <button\n tuiOption\n [value]=\"terminalWarehouse.id\"\n >\n {{ terminalWarehouse.name }}\n </button>\n }\n }\n </tui-data-list>\n </tui-select>\n <tui-error\n formControlName=\"warehouseId\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u0410\u0434\u0440\u0435\u0441 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438. -->\n @if (isDelivery()) {\n @let addresses = addresses$ | async;\n <div>\n <label tuiLabel>\n \u0410\u0434\u0440\u0435\u0441 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\n <tui-select\n formControlName=\"addressId\"\n [valueContent]=\"addresses ? stringify(addresses) : selectLoading\"\n >\n \u0410\u0434\u0440\u0435\u0441 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\n <tui-data-list *tuiDataList>\n @for (address of addresses; track address.id) {\n <button\n tuiOption\n [value]=\"address.id\"\n >\n {{ address.address }}\n </button>\n }\n </tui-data-list>\n </tui-select>\n @if (addresses && addresses.length === 0) {\n <tui-error error=\"\u0423 \u043A\u043E\u043D\u0442\u0440\u0430\u0433\u0435\u043D\u0442\u0430 \u043D\u0435\u0442 \u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438\" />\n }\n <tui-error\n formControlName=\"addressId\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n <a\n tuiLink\n iconStart=\"@tui.plus\"\n (click)=\"addDeliveryAddress()\"\n class=\"mt-2 block\"\n >\n \u041D\u043E\u0432\u044B\u0439\n </a>\n </div>\n }\n\n <!-- \u0414\u0430\u0442\u0430 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438/\u0441\u0430\u043C\u043E\u0432\u044B\u0432\u043E\u0437\u0430. -->\n <label tuiLabel>\n \u0416\u0435\u043B\u0430\u0435\u043C\u0430\u044F \u0434\u0430\u0442\u0430 {{ isDelivery() ? '\u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438' : '\u0441\u0430\u043C\u043E\u0432\u044B\u0432\u043E\u0437\u0430' }}\n <tui-input-date\n formControlName=\"deliveryDate\"\n [disabledItemHandler]=\"deliveryDateFilter\"\n [markerHandler]=\"deliveryDateMarker\"\n [max]=\"maxDeliveryDay()\"\n [min]=\"minDeliveryDay()\"\n >\n \u0416\u0435\u043B\u0430\u0435\u043C\u0430\u044F \u0434\u0430\u0442\u0430 {{ isDelivery() ? '\u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0438' : '\u0441\u0430\u043C\u043E\u0432\u044B\u0432\u043E\u0437\u0430' }}\n </tui-input-date>\n <tui-error\n formControlName=\"deliveryDate\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043A\u043B\u0438\u0435\u043D\u0442\u0430. -->\n <label tuiLabel>\n \u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043A\u043B\u0438\u0435\u043D\u0442\u0430 \u043A \u0437\u0430\u043A\u0430\u0437\u0443\n <tui-textarea\n formControlName=\"comment\"\n [expandable]=\"true\"\n [rows]=\"15\"\n >\n \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\n </tui-textarea>\n <tui-error\n formControlName=\"comment\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0435\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u0430 \u043A \u0437\u0430\u043A\u0430\u0437\u0443. -->\n <div>\n @if (!controlFile.value) {\n <label tuiInputFiles>\n <input\n accept=\"image/*\"\n tuiInputFiles\n [formControl]=\"controlFile\"\n />\n </label>\n }\n\n <tui-files class=\"tui-space_top-1\">\n @if (controlFile.value | tuiFileRejected: { accept: 'image/*' } | async; as file) {\n <tui-file\n state=\"error\"\n [file]=\"file\"\n (remove)=\"removeFile()\"\n />\n }\n\n @for (file of accepted$ | async; track file.name) {\n <tui-file\n [file]=\"file\"\n (remove)=\"removeFile()\"\n />\n }\n </tui-files>\n\n <tui-error\n [error]=\"['maxLength'] | tuiFieldError | async\"\n [formControl]=\"controlFile\"\n />\n <p class=\"tui-form__field-note\">\u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0444\u043E\u0442\u043E\u0433\u0440\u0430\u0444\u0438\u044E \u043F\u043E\u0432\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439 \u0438 \u0434\u0435\u0444\u0444\u0435\u043A\u0442\u043E\u0432, \u0447\u0442\u043E \u043F\u043E\u0441\u043B\u0443\u0436\u0438\u0442 \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u043E\u043C \u043D\u0435\u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044F \u0437\u0430\u044F\u0432\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u043E\u0432\u0430\u0440\u0430.</p>\n </div>\n</form>\n", styles: ["tui-calendar:has(.t-dots) .t-cell:has(.t-dots){opacity:1;font-weight:700;color:var(--tui-text-primary);border-radius:var(--tui-radius-m);box-shadow:inset 0 0 0 .125rem color-mix(in srgb,var(--tui-background-accent-1) 33%,transparent)}\n"] }]
552
564
  }], ctorParameters: () => [] });
553
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Mtb3JkZXItZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvb3JkZXIvb3JkZXItZm9ybS9zYy1vcmRlci1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9vcmRlci9vcmRlci1mb3JtL3NjLW9yZGVyLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNFZBQTRWO0FBRTVWLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsTCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUUsT0FBTyxFQUFtQixXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBb0IsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekksT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFDSCxzQkFBc0IsRUFDdEIsU0FBUyxFQUNULFlBQVksRUFFWixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLHdCQUF3QixFQUN4QixjQUFjLEVBT2QsU0FBUyxFQUNULGVBQWUsRUFDZixhQUFhLEVBQ2IsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxjQUFjLEVBRWQsa0JBQWtCLEVBQ2xCLGtCQUFrQixHQUNyQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBYyxlQUFlLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0Isa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBb0IsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0ksT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFBZSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekssT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFKLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDRFQUE0RSxDQUFDO0FBQzVILE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLDZGQUE2RixDQUFDO0FBQ2xKLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBRTVHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7OztBQVk5RDs7R0FFRztBQWlDSCxNQUFNLE9BQU8sb0JBQW9CO0lBbVU3Qjs7T0FFRztJQUNIO1FBclVBOztXQUVHO1FBQ2EsNEJBQXVCLEdBQUcsS0FBSyxDQUFVLElBQUksQ0FBQyxDQUFDO1FBRS9EOztXQUVHO1FBQ2EsZ0JBQVcsR0FBRyxNQUFNLEVBQWUsQ0FBQztRQUVwRDs7V0FFRztRQUNjLHNCQUFpQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRWpFOztXQUVHO1FBQ2Msc0JBQWlCLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFakU7O1dBRUc7UUFDYywyQkFBc0IsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUUzRTs7V0FFRztRQUNhLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRTlEOztXQUVHO1FBQ2Msa0JBQWEsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFekQ7O1dBRUc7UUFDYyxjQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWpEOztXQUVHO1FBQ2Msc0JBQWlCLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFakU7O1dBRUc7UUFDYyxXQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFbkQ7O1dBRUc7UUFDYSxhQUFRLEdBQUcsTUFBTSxDQUFzQixzQkFBc0IsQ0FBQyxDQUFDO1FBRS9FOztXQUVHO1FBQ2EsVUFBSyxHQUFHLE1BQU0sQ0FBcUIsWUFBWSxDQUFDLENBQUM7UUFFakU7O1dBRUc7UUFDYyxXQUFNLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFM0U7O1dBRUc7UUFDYyxhQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTlDOztXQUVHO1FBQ2MsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVqRDs7V0FFRztRQUNjLDJCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUU3Qzs7V0FFRztRQUNnQixTQUFJLEdBQUcsSUFBSSxTQUFTLENBQWdCO1lBQ25ELFlBQVksRUFBRSxJQUFJLFdBQVcsQ0FBZ0IsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDdkUsV0FBVyxFQUFFLElBQUksV0FBVyxDQUF1QixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDeEcsWUFBWSxFQUFFLElBQUksV0FBVyxDQUF3QixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDMUcsWUFBWSxFQUFFLElBQUksV0FBVyxDQUFnQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUMxRSxVQUFVLENBQUMsUUFBUTtnQkFDbkIsQ0FBQyxFQUFFLEtBQUssRUFBa0MsRUFBMkIsRUFBRTtvQkFDbkUsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUM5QyxPQUFPLElBQUksQ0FBQztvQkFDaEIsQ0FBQztvQkFDRCxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxpRUFBaUUsRUFBRSxDQUFDO29CQUNqRyxDQUFDO29CQUVELE9BQU8sSUFBSSxDQUFDO2dCQUNoQixDQUFDO2FBQ0osQ0FBQztZQUNGLFdBQVcsRUFBRSxJQUFJLFdBQVcsQ0FBZ0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ2pHLFNBQVMsRUFBRSxJQUFJLFdBQVcsQ0FBZ0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQy9GLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBZ0IsSUFBSSxDQUFDO1lBQzdDLEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBd0IsSUFBSSxDQUFDO1NBQ3RELENBQUMsQ0FBQztRQUVIOztXQUVHO1FBQ2dCLGdCQUFXLEdBQUcsSUFBSSxXQUFXLENBQWMsSUFBSSxDQUFDLENBQUM7UUFFcEU7O1dBRUc7UUFDZ0IsY0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVqSDs7V0FFRztRQUNnQixpQkFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVoRDs7V0FFRztRQUNnQixpQkFBWSxHQUFHLE1BQU0sQ0FBVSxJQUFJLENBQUMsQ0FBQztRQUV4RDs7V0FFRztRQUNjLDJCQUFzQixHQUFHLE1BQU0sQ0FBVyxFQUFFLENBQUMsQ0FBQztRQUUvRDs7V0FFRztRQUNjLHlCQUFvQixHQUFHLE1BQU0sQ0FBVyxFQUFFLENBQUMsQ0FBQztRQUU3RDs7V0FFRztRQUNnQixpQkFBWSxHQUFzQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDO1FBRXpHOztXQUVHO1FBQ2dCLGVBQVUsR0FBNEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDeEgsR0FBRyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtZQUN0QixJQUFJLGlCQUFpQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZKLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQ0wsQ0FBQztRQUVGOztXQUVHO1FBQ2dCLGdCQUFXLEdBQStCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUVwRzs7V0FFRztRQUNjLFNBQUksR0FBRyxlQUFlLENBQTRCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FDcEcsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUNwQixHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QyxDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUNsQixNQUFNLENBQUMsWUFBWSxDQUFDLEVBQ3BCLEdBQUcsQ0FBQyxDQUFDLFdBQTJCLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssa0JBQWtCLENBQUMsQ0FBQyxFQUM1RyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsRUFDcEMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDUixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxLQUFLLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDLENBQUMsQ0FDTCxDQUNKLEVBQ0QsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUNkLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDdEMsQ0FBQztRQUVGOztXQUVHO1FBQ2dCLGtCQUFhLEdBQStFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUN6SCxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQ3JHLFNBQVMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FDNUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUM5RCxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssaUJBQWlCLENBQUMsQ0FBQyxFQUNuRixHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUNqQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMvSCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDM0MsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FDTCxDQUNKLENBQ0osQ0FBQztRQUVGOztXQUVHO1FBQ2dCLG1CQUFjLEdBQWlGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUM1SCxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNkLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUN0QyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xELFNBQVMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQ3hCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQy9DLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FDdEIsR0FBRyxFQUFFLEVBQUUsS0FBSyxTQUFTLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3BGLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLGNBQWMsQ0FBQyxRQUFRLENBQUM7WUFDckUsQ0FBQyxDQUFDLGFBQWEsQ0FDdEIsQ0FDSixDQUNKLEVBQ0QsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDbEIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDcEksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzVDLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwRSxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQ0wsQ0FDSixDQUNKLENBQUM7UUFFRjs7V0FFRztRQUNnQiwwQkFBcUIsR0FBb0IsUUFBUSxDQUNoRSxlQUFlLENBQXVCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsS0FBSyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDbkksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQzFCLENBQUM7UUFFRjs7V0FFRztRQUNnQixvQkFBZSxHQUFvQixRQUFRLENBQzFELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNYLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQy9CLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQ2hELEVBQ0QsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQ3pCLENBQUM7UUFFRjs7V0FFRztRQUNjLHdCQUFtQixHQUFvQixRQUFRLENBQzVELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNYLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQy9CLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQ2hELEVBQ0QsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQ3pCLENBQUM7UUFFRjs7V0FFRztRQUNILCtEQUErRDtRQUM1QyxvQkFBZSxHQUFvQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFFeEg7O1dBRUc7UUFDYyxzQkFBaUIsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUF3QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRS9JOztXQUVHO1FBQ0gsK0RBQStEO1FBQzVDLGVBQVUsR0FBRyxRQUFRLENBQVUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTlHOztXQUVHO1FBQ0gsK0RBQStEO1FBQzVDLGtCQUFhLEdBQUcsUUFBUSxDQUFXLEdBQUcsRUFBRSxDQUN2RCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQzFILENBQUM7UUFFRjs7V0FFRztRQUNjLGlCQUFZLEdBQUcsUUFBUSxDQUFXLEdBQUcsRUFBRSxDQUNwRCxJQUFJLENBQUMsYUFBYSxFQUFFO2FBQ2YsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzlELElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3JGLENBQUM7UUFFRjs7V0FFRztRQUNnQixtQkFBYyxHQUFHLFFBQVEsQ0FBZ0IsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBRWxHOztXQUVHO1FBQ2dCLG1CQUFjLEdBQUcsUUFBUSxDQUFnQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7UUFFdEc7O1dBRUc7UUFDZ0IsMkJBQXNCLEdBQUcsU0FBUyxDQUEwQix3QkFBd0IsQ0FBQyxDQUFDO1FBRXpHOzs7O1dBSUc7UUFDZ0IsdUJBQWtCLEdBQXFCLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQztRQUV0Sjs7OztXQUlHO1FBQ2dCLHVCQUFrQixHQUFHLENBQUMsSUFBWSxFQUFXLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFNdkksNERBQTREO1FBQzVELElBQUksQ0FBQyxZQUFZO2FBQ1osSUFBSSxDQUNELE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBaUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFDakcsS0FBSyxFQUFFLEVBQ1AsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUM5RSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3RDO2FBQ0EsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBRVAsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxrQkFBa0I7SUFDWCxRQUFRO1FBQ1gsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0RBQWtEO0lBQzNDLFNBQVMsQ0FBQyxLQUE0QjtRQUN6QyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FDcEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2YsbUZBQW1GO1lBQ25GLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVoRixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQXFCLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQ0wsQ0FBQztRQUVGLE9BQU8sQ0FBQyxFQUFFLFNBQVMsRUFBc0IsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEYsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTTtRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUU3QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUUvRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUVqQyxPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFpQixDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxpQkFBaUIsQ0FBQyxLQUF3QjtRQUM3QyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUE0QixDQUFDO1FBRS9ELElBQUksTUFBTSxFQUFFLENBQUM7WUFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNoQyxJQUFJLEdBQUcsS0FBSyxjQUFjLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxJQUFJLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdEgsQ0FBQztxQkFBTSxDQUFDO29CQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxJQUFJLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDM0YsQ0FBQztnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7YUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsY0FBYyxFQUFFLElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxVQUFVO1FBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ08sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxNQUFNO2FBQ04sSUFBSSxDQUFDLElBQUkscUJBQXFCLENBQUMsbUNBQW1DLENBQUMsRUFBRTtZQUNsRSxJQUFJLEVBQUUsR0FBRztZQUNULEtBQUssRUFBRSw0QkFBNEI7U0FDdEMsQ0FBQzthQUNELFNBQVMsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLE1BQU07YUFDTixJQUFJLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFO1lBQzdELElBQUksRUFBRSxHQUFHO1lBQ1QsS0FBSyxFQUFFLHdCQUF3QjtTQUNsQyxDQUFDO2FBQ0QsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0sseUJBQXlCO1FBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLGFBQWEsQ0FBQztRQUU3RCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM1QixPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWTtRQUNoQixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBRXhCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNWLE9BQU87UUFDWCxDQUFDO1FBRUQsYUFBYSxDQUFDO1lBQ1YsYUFBYSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLEVBQUU7WUFDcEQsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekQsQ0FBQzthQUNHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbkQsd0RBQXdEO2FBQ3ZELFNBQVMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRTtZQUM3QixJQUFJLFlBQVksR0FDWixhQUFhLEVBQUUsWUFBWSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBRXRKLCtEQUErRDtZQUMvRCxpRkFBaUY7WUFDakYsSUFBSSxhQUFhLEVBQUUsWUFBWSxJQUFJLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNwSSxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVILENBQUM7WUFFRCxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztvQkFDakIsWUFBWSxFQUFFLGFBQWEsQ0FBQyxZQUFZO29CQUN4QyxXQUFXLEVBQUUsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSTtvQkFDMUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUk7b0JBQzVFLFlBQVksRUFBRSxhQUFhLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUk7b0JBQ3JILFNBQVMsRUFBRSxhQUFhLENBQUMsWUFBWSxLQUFLLGNBQWMsQ0FBQyxRQUFRLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSTtvQkFDN0gsV0FBVyxFQUFFLGFBQWEsQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSTtvQkFDakgsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPO2lCQUNqQyxDQUFDLENBQUM7WUFDUCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFUCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUN2SCxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQWMsUUFBdUIsQ0FBQyxDQUFDLENBQUM7UUFDaEgsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlO1FBQ25CLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjO1FBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN2RixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUN0QyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQkFBbUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFlBQVk7YUFDdEMsSUFBSSxDQUNELE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQywyQkFBMkIsRUFBRSxLQUFLLFdBQVcsQ0FBQyxFQUN6SCxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQ2Ysa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUN0QzthQUNBLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ2QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDLEVBQUcsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssdUJBQXVCO1FBQzNCLEtBQUssQ0FDRCxlQUFlLENBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FDN0QsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUNwQixZQUFZLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQ3pDLFNBQVMsQ0FBQyxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUN4RSxFQUNELGVBQWUsQ0FBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUMvRCxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQ3BCLFlBQVksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFDekMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEtBQUssY0FBYyxDQUFDLGFBQWEsQ0FBQyxFQUNwRixTQUFTLENBQUMsQ0FBQyxXQUFtQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FDOUUsQ0FDSjthQUNJLElBQUksQ0FDRCxVQUFVLENBQUMsQ0FBQyxLQUFjLEVBQUUsRUFBRTtZQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFMUMsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLEVBQ0YsS0FBSyxFQUFFLEVBQ1Asa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUN0QzthQUNBLFNBQVMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ3pCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUVoRSxJQUFJLGlCQUFpQixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM1QyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQ7O09BRUc7SUFDSyw2QkFBNkI7UUFDakMsS0FBSyxDQUNELGVBQWUsQ0FBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQ2hFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxLQUFLLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUM5STthQUNJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDekMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVsQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEtBQUssY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxnQkFBZ0I7cUJBQ2hCLHFCQUFxQixFQUFFO3FCQUN2QixJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUNuRCxvREFBb0Q7cUJBQ25ELFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO29CQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDNUQsQ0FBQyxDQUFDLENBQUM7WUFDWCxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxLQUFLLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDekUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxtQkFBbUIsQ0FBQyxTQUFpQjtRQUN6QyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUN4RCxVQUFVLENBQUMsQ0FBQyxLQUFjLEVBQUUsRUFBRTtZQUMxQixNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFFckYsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztnQkFDbkMsY0FBYyxFQUFFLE9BQU8sSUFBSSxrRkFBa0Y7YUFDaEgsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVsQyxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUNsQixJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxxQkFBcUIsQ0FBQyxXQUFtQjtRQUM3QyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUM5RCxVQUFVLENBQUMsQ0FBQyxLQUFjLEVBQUUsRUFBRTtZQUMxQixNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFFckYsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztnQkFDckMsY0FBYyxFQUFFLE9BQU8sSUFBSSxrRkFBa0Y7YUFDaEgsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVwQyxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUNsQixJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsa0RBQWtEO0lBQzFDLFlBQVksQ0FBQyxJQUFpQixFQUFFLFlBQWdEO1FBQ3BGLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFFaEMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFDakMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQztZQUUxQixJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNuQixZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNqRSxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsYUFBYSxDQUFDLElBQXVCLENBQUMsQ0FBQztJQUNsRCxDQUFDOytHQWhxQlEsb0JBQW9CO21HQUFwQixvQkFBb0IsK1JBRmxCLENBQUMsa0JBQWtCLENBQUMsNEtDNUZuQyxtalpBdVJBLHFTRGpOUSxXQUFXLDJwQkFDWCxtQkFBbUIsbWdCQUNuQixVQUFVLG9PQUNWLFNBQVMsaUlBQ1QsUUFBUSwyREFDUixlQUFlLDBtQkFJZixRQUFRLHlFQUNSLE9BQU8sMkZBQ1Asa0JBQWtCLHVVQUNsQixpQkFBaUIsNE9BQ2pCLGFBQWEsaUVBQ2Isc0JBQXNCLHNGQUN0QixpQkFBaUIsZ0hBQ2pCLE9BQU8sNEtBQ1AsU0FBUyx5Q0FDVCxpQkFBaUIsaURBQ2pCLG1CQUFtQix3REFDbkIsaUNBQWlDOzs0RkFJNUIsb0JBQW9CO2tCQWhDaEMsU0FBUztpQ0FDTSxJQUFJLFlBQ04sZUFBZSxpQkFHVixpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNMLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixVQUFVO3dCQUNWLFNBQVM7d0JBQ1QsUUFBUTt3QkFDUixlQUFlO3dCQUNmLG9CQUFvQjt3QkFDcEIsb0JBQW9CO3dCQUNwQixTQUFTO3dCQUNULFFBQVE7d0JBQ1IsT0FBTzt3QkFDUCxrQkFBa0I7d0JBQ2xCLGlCQUFpQjt3QkFDakIsYUFBYTt3QkFDYixzQkFBc0I7d0JBQ3RCLGlCQUFpQjt3QkFDakIsT0FBTzt3QkFDUCxTQUFTO3dCQUNULGlCQUFpQjt3QkFDakIsbUJBQW1CO3dCQUNuQixpQ0FBaUM7cUJBQ3BDLGFBQ1UsQ0FBQyxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb24scnhqcy9uby1zaGFyZXJlcGxheSxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbixAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2QsQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50LEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGwsQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudCxzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvbiAqL1xuXG5pbXBvcnQgeyBBc3luY1BpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgRGVzdHJveVJlZiwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgT25Jbml0LCBvdXRwdXQsIFNpZ25hbCwgc2lnbmFsLCB2aWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgICBJU19SVU5OSU5HX09OX1RFUk1JTkFMLFxuICAgIElTX1NFUlZFUixcbiAgICBTQ19VU0VSX0lORk8sXG4gICAgU2NDb250cmFnZW50LFxuICAgIFNjQ29udHJhZ2VudFNlcnZpY2UsXG4gICAgU2NDb252ZXJ0ZXJzU2VydmljZSxcbiAgICBTY0RlbGl2ZXJ5QWRkcmVzc1NlcnZpY2UsXG4gICAgU2NEZWxpdmVyeVR5cGUsXG4gICAgU2NJQXBpRXJyb3JSZXNwb25zZSxcbiAgICBTY0lEZWxpdmVyeUFkZHJlc3MsXG4gICAgU2NJTmV3T3JkZXIsXG4gICAgU2NJUmVmZXJlbmNlc1R5cGVzLFxuICAgIFNjSVRlcm1pbmFsUHJvdmlkZXIsXG4gICAgU2NJV2FyZWhvdXNlLFxuICAgIFNjT3BmTGlzdCxcbiAgICBTY09yZGVyc1NlcnZpY2UsXG4gICAgU2NQYXltZW50VHlwZSxcbiAgICBTY1JlZmVyZW5jZXNTZXJ2aWNlLFxuICAgIFNjVUlTZXJ2aWNlLFxuICAgIFNjVXBsb2FkZWRGaWxlLFxuICAgIFNjVXNlcixcbiAgICBTY1dhcmVob3VzZVNlcnZpY2UsXG4gICAgVEVSTUlOQUxfUFJPVklERVJTLFxufSBmcm9tICdAc25hYmNlbnRyL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IFR1aUNvbnRleHQsIHR1aUNvbnRyb2xWYWx1ZSwgVHVpRGF5LCB0dWlJc1ByZXNlbnQsIFR1aVN0cmluZ0hhbmRsZXIsIFR1aVZhbGlkYXRpb25FcnJvciB9IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHsgVHVpRGF0YUxpc3RDb21wb25lbnQsIFR1aURpYWxvZ1NlcnZpY2UsIFR1aUVycm9yLCBUdWlMYWJlbCwgVHVpTGluaywgVHVpTG9hZGVyLCBUdWlNYXJrZXJIYW5kbGVyLCBUdWlPcHRpb24gfSBmcm9tICdAdGFpZ2EtdWkvY29yZSc7XG5pbXBvcnQgeyBUdWlEYXRhTGlzdERpcmVjdGl2ZSB9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvZGF0YS1saXN0JztcbmltcG9ydCB7IFR1aUZpZWxkRXJyb3JQaXBlLCBUdWlGaWxlLCBUdWlGaWxlTGlrZSwgVHVpRmlsZVJlamVjdGVkUGlwZSwgdHVpRmlsZXNBY2NlcHRlZCwgVHVpRmlsZXNDb21wb25lbnQsIFR1aUlucHV0RmlsZXMsIFR1aUlucHV0RmlsZXNEaXJlY3RpdmUgfSBmcm9tICdAdGFpZ2EtdWkva2l0JztcbmltcG9ydCB7IFR1aUlucHV0RGF0ZU1vZHVsZSwgVHVpU2VsZWN0TW9kdWxlLCBUdWlUZXh0YXJlYU1vZHVsZSB9IGZyb20gJ0B0YWlnYS11aS9sZWdhY3knO1xuaW1wb3J0IHsgUG9seW1vcnBoZXVzQ29tcG9uZW50IH0gZnJvbSAnQHRhaWdhLXVpL3BvbHltb3JwaGV1cyc7XG5pbXBvcnQgeyBmb3JtYXQsIGlzVmFsaWQsIHBhcnNlIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNTdHJpbmcgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgY29tYmluZUxhdGVzdCwgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGZpcnN0LCBtYXAsIG1lcmdlLCBPYnNlcnZhYmxlLCBvZiwgcmV0cnksIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRhcCwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTY0FkZENvbnRyYWdlbnREaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb250cmFnZW50cy9hZGQtY29udHJhZ2VudC1kaWFsb2cvc2MtYWRkLWNvbnRyYWdlbnQtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTY0FkZERlbGl2ZXJ5QWRkcmVzc0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2RlbGl2ZXJ5LWFkZHJlc3MvYWRkLWRlbGl2ZXJ5LWFkZHJlc3MtZGlhbG9nL3NjLWFkZC1kZWxpdmVyeS1hZGRyZXNzLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2NGb2N1c0ZpcnN0SW52YWxpZEZpZWxkRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9zYy1mb2N1cy1maXJzdC1pbnZhbGlkLWZpZWxkLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJTmV3T3JkZXJGb3JtIH0gZnJvbSAnLi4vbW9kZWxzL2ktbmV3LW9yZGVyLWZvcm0nO1xuaW1wb3J0IHsgU0NfT1JERVJfRk9STV9DT05GSUcgfSBmcm9tICcuL3NjLW9yZGVyLWZvcm0uY29uZmlnJztcblxuLyoqXG4gKiDQotC40L/Riywg0LrQvtGC0L7RgNGL0LUg0LLQvtC30LzQvtC20L3QviDQv9GA0LXQvtCx0YDQsNC30L7QstCw0YLRjCDQsiDQt9C90LDRh9C10L3QuNC1LCDQvtGC0L7QsdGA0LDQttCw0LXQvNC+0LUg0LIg0L/QvtC70LUg0LLQstC+0LTQsC5cbiAqL1xudHlwZSBTZWxlY3RUeXBlID1cbiAgICB8IFNjSVJlZmVyZW5jZXNUeXBlczxTY1BheW1lbnRUeXBlLCB0eXBlb2YgU2NQYXltZW50VHlwZT5cbiAgICB8IFNjQ29udHJhZ2VudFxuICAgIHwgU2NJUmVmZXJlbmNlc1R5cGVzPFNjRGVsaXZlcnlUeXBlLCB0eXBlb2YgU2NEZWxpdmVyeVR5cGU+XG4gICAgfCBTY0lXYXJlaG91c2VcbiAgICB8IFNjSURlbGl2ZXJ5QWRkcmVzcztcblxuLyoqXG4gKiDQpNC+0YDQvNCwINC+0YTQvtGA0LzQu9C10L3QuNGPINC30LDQutCw0LfQsC5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3NjLW9yZGVyLWZvcm0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zYy1vcmRlci1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zYy1vcmRlci1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBSb3V0ZXJMaW5rLFxuICAgICAgICBUdWlMb2FkZXIsXG4gICAgICAgIFR1aUxhYmVsLFxuICAgICAgICBUdWlTZWxlY3RNb2R1bGUsXG4gICAgICAgIFR1aURhdGFMaXN0RGlyZWN0aXZlLFxuICAgICAgICBUdWlEYXRhTGlzdENvbXBvbmVudCxcbiAgICAgICAgVHVpT3B0aW9uLFxuICAgICAgICBUdWlFcnJvcixcbiAgICAgICAgVHVpTGluayxcbiAgICAgICAgVHVpSW5wdXREYXRlTW9kdWxlLFxuICAgICAgICBUdWlUZXh0YXJlYU1vZHVsZSxcbiAgICAgICAgVHVpSW5wdXRGaWxlcyxcbiAgICAgICAgVHVpSW5wdXRGaWxlc0RpcmVjdGl2ZSxcbiAgICAgICAgVHVpRmlsZXNDb21wb25lbnQsXG4gICAgICAgIFR1aUZpbGUsXG4gICAgICAgIEFzeW5jUGlwZSxcbiAgICAgICAgVHVpRmllbGRFcnJvclBpcGUsXG4gICAgICAgIFR1aUZpbGVSZWplY3RlZFBpcGUsXG4gICAgICAgIFNjRm9jdXNGaXJzdEludmFsaWRGaWVsZERpcmVjdGl2ZSxcbiAgICBdLFxuICAgIHByb3ZpZGVyczogW1RFUk1JTkFMX1BST1ZJREVSU10sXG59KVxuZXhwb3J0IGNsYXNzIFNjT3JkZXJGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICAvKipcbiAgICAgKiDQotGA0LXQsdC+0LLQsNGC0Ywg0L/QvtC00YLQstC10YDQttC00ZHQvdC90YvQtSDQutC+0L3RgtCw0LrRgtC90YvQtSDQtNCw0L3QvdGL0LUg0LTQu9GPINC+0YTQvtGA0LzQu9C10L3QuNGPLiDQlNC70Y8g0YfQtdGA0L3QvtCy0LjQutCwIOKAlCBgZmFsc2VgLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBlbmZvcmNlQXBwcm92ZWRDb250YWN0cyA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICog0KHQvtCx0YvRgtC40LUg0L7RgtC/0YDQsNCy0LrQuCDQstCw0LvQuNC00L3QvtC5INGE0L7RgNC80Ysg0L7RhNC+0YDQvNC70LXQvdC40Y8uINCf0L7Qu9C10LfQvdCw0Y8g0L3QsNCz0YDRg9C30LrQsCDigJQg0YHRi9GA0YvQtSDQt9C90LDRh9C10L3QuNGPINGE0L7RgNC80YsuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IG9yZGVyU3VibWl0ID0gb3V0cHV0PFNjSU5ld09yZGVyPigpO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINGB0L/RgNCw0LLQvtGH0L3QuNC60L7Qsi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZmVyZW5jZXNTZXJ2aWNlID0gaW5qZWN0KFNjUmVmZXJlbmNlc1NlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINGA0LDQsdC+0YLRiyDRgSDQutC+0L3RgtGA0LDQs9C10L3RgtCw0LzQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyYWdlbnRTZXJ2aWNlID0gaW5qZWN0KFNjQ29udHJhZ2VudFNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINGA0LDQsdC+0YLRiyDRgSDQsNC00YDQtdGB0LDQvNC4INC00L7RgdGC0LDQstC60LguXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWxpdmVyeUFkZHJlc3NTZXJ2aWNlID0gaW5qZWN0KFNjRGVsaXZlcnlBZGRyZXNzU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0LTQu9GPINGA0LDQsdC+0YLRiyDRgdC+INGB0LrQu9Cw0LTQsNC80LguXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHdhcmVob3VzZVNlcnZpY2UgPSBpbmplY3QoU2NXYXJlaG91c2VTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQtNC70Y8g0YDQsNCx0L7RgtGLINGBINC30LDQutCw0LfQsNC80LggKNC30LDQs9GA0YPQt9C60LAg0LTQsNGCINC00L7RgdGC0LDQstC60Lgv0YHQsNC80L7QstGL0LLQvtC30LApLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3JkZXJzU2VydmljZSA9IGluamVjdChTY09yZGVyc1NlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINC00LvRjyDRgNCw0LHQvtGC0Ysg0YEgVUkuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSB1aVNlcnZpY2UgPSBpbmplY3QoU2NVSVNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINC60L7QvdCy0LXRgNGC0LDRhtC40Lgg0LTQsNC90L3Ri9GFLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udmVydGVyc1NlcnZpY2UgPSBpbmplY3QoU2NDb252ZXJ0ZXJzU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0YDQsNCx0L7RgtGLINGBINC00LjQsNC70L7Qs9C+0LLRi9C8INC+0LrQvdC+0LwuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBkaWFsb2cgPSBpbmplY3QoVHVpRGlhbG9nU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0L7QstCw0LnQtNC10YAg0LTQsNC90L3Ri9GFINC+INGC0LXRgNC80LjQvdCw0LvQtS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgdGVybWluYWwgPSBpbmplY3Q8U2NJVGVybWluYWxQcm92aWRlcj4oSVNfUlVOTklOR19PTl9URVJNSU5BTCk7XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0YLQvtC6INC00LDQvdC90YvRhSDQviDRgtC10LrRg9GJ0LXQvCDQv9C+0LvRjNC30L7QstCw0YLQtdC70LUuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHVzZXIkID0gaW5qZWN0PE9ic2VydmFibGU8U2NVc2VyPj4oU0NfVVNFUl9JTkZPKTtcblxuICAgIC8qKlxuICAgICAqINCd0LDRgdGC0YDQvtC50LrQuCDRhNC+0YDQvNGLINC+0YTQvtGA0LzQu9C10L3QuNGPINC30LDQutCw0LfQsC4g0JXRgdC70Lgg0L3QtSDQv9GA0LXQtNC+0YHRgtCw0LLQu9C10L3Riywg0LzQtdGC0LDQtNCw0L3QvdGL0LUg0YTQvtGA0LzRiyDQvdC1INGB0L7RhdGA0LDQvdGP0Y7RgtGB0Y8uXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWcgPSBpbmplY3QoU0NfT1JERVJfRk9STV9DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiDQstGL0L/QvtC70L3QtdC90LjRjyDRgdC60YDQuNC/0YLQsCDQvdCwINGB0LXRgNCy0LXRgNC1LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaXNTZXJ2ZXIgPSBpbmplY3QoSVNfU0VSVkVSKTtcblxuICAgIC8qKlxuICAgICAqINCh0YHRi9C70LrQsCDQtNC70Y8g0LDQstGC0L7QvNCw0YLQuNGH0LXRgdC60L7Qs9C+INGD0L/RgNCw0LLQu9C10L3QuNGPINGD0L3QuNGH0YLQvtC20LXQvdC40LXQvCDQt9Cw0LLQuNGB0LjQvNC+0YHRgtC10LkuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgLyoqXG4gICAgICog0JfQsNC00LXRgNC20LrQsCDRgdGH0LjRgtGL0LLQsNC90LjRjyDRgdC40LPQvdCw0LvQvtCyINGE0L7RgNC80YssINC00LvRjyDQuNC30LHQtdC20LDQvdC40Y8g0LvQuNGI0L3QuNGFINC+0LHRgNCw0LHQvtGC0L7QuiDQv9GA0Lgg0YHQvNC10L3QtSDQt9C90LDRh9C10L3QuNC5LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVib3VuY2VUaW1lRm9ybUNoYW5nZSA9IDUwO1xuXG4gICAgLyoqXG4gICAgICog0KTQvtGA0LzQsCDRgdC+0LfQtNCw0L3QuNGPINC30LDQutCw0LfQsC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZm9ybSA9IG5ldyBGb3JtR3JvdXA8SU5ld09yZGVyRm9ybT4oe1xuICAgICAgICBjb250cmFnZW50SWQ6IG5ldyBGb3JtQ29udHJvbDxudW1iZXIgfCBudWxsPihudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgICAgcGF5bWVudFR5cGU6IG5ldyBGb3JtQ29udHJvbDxTY1BheW1lbnRUeXBlIHwgbnVsbD4oeyB2YWx1ZTogbnVsbCwgZGlzYWJsZWQ6IHRydWUgfSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICAgIGRlbGl2ZXJ5VHlwZTogbmV3IEZvcm1Db250cm9sPFNjRGVsaXZlcnlUeXBlIHwgbnVsbD4oeyB2YWx1ZTogbnVsbCwgZGlzYWJsZWQ6IHRydWUgfSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICAgIGRlbGl2ZXJ5RGF0ZTogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KHsgdmFsdWU6IG51bGwsIGRpc2FibGVkOiB0cnVlIH0sIFtcbiAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgICAgICAoeyB2YWx1ZSB9OiBBYnN0cmFjdENvbnRyb2w8c3RyaW5nIHwgbnVsbD4pOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSB8fCB0aGlzLmRlbGl2ZXJ5RGF0ZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiAhdGhpcy5kZWxpdmVyeURhdGVzKCkuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNlcnZlclJlc3BvbnNlOiAn0KPQutCw0LbQuNGC0LUg0LrQvtGA0YDQtdC60YLQvdGD0Y4g0LTQsNGC0YMsINC40LvQuCDQstGL0LHQtdGA0LjRgtC1INC40Lcg0LDQutGC0LjQstC90YvRhSDQtNCw0YIg0LrQsNC70LXQvdC00LDRgNGPJyB9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSksXG4gICAgICAgIHdhcmVob3VzZUlkOiBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyIHwgbnVsbD4oeyB2YWx1ZTogbnVsbCwgZGlzYWJsZWQ6IHRydWUgfSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICAgIGFkZHJlc3NJZDogbmV3IEZvcm1Db250cm9sPG51bWJlciB8IG51bGw+KHsgdmFsdWU6IG51bGwsIGRpc2FibGVkOiB0cnVlIH0sIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgICBjb21tZW50OiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCksXG4gICAgICAgIGltYWdlOiBuZXcgRm9ybUNvbnRyb2w8U2NVcGxvYWRlZEZpbGUgfCBudWxsPihudWxsKSxcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqINCf0L7Qu9C1INGE0LDQudC70LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbnRyb2xGaWxlID0gbmV3IEZvcm1Db250cm9sPEZpbGUgfCBudWxsPihudWxsKTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDRgdC/0LjRgdC60LAg0L/QvtC00YLQstC10YDQttC00ZHQvdC90YvRhSDRhNCw0LnQu9C+0LIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFjY2VwdGVkJCA9IHRoaXMuY29udHJvbEZpbGUudmFsdWVDaGFuZ2VzLnBpcGUobWFwKCgpID0+IHR1aUZpbGVzQWNjZXB0ZWQodGhpcy5jb250cm9sRmlsZSkpKTtcblxuICAgIC8qKlxuICAgICAqINCf0YDQuNC30L3QsNC6LCDRh9GC0L4g0LLQutC70Y7Rh9GR0L0g0YDQtdC20LjQvCDQsNC90LjQvNCw0YbQuNC4INC/0YDQtdC00YPQv9GA0LXQttC00LXQvdC40Y8g0L4g0L3QtdC/0L7QtNGC0LLQtdGA0LbQtNGR0L3QvdGL0YUg0LTQsNC90L3Ri9GFLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSB3YXJuaW5nU2hha2UgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0LosINGH0YLQviDQutC+0L3RgtGA0LDQs9C10L3RgiDRj9Cy0LvRj9C10YLRgdGPINGE0LjQt9C40YfQtdGB0LrQuNC8INC70LjRhtC+0LwuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzSW5kaXZpZHVhbCA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKlxuICAgICAqINCh0L/QuNGB0L7QuiDQstC+0LfQvNC+0LbQvdGL0YUg0LTQsNGCINGB0LDQvNC+0LLRi9Cy0L7Qt9CwINGB0L4g0YHQutC70LDQtNCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgd2FyZWhvdXNlRGVsaXZlcnlEYXRlcyA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xuXG4gICAgLyoqXG4gICAgICog0KHQv9C40YHQvtC6INCy0L7Qt9C80L7QttC90YvRhSDQtNCw0YIg0LTQvtGB0YLQsNCy0LrQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGFkZHJlc3NEZWxpdmVyeURhdGVzID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0YHQv9C40YHQutCwINC60L7QvdGC0YDQsNCz0LXQvdGC0L7QsiDQv9C+0LvRjNC30L7QstCw0YLQtdC70Y8uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbnRyYWdlbnRzJDogT2JzZXJ2YWJsZTxTY0NvbnRyYWdlbnRbXSB8IG51bGw+ID0gdGhpcy5jb250cmFnZW50U2VydmljZS5jb250cmFnZW50cyQ7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0YHQv9C40YHQutCwINCw0LTRgNC10YHQvtCyINC60L7QvdGC0YDQsNCz0LXQvdGC0LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFkZHJlc3NlcyQ6IE9ic2VydmFibGU8U2NJRGVsaXZlcnlBZGRyZXNzW10gfCBudWxsPiA9IHRoaXMuZGVsaXZlcnlBZGRyZXNzU2VydmljZS5kZWxpdmVyeUFkZHJlc3NlcyQucGlwZShcbiAgICAgICAgdGFwKChkZWxpdmVyeUFkZHJlc3NlcykgPT4ge1xuICAgICAgICAgICAgaWYgKGRlbGl2ZXJ5QWRkcmVzc2VzICYmIHRoaXMuZm9ybS5jb250cm9scy5hZGRyZXNzSWQudmFsdWUgJiYgIWRlbGl2ZXJ5QWRkcmVzc2VzLnNvbWUoKGRlbGl2ZXJ5KSA9PiBkZWxpdmVyeS5pZCA9PT0gdGhpcy5mb3JtLmNvbnRyb2xzLmFkZHJlc3NJZC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuYWRkcmVzc0lkLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDRgdC/0LjRgdC60LAg0YHQutC70LDQtNC+0LIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHdhcmVob3VzZXMkOiBPYnNlcnZhYmxlPFNjSVdhcmVob3VzZVtdPiA9IHRoaXMud2FyZWhvdXNlU2VydmljZS5nZXRXYXJlaG91c2VzJCgpO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INCe0J/QpCDQstGL0LHRgNCw0L3QvdC+0LPQviDQutC+0L3RgtGA0LDQs9C10L3RgtCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3BmJCA9IHR1aUNvbnRyb2xWYWx1ZTxudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkPih0aGlzLmZvcm0uY29udHJvbHMuY29udHJhZ2VudElkKS5waXBlKFxuICAgICAgICBmaWx0ZXIodHVpSXNQcmVzZW50KSxcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5wYXltZW50VHlwZS5lbmFibGUoKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5kZWxpdmVyeVR5cGUuZW5hYmxlKCk7XG4gICAgICAgIH0pLFxuICAgICAgICBzd2l0Y2hNYXAoKHNlbGVjdENvbnRyYWdlbnRJZCkgPT5cbiAgICAgICAgICAgIHRoaXMuY29udHJhZ2VudHMkLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKHR1aUlzUHJlc2VudCksXG4gICAgICAgICAgICAgICAgbWFwKChjb250cmFnZW50czogU2NDb250cmFnZW50W10pID0+IGNvbnRyYWdlbnRzLmZpbmQoKGNvbnRyYWdlbnQpID0+IGNvbnRyYWdlbnQuaWQgPT09IHNlbGVjdENvbnRyYWdlbnRJZCkpLFxuICAgICAgICAgICAgICAgIG1hcCgoY29udHJhZ2VudCkgPT4gY29udHJhZ2VudD8ub3BmKSxcbiAgICAgICAgICAgICAgICB0YXAoKG9wZikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzSW5kaXZpZHVhbC5zZXQob3BmPy5pZCA9PT0gU2NPcGZMaXN0LmluZGl2aWR1YWwudmFsdWVPZigpKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBzaGFyZVJlcGxheSgxKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INGC0LjQv9C+0LIg0L7Qv9C70LDRgtGLINC30LDQutCw0LfQsC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGF5bWVudFR5cGVzJDogT2JzZXJ2YWJsZTxBcnJheTxTY0lSZWZlcmVuY2VzVHlwZXM8U2NQYXltZW50VHlwZSwgdHlwZW9mIFNjUGF5bWVudFR5cGU+Pj4gPSB0aGlzLm9wZiQucGlwZShcbiAgICAgICAgbWFwKChvcGYpID0+IG9wZiAmJiAob3BmLmlkID09PSBTY09wZkxpc3QuaW5kaXZpZHVhbCA/IFNjUGF5bWVudFR5cGUuYmV6bmFsMiA6IFNjUGF5bWVudFR5cGUub25saW5lKSksXG4gICAgICAgIHN3aXRjaE1hcCgocGF5bWVudFR5cGVGaWx0ZXIpID0+XG4gICAgICAgICAgICB0aGlzLnJlZmVyZW5jZXNTZXJ2aWNlLnBheW1lbnRUeXBlcyQucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHBheW1lbnRUeXBlcykgPT4gKHBheW1lbnRUeXBlRmlsdGVyID8gcGF5bWVudFR5cGVzIDogW10pKSxcbiAgICAgICAgICAgICAgICBtYXAoKHBheW1lbnRUeXBlcykgPT4gcGF5bWVudFR5cGVzLmZpbHRlcigodHlwZSkgPT4gdHlwZS5pZCAhPT0gcGF5bWVudFR5cGVGaWx0ZXIpKSxcbiAgICAgICAgICAgICAgICB0YXAoKHBheW1lbnRUeXBlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtLmNvbnRyb2xzLnBheW1lbnRUeXBlLnZhbHVlICYmICFwYXltZW50VHlwZXMuc29tZSgocGF5bWVudCkgPT4gcGF5bWVudC5pZCA9PT0gdGhpcy5mb3JtLmNvbnRyb2xzLnBheW1lbnRUeXBlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLnBheW1lbnRUeXBlLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmZvcm0uY29udHJvbHMucGF5bWVudFR5cGUudmFsdWUgJiYgcGF5bWVudFR5cGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLnBheW1lbnRUeXBlLnBhdGNoVmFsdWUocGF5bWVudFR5cGVzWzBdLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INGC0LjQv9C+0LIg0LTQvtGB0YLQsNCy0LrQuCDQt9Cw0LrQsNC30LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlbGl2ZXJ5VHlwZXMkOiBPYnNlcnZhYmxlPEFycmF5PFNjSVJlZmVyZW5jZXNUeXBlczxTY0RlbGl2ZXJ5VHlwZSwgdHlwZW9mIFNjRGVsaXZlcnlUeXBlPj4+ID0gdGhpcy5vcGYkLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgob3BmKSA9PlxuICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VzU2VydmljZS5kZWxpdmVyeVR5cGVzJC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgoZGVsaXZlcnlUeXBlcykgPT4gKG9wZiA/IGRlbGl2ZXJ5VHlwZXMgOiBbXSkpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoZGVsaXZlcnlUeXBlcykgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxpdmVyeUFkZHJlc3NTZXJ2aWNlLmRlbGl2ZXJ5QWRkcmVzc2VzJC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwKChkZWxpdmVyeUFkZHJlc3NlcykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGY/LmlkID09PSBTY09wZkxpc3QuaW5kaXZpZHVhbCAmJiAhKGRlbGl2ZXJ5QWRkcmVzc2VzICYmIGRlbGl2ZXJ5QWRkcmVzc2VzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGVsaXZlcnlUeXBlcy5maWx0ZXIoKHR5cGUpID0+IHR5cGUuaWQgIT09IFNjRGVsaXZlcnlUeXBlLmRlbGl2ZXJ5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlbGl2ZXJ5VHlwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdGFwKChkZWxpdmVyeVR5cGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlUeXBlLnZhbHVlICYmICFkZWxpdmVyeVR5cGVzLnNvbWUoKGRlbGl2ZXJ5KSA9PiBkZWxpdmVyeS5pZCA9PT0gdGhpcy5mb3JtLmNvbnRyb2xzLmRlbGl2ZXJ5VHlwZS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5kZWxpdmVyeVR5cGUucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZm9ybS5jb250cm9scy5kZWxpdmVyeVR5cGUudmFsdWUgJiYgZGVsaXZlcnlUeXBlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5kZWxpdmVyeVR5cGUucGF0Y2hWYWx1ZShkZWxpdmVyeVR5cGVzWzBdLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0LosINGH0YLQviDQstGL0LHRgNCw0L0g0YLQuNC/INC+0L/Qu9Cw0YLRiyDQvdCw0LvQuNGH0L3Ri9C80LguXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzQ2FzaFBheW1lbnRTZWxlY3RlZDogU2lnbmFsPGJvb2xlYW4+ID0gdG9TaWduYWwoXG4gICAgICAgIHR1aUNvbnRyb2xWYWx1ZTxTY1BheW1lbnRUeXBlIHwgbnVsbD4odGhpcy5mb3JtLmNvbnRyb2xzLnBheW1lbnRUeXBlKS5waXBlKG1hcCgocGF5bWVudFR5cGUpID0+IHBheW1lbnRUeXBlID09PSBTY1BheW1lbnRUeXBlLm5hbCkpLFxuICAgICAgICB7IGluaXRpYWxWYWx1ZTogZmFsc2UgfVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiwg0YfRgtC+INC90L7QvNC10YAg0YLQtdC70LXRhNC+0L3QsCDQv9C+0LTRgtCy0LXRgNC20LTRkdC9LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1Bob25lQXBwcm92ZWQ6IFNpZ25hbDxib29sZWFuPiA9IHRvU2lnbmFsKFxuICAgICAgICB0aGlzLnVzZXIkLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKHVzZXIpID0+ICF1c2VyLmlzR3Vlc3QpLFxuICAgICAgICAgICAgbWFwKCh1c2VyKSA9PiB1c2VyLmNvbnRhY3RzLnBob25lLmlzQXBwcm92ZWQpXG4gICAgICAgICksXG4gICAgICAgIHsgaW5pdGlhbFZhbHVlOiB0cnVlIH1cbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0LosINGH0YLQviDQsNC00YDQtdGBINGN0LvQtdC60YLRgNC+0L3QvdC+0Lkg0L/QvtGH0YLRiyDQv9C+0LTRgtCy0LXRgNC20LTRkdC9INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvQtdC8LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaXNFbWFpbEFwcHJvdmVkVXNlcjogU2lnbmFsPGJvb2xlYW4+ID0gdG9TaWduYWwoXG4gICAgICAgIHRoaXMudXNlciQucGlwZShcbiAgICAgICAgICAgIGZpbHRlcigodXNlcikgPT4gIXVzZXIuaXNHdWVzdCksXG4gICAgICAgICAgICBtYXAoKHVzZXIpID0+IHVzZXIuY29udGFjdHMuZW1haWwuaXNBcHByb3ZlZClcbiAgICAgICAgKSxcbiAgICAgICAgeyBpbml0aWFsVmFsdWU6IHRydWUgfVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiwg0YfRgtC+INCw0LTRgNC10YEg0Y3Qu9C10LrRgtGA0L7QvdC90L7QuSDQv9C+0YfRgtGLINC/0L7QtNGC0LLQtdGA0LbQtNGR0L0g0LjQu9C4INC60L7QvdGC0YDQsNCz0LXQvdGCINGP0LLQu9GP0LXRgtGB0Y8g0YTQuNC30LjRh9C10YHQutC40Lwg0LvQuNGG0L7QvC5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWZ1bmN0aW9uLXNjb3BpbmdcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNFbWFpbEFwcHJvdmVkOiBTaWduYWw8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmlzRW1haWxBcHByb3ZlZFVzZXIoKSB8fCB0aGlzLmlzSW5kaXZpZHVhbCgpKTtcblxuICAgIC8qKlxuICAgICAqINCX0L3QsNGH0LXQvdC40LUg0LLRi9Cx0YDQsNC90L3QvtCz0L4g0YLQuNC/0LAg0LTQvtGB0YLQsNCy0LrQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlbGl2ZXJ5VHlwZVZhbHVlID0gdG9TaWduYWwodHVpQ29udHJvbFZhbHVlPFNjRGVsaXZlcnlUeXBlIHwgbnVsbD4odGhpcy5mb3JtLmNvbnRyb2xzLmRlbGl2ZXJ5VHlwZSksIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0LosINGH0YLQviDQstGL0LHRgNCw0L0g0YLQuNC/INC00L7RgdGC0LDQstC60LggXCLQlNC+0YHRgtCw0LLQutCwXCIuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzRGVsaXZlcnkgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLmRlbGl2ZXJ5VHlwZVZhbHVlKCkgPT09IFNjRGVsaXZlcnlUeXBlLmRlbGl2ZXJ5KTtcblxuICAgIC8qKlxuICAgICAqINCd0LDQsdC+0YAg0LTQvtGB0YLRg9C/0L3Ri9GFINC00LDRgiDQsiDQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4INC+0YIg0YLQuNC/0LAg0LTQvtGB0YLQsNCy0LrQuC5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWZ1bmN0aW9uLXNjb3BpbmdcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVsaXZlcnlEYXRlcyA9IGNvbXB1dGVkPHN0cmluZ1tdPigoKSA9PlxuICAgICAgICB0aGlzLmRlbGl2ZXJ5VHlwZVZhbHVlKCkgPT09IFNjRGVsaXZlcnlUeXBlLnNlbGZfZGVsaXZlcnkgPyB0aGlzLndhcmVob3VzZURlbGl2ZXJ5RGF0ZXMoKSA6IHRoaXMuYWRkcmVzc0RlbGl2ZXJ5RGF0ZXMoKVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiDQndCw0LHQvtGAINC00L7RgdGC0YPQv9C90YvRhSDQtNCw0YIg0LIg0LLQuNC00LUg0LTQsNGCINC60LDQu9C10L3QtNCw0YDRjywg0L7RgtGB0L7RgNGC0LjRgNC+0LLQsNC90L3Ri9C5INC/0L4g0LLQvtC30YDQsNGB0YLQsNC90LjRji5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlbGl2ZXJ5RGF5cyA9IGNvbXB1dGVkPFR1aURheVtdPigoKSA9PlxuICAgICAgICB0aGlzLmRlbGl2ZXJ5RGF0ZXMoKVxuICAgICAgICAgICAgLm1hcCgoZGF0ZSkgPT4gVHVpRGF5Lm5vcm1hbGl6ZVBhcnNlKGRhdGUuc2xpY2UoMCwgMTApLCAnWU1EJykpXG4gICAgICAgICAgICAuc29ydCgoZmlyc3REYXksIHNlY29uZERheSkgPT4gKGZpcnN0RGF5LmRheVNhbWVPckJlZm9yZShzZWNvbmREYXkpID8gLTEgOiAxKSlcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0J/QtdGA0LLQsNGPINC00L7RgdGC0YPQv9C90LDRjyDQtNCw0YLQsC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWluRGVsaXZlcnlEYXkgPSBjb21wdXRlZDxUdWlEYXkgfCBudWxsPigoKSA9PiB0aGlzLmRlbGl2ZXJ5RGF5cygpWzBdID8/IG51bGwpO1xuXG4gICAgLyoqXG4gICAgICog0J/QvtGB0LvQtdC00L3Rj9GPINC00L7RgdGC0YPQv9C90LDRjyDQtNCw0YLQsC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4RGVsaXZlcnlEYXkgPSBjb21wdXRlZDxUdWlEYXkgfCBudWxsPigoKSA9PiB0aGlzLmRlbGl2ZXJ5RGF5cygpLmF0KC0xKSA/PyBudWxsKTtcblxuICAgIC8qKlxuICAgICAqINCh0YHRi9C70LrQsCDQvdCwINGN0LvQtdC80LXQvdGCINGBINC/0YDQtdC00YPQv9GA0LXQttC00LXQvdC40LXQvCDQviDQvdC10L/QvtC00YLQstC10YDQttC00ZHQvdC90YvRhSDQtNCw0L3QvdGL0YUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHVuY29uZmlybWVkRGF0YVdhcm5pbmcgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KCd1bmNvbmZpcm1lZERhdGFXYXJuaW5nJyk7XG5cbiAgICAvKipcbiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiDQvNCw0YDQutC10YAsINC60L7RgtC+0YDRi9C8INCy0YvQtNC10LvRj9C10YLRgdGPINC00L7RgdGC0YPQv9C90LDRjyDQtNC70Y8g0LLRi9Cx0L7RgNCwINC00LDRgtCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGUg0JTQsNGC0LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlbGl2ZXJ5RGF0ZU1hcmtlcjogVHVpTWFya2VySGFuZGxlciA9IChkYXRlOiBUdWlEYXkpID0+ICh0aGlzLmRlbGl2ZXJ5RGF0ZUZpbHRlcihkYXRlKSA/IFtdIDogWyd2YXIoLS10dWktYmFja2dyb3VuZC1hY2NlbnQtMSknXSk7XG5cbiAgICAvKipcbiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiDQv9GA0LjQt9C90LDQuiwg0YfRgtC+INGD0LrQsNC30LDQvdC90LDRjyDQtNCw0YLQsCDQvdC10LTQvtGB0YLRg9C/0L3QsCDQtNC70Y8g0LLRi9Cx0L7RgNCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGUg0JTQsNGC0LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlbGl2ZXJ5RGF0ZUZpbHRlciA9IChkYXRlOiBUdWlEYXkpOiBib29sZWFuID0+ICF0aGlzLmRlbGl2ZXJ5RGF0ZXMoKS5pbmNsdWRlcyhgJHtkYXRlLnRvU3RyaW5nKCdZTUQnLCAnLScpfSAwMDowMDowMGApO1xuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXRgiDRjdC60LfQtdC80L/Qu9GP0YAg0LrQu9Cw0YHRgdCwIHtAbGluayBTY09yZGVyRm9ybUNvbXBvbmVudH0uXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyDQkNCy0YLQvtC80LDRgtC40YfQtdGB0LrQuCDQstGL0LHQuNGA0LDQtdC8INC10LTQuNC90YHRgtCy0LXQvdC90L7Qs9C+INC60L7QvdGC0YDQsNCz0LXQvdGC0LAt0YTQuNC30LvQuNGG0L4uXG4gICAgICAgIHRoaXMuY29udHJhZ2VudHMkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKGNvbnRyYWdlbnRzKTogY29udHJhZ2VudHMgaXMgW1NjQ29udHJhZ2VudF0gPT4gISFjb250cmFnZW50cyAmJiBjb250cmFnZW50cy5sZW5ndGggPT09IDEpLFxuICAgICAgICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgICAgICAgZmlsdGVyKChbY29udHJhZ2VudF0pID0+IGNvbnRyYWdlbnQub3BmLmlkID09PSBTY09wZkxpc3QuaW5kaXZpZHVhbC52YWx1ZU9mKCkpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChbY29udHJhZ2VudF0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuY29udHJhZ2VudElkPy5wYXRjaFZhbHVlKGNvbnRyYWdlbnQuaWQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5pbml0Rm9ybUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGluaGVyaXRkb2MgKi9cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5pdE1ldGFkYXRhKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQvtCx0YrQtdC60YLRiyDQsiDQt9C90LDRh9C10L3QuNGPLCDQvtGC0L7QsdGA0LDQttCw0LXQvNC+0LUg0LIg0L/QvtC70LUg0LLQstC+0LTQsC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtcyDQktGL0LHRgNCw0L3QvdGL0LUg0L7QsdGK0LXQutGC0Ysg0LLRi9C/0LDQtNCw0Y7RidC10LPQviDRgdC/0LjRgdC60LAuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBwdWJsaWMgc3RyaW5naWZ5KGl0ZW1zOiByZWFkb25seSBTZWxlY3RUeXBlW10pOiBUdWlTdHJpbmdIYW5kbGVyPFR1aUNvbnRleHQ8bnVtYmVyPj4ge1xuICAgICAgICBjb25zdCBpdGVtc01hcCA9IG5ldyBNYXAoXG4gICAgICAgICAgICBpdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1uZXN0ZWQtdGVybmFyeSxzb25hcmpzL25vLW5lc3RlZC1jb25kaXRpb25hbFxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSAnbmFtZScgaW4gaXRlbSA/IGl0ZW0ubmFtZSA6ICdhZGRyZXNzJyBpbiBpdGVtID8gaXRlbS5hZGRyZXNzIDogJyc7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gW2l0ZW0uaWQsIG5hbWVdIGFzIFtudW1iZXIsIHN0cmluZ107XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiAoeyAkaW1wbGljaXQgfTogVHVpQ29udGV4dDxudW1iZXI+KSA9PiBpdGVtc01hcC5nZXQoJGltcGxpY2l0KSA/PyAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0LDRgtGL0LLQsNC10YIg0L7RgtC/0YDQsNCy0LrRgyDRhNC+0YDQvNGLOiDQstCw0LvQuNC00LjRgNGD0LXRgiDQuCDRjdC80LjRgtC40YIg0LTQsNC90L3Ri9C1INC30LDQutCw0LfQsCDRgNC+0LTQuNGC0LXQu9GOLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdWJtaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRhY3RzQXBwcm92ZWQgPSAhdGhpcy5lbmZvcmNlQXBwcm92ZWRDb250YWN0cygpIHx8ICh0aGlzLmlzUGhvbmVBcHByb3ZlZCgpICYmIHRoaXMuaXNFbWFpbEFwcHJvdmVkKCkpO1xuXG4gICAgICAgIGlmICghY29udGFjdHNBcHByb3ZlZCkge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyVW5jb25maXJtZWRXYXJuaW5nKCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3JkZXJTdWJtaXQuZW1pdCh0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKSBhcyBTY0lOZXdPcmRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LzQtdC90Y/QtdGCINC6INC/0L7Qu9GP0Lwg0YTQvtGA0LzRiyDQvtGI0LjQsdC60LgsINC/0YDQuNGI0LXQtNGI0LjQtSDQvtGCINGB0LXRgNCy0LXRgNCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVycm9yINCe0YLQstC10YIg0YHQtdGA0LLQtdGA0LAg0YEg0L7RiNC40LHQutCw0LzQuC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXBwbHlTZXJ2ZXJFcnJvcnMoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZXJyb3JzLCBtZXNzYWdlIH0gPSBlcnJvci5lcnJvciBhcyBTY0lBcGlFcnJvclJlc3BvbnNlO1xuXG4gICAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGVycm9ycykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gJ2RlbGl2ZXJ5RGF0ZScgJiYgaXNBcnJheShlcnJvcnNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldChrZXkpPy5zZXRFcnJvcnMoeyBzZXJ2ZXJSZXNwb25zZTogbmV3IFR1aVZhbGlkYXRpb25FcnJvcihlcnJvcnNba2V5XS5hdCgxKSA/PyBlcnJvcnNba2V5XS5hdCgwKSkgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldChrZXkpPy5zZXRFcnJvcnMoeyBzZXJ2ZXJSZXNwb25zZTogbmV3IFR1aVZhbGlkYXRpb25FcnJvcihlcnJvcnNba2V5XSkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoa2V5KT8ubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtLnNldEVycm9ycyh7IHNlcnZlclJlc3BvbnNlOiBuZXcgVHVpVmFsaWRhdGlvbkVycm9yKG1lc3NhZ2UpIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KPQtNCw0LvRj9C10YIg0YTQsNC50Lsg0LjQtyDRhNC+0YDQvNGLINC30LDQutCw0LfQsC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlRmlsZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250cm9sRmlsZS5yZXNldCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0YLQutGA0YvQstCw0LXRgiDQtNC40LDQu9C+0LPQvtCy0L7QtSDQvtC60L3QviDQtNC+0LHQsNCy0LvQtdC90LjRjyDQsNC00YDQtdGB0LAg0LTQvtGB0YLQsNCy0LrQuC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkRGVsaXZlcnlBZGRyZXNzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYWxvZ1xuICAgICAgICAgICAgLm9wZW4obmV3IFBvbHltb3JwaGV1c0NvbXBvbmVudChTY0FkZERlbGl2ZXJ5QWRkcmVzc0RpYWxvZ0NvbXBvbmVudCksIHtcbiAgICAgICAgICAgICAgICBzaXplOiAnbCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICfQlNC+0LHQsNCy0LvQtdC90LjQtSDQsNC00YDQtdGB0LAg0LTQvtGB0YLQsNCy0LrQuCcsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0YLQutGA0YvQstCw0LXRgiDQtNC40LDQu9C+0LPQvtCy0L7QtSDQvtC60L3QviDQtNC+0LHQsNCy0LvQtdC90LjRjyDQutC+0L3RgtGA0LDQs9C10L3RgtCwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhZGRDb250cmFnZW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYWxvZ1xuICAgICAgICAgICAgLm9wZW4obmV3IFBvbHltb3JwaGV1c0NvbXBvbmVudChTY0FkZENvbnRyYWdlbnREaWFsb2dDb21wb25lbnQpLCB7XG4gICAgICAgICAgICAgICAgc2l6ZTogJ20nLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAn0JTQvtCx0LDQstC70LXQvdC40LUg0LrQvtC90YLRgNCw0LPQtdC90YLQsCcsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCX0LDQv9GD0YHQutCw0LXRgiDQsNC90LjQvNCw0YbQuNGOINC/0YDQtdC00YPQv9GA0LXQttC00LXQvdC40Y8g0L4g0L3QtdC/0L7QtNGC0LLQtdGA0LbQtNGR0L3QvdGL0YUg0LTQsNC90L3Ri9GFINC4INC/0YDQvtC60YDRg9GH0LjQstCw0LXRgiDQuiDQvdC10LzRgy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHRyaWdnZXJVbmNvbmZpcm1lZFdhcm5pbmcoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnVuY29uZmlybWVkRGF0YVdhcm5pbmcoKT8ubmF0aXZlRWxlbWVudDtcblxuICAgICAgICBpZiAoIXRoaXMuaXNTZXJ2ZXIgJiYgZWxlbWVudCkge1xuICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53YXJuaW5nU2hha2Uuc2V0KGZhbHNlKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndhcm5pbmdTaGFrZS5zZXQodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0L7RgdGB0YLQsNC90LDQstC70LjQstCw0LXRgiDRh9C10YDQvdC+0LLRi9C1INC00LDQvdC90YvQtSDRhNC+0YDQvNGLINC40Lcg0LzQtdGC0LDQtNCw0L3QvdGL0YUg0Lgg0LjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXRgiDQuNGFINGB0L7RhdGA0LDQvdC10L3QuNC1LCDQtdGB0LvQuCDQv9GA0LXQtNC+0YHRgtCw0LLQu9C10L0g0YLQvtC60LXQvSB7QGxpbmsgU0NfT1JERVJfRk9STV9DT05GSUd9LlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5pdE1ldGFkYXRhKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvbmZpZyB9ID0gdGhpcztcblxuICAgICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tYmluZUxhdGVzdCh7XG4gICAgICAgICAgICBvcmRlck1ldGFkYXRhOiB0aGlzLnVpU2VydmljZS5nZXROZXdPcmRlck1ldGFkYXRhJCgpLFxuICAgICAgICAgICAgdXNlcjogdGhpcy51c2VyJC5waXBlKGZpbHRlcigodXNlcikgPT4gIXVzZXIuaXNHdWVzdCkpLFxuICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc29uYXJqcy9jb2duaXRpdmUtY29tcGxleGl0eVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoeyBvcmRlck1ldGFkYXRhIH0pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZGVsaXZlcnlEYXRlOiBzdHJpbmcgfCBudWxsID1cbiAgICAgICAgICAgICAgICAgICAgb3JkZXJNZXRhZGF0YT8uZGVsaXZlcnlEYXRlICYmIGlzVmFsaWQocGFyc2Uob3JkZXJNZXRhZGF0YS5kZWxpdmVyeURhdGUsIGNvbmZpZy5kYXRlRm9ybWF0cy5hcGksIG5ldyBEYXRlKCkpKSA/IG9yZGVyTWV0YWRhdGEuZGVsaXZlcnlEYXRlIDogbnVsbDtcblxuICAgICAgICAgICAgICAgIC8vINCV0YHQu9C4INC00LDRgtCwINGB0YLQsNGA0L7Qs9C+INGE0L7RgNC80LDRgtCwLCDRgtC+INC/0YDQtdC+0LHRgNCw0LfRg9C10Lwg0LXRkSDQsiDQvdC+0LLRi9C5INGE0L7RgNC80LDRgi5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiDQo9Cx0YDQsNGC0Ywg0Y3RgtC+0YIg0LHQu9C+0Log0LrQvtCz0LTQsCDQstGB0LUg0LTQsNGC0Ysg0YMg0LrQu9C40LXQvdGC0L7QsiDQstGB0YLQsNC90YPRgiDQsiDQvdC+0YDQvNCw0LvRjNC90L7QvCDRhNC+0YDQvNCw0YLQtS5cbiAgICAgICAgICAgICAgICBpZiAob3JkZXJNZXRhZGF0YT8uZGVsaXZlcnlEYXRlICYmICFkZWxpdmVyeURhdGUgJiYgaXNWYWxpZChwYXJzZShvcmRlck1ldGFkYXRhLmRlbGl2ZXJ5RGF0ZSwgY29uZmlnLmRhdGVGb3JtYXRzLnVpRGF0ZSwgbmV3IERhdGUoKSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5RGF0ZSA9IGZvcm1hdChwYXJzZShvcmRlck1ldGFkYXRhLmRlbGl2ZXJ5RGF0ZSwgY29uZmlnLmRhdGVGb3JtYXRzLnVpRGF0ZSwgbmV3IERhdGUoKSksIGNvbmZpZy5kYXRlRm9ybWF0cy5hcGkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0dWlJc1ByZXNlbnQob3JkZXJNZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhZ2VudElkOiBvcmRlck1ldGFkYXRhLmNvbnRyYWdlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheW1lbnRUeXBlOiBvcmRlck1ldGFkYXRhLmNvbnRyYWdlbnRJZCA/IG9yZGVyTWV0YWRhdGEucGF5bWVudFR5cGUgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnlUeXBlOiBvcmRlck1ldGFkYXRhLmNvbnRyYWdlbnRJZCA/IG9yZGVyTWV0YWRhdGEuZGVsaXZlcnlUeXBlIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5RGF0ZTogb3JkZXJNZXRhZGF0YS5jb250cmFnZW50SWQgJiYgQm9vbGVhbihvcmRlck1ldGFkYXRhLmRlbGl2ZXJ5VHlwZSkgJiYgZGVsaXZlcnlEYXRlID8gZGVsaXZlcnlEYXRlIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NJZDogb3JkZXJNZXRhZGF0YS5kZWxpdmVyeVR5cGUgPT09IFNjRGVsaXZlcnlUeXBlLmRlbGl2ZXJ5ICYmIG9yZGVyTWV0YWRhdGEuYWRkcmVzc0lkID8gb3JkZXJNZXRhZGF0YS5hZGRyZXNzSWQgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2FyZWhvdXNlSWQ6IG9yZGVyTWV0YWRhdGEuY29udHJhZ2VudElkICYmIEJvb2xlYW4ob3JkZXJNZXRhZGF0YS5kZWxpdmVyeVR5cGUpID8gb3JkZXJNZXRhZGF0YS53YXJlaG91c2VJZCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50OiBvcmRlck1ldGFkYXRhLmNvbW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoY29uZmlnLmRlYm91bmNlVGltZSksIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKG5ld09yZGVyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVpU2VydmljZS5zZXROZXdPcmRlck1ldGFkYXRhKHRoaXMuY29udmVydGVyc1NlcnZpY2UucmVtb3ZlTnVsbDxTY0lOZXdPcmRlcj4obmV3T3JkZXIgYXMgU2NJTmV3T3JkZXIpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXRgiDQv9C+0LTQv9C40YHQutC4INC90LAg0LjQt9C80LXQvdC10L3QuNGPINC/0L7Qu9C10Lkg0YTQvtGA0LzRiy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGluaXRGb3JtQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0RmlsZUNoYW5nZSgpO1xuICAgICAgICB0aGlzLmluaXRXYXJlaG91c2VDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5pbml0RGVsaXZlcnlEYXRlc0NoYW5nZSgpO1xuICAgICAgICB0aGlzLmluaXREYXRlRmllbGRBY3RpdmF0aW9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXRgiDQv9C+0LTQv9C40YHQutGDINC90LAg0LjQt9C80LXQvdC10L3QuNC1INC/0L7Qu9GPINC/0YDQuNC60YDQtdC/0LvQtdC90LjRjyDRhNCw0LnQu9CwLlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5pdEZpbGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udHJvbEZpbGUudmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbGUgJiYgdGhpcy5mb3JtLmNvbnRyb2xzLmltYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblVwbG9hZEZpbGUoZmlsZSwgdGhpcy5mb3JtLmNvbnRyb2xzLmltYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmltYWdlPy5yZXNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdGCINC/0L7QtNC/0LjRgdC60YMg0L3QsCDQuNC30LzQtdC90LXQvdC40LUg0LLRi9Cx0YDQsNC90L3QvtCz0L4g0YHQutC70LDQtNCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5pdFdhcmVob3VzZUNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLndhcmVob3VzZUlkLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCh3YXJlaG91c2VJZCkgPT4gdHVpSXNQcmVzZW50KHdhcmVob3VzZUlkKSAmJiB0aGlzLndhcmVob3VzZVNlcnZpY2UuZ2V0Q3VycmVudFdhcmVob3VzZUlkU2VsZWN0KCkgIT09IHdhcmVob3VzZUlkKSxcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMCksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53YXJlaG91c2VTZXJ2aWNlLnNldFdhcmVob3VzZUlkU2VsZWN0Q2hhbmdlKGlkISk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdGCINC/0L7QtNC/0LjRgdC60YMg0L3QsCDQuNC30LzQtdC90LXQvdC40LUg0LDQtNGA0LXRgdCwINC00L7RgdGC0LDQstC60Lgg0Lgg0LLRi9Cx0YDQsNC90L3QvtCz0L4g0YHQutC70LDQtNCwINC00LvRjyDQv9C+0LvRg9GH0LXQvdC40Y8g0YHQv9C40YHQutCwINC00L7RgdGC0YPQv9C90YvRhSDQtNCw0YIg0LTQvtGB0YLQsNCy0LrQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGluaXREZWxpdmVyeURhdGVzQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICBtZXJnZShcbiAgICAgICAgICAgIHR1aUNvbnRyb2xWYWx1ZTxudW1iZXIgfCBudWxsPih0aGlzLmZvcm0uY29udHJvbHMuYWRkcmVzc0lkKS5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcih0dWlJc1ByZXNlbnQpLFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZUZvcm1DaGFuZ2UpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoYWRkcmVzc0lkOiBudW1iZXIpID0+IHRoaXMuZGVsaXZlcmllc0J5QWRkcmVzcyhhZGRyZXNzSWQpKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHR1aUNvbnRyb2xWYWx1ZTxudW1iZXIgfCBudWxsPih0aGlzLmZvcm0uY29udHJvbHMud2FyZWhvdXNlSWQpLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKHR1aUlzUHJlc2VudCksXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lRm9ybUNoYW5nZSksXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZm9ybS5jb250cm9scy5kZWxpdmVyeVR5cGUudmFsdWUgPT09IFNjRGVsaXZlcnlUeXBlLnNlbGZfZGVsaXZlcnkpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgod2FyZWhvdXNlSWQ6IG51bWJlcikgPT4gdGhpcy5kZWxpdmVyaWVzQnlXYXJlaG91c2Uod2FyZWhvdXNlSWQpKVxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlEYXRlLmRpc2FibGUoKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgcmV0cnkoKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZGVsaXZlcnlEYXRlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbGl2ZXJ5RGF0ZVZhbHVlID0gdGhpcy5mb3JtLmNvbnRyb2xzLmRlbGl2ZXJ5RGF0ZS52YWx1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChkZWxpdmVyeURhdGVWYWx1ZSAmJiAhZGVsaXZlcnlEYXRlcy5pbmNsdWRlcyhkZWxpdmVyeURhdGVWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmRlbGl2ZXJ5RGF0ZS5yZXNldCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCY0L3QuNGG0LjQsNC70LjQt9C40YDRg9C10YIg0L/QvtC00L/QuNGB0LrRgyDQvdCwINC40LfQvNC10L3QtdC90LjQtSDQv9C+0LvQtdC5INGE0L7RgNC80Ysg0LTQu9GPINCx0LvQvtC60LjRgNC+0LLQsNC90LjRjy/QsNC60YLQuNCy0LDRhtC40Lgg0L/QvtC70Y8g0LLRi9Cx0L7RgNCwINC00LDRgtGLLlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5pdERhdGVGaWVsZEFjdGl2YXRpb25DaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgdHVpQ29udHJvbFZhbHVlPFNjRGVsaXZlcnlUeXBlPih0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlUeXBlKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5jb250cmFnZW50SWQ/LnZhbHVlQ2hhbmdlcy5waXBlKGZpbHRlcigoKSA9PiB0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlUeXBlLnZhbHVlID09PSBTY0RlbGl2ZXJ5VHlwZS5kZWxpdmVyeSkpID8/IG9mKClcbiAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlEYXRlLmRpc2FibGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMud2FyZWhvdXNlSWQuZGlzYWJsZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0RlbGl2ZXJ5RGF0ZXMuc2V0KFtdKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlUeXBlLnZhbHVlID09PSBTY0RlbGl2ZXJ5VHlwZS5kZWxpdmVyeSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuYWRkcmVzc0lkLmVuYWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndhcmVob3VzZVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWxpdmVyeVdhcmVob3VzZSQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnhqcy9uby1uZXN0ZWQtc3Vic2NyaWJlXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh3YXJlaG91c2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMud2FyZWhvdXNlSWQucGF0Y2hWYWx1ZSh3YXJlaG91c2UuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybS5jb250cm9scy5kZWxpdmVyeVR5cGUudmFsdWUgPT09IFNjRGVsaXZlcnlUeXBlLnNlbGZfZGVsaXZlcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmFkZHJlc3NJZC5kaXNhYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy53YXJlaG91c2VJZC5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQl9Cw0L/RgNCw0YjQuNCy0LDQtdGCINC00LDRgtGLINC00L7RgdGC0LDQstC60Lgg0L/QviDQsNC00YDQtdGB0YMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWRkcmVzc0lkINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINCw0LTRgNC10YHQsCDQtNC+0YHRgtCw0LLQutC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgZGVsaXZlcmllc0J5QWRkcmVzcyhhZGRyZXNzSWQ6IG51bWJlcik6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JkZXJzU2VydmljZS5nZXREZWxpdmVyaWVzRGF0YSQoYWRkcmVzc0lkKS5waXBlKFxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSA/IGVycm9yLmVycm9yLm1lc3NhZ2UgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuYWRkcmVzc0lkLnNldEVycm9ycyh7XG4gICAgICAgICAgICAgICAgICAgIHNlcnZlclJlc3BvbnNlOiBtZXNzYWdlID8/IGDQntGI0LjQsdC60LAg0YHQtdGA0LLQtdGA0LA6INC/0L7QttCw0LvRg9C50YHRgtCwLCDQv9C10YDQtdC30LDQs9GA0YPQt9C40YLQtSDRgdGC0YDQsNC90LjRhtGDINC4L9C40LvQuCDQstGL0L/QvtC70L3QuNGC0LUg0LfQsNC/0YDQvtGBINC/0L7Qt9C20LUuYCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NEZWxpdmVyeURhdGVzLnNldChbXSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcCgoZGVsaXZlcnlEYXRlcykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0RlbGl2ZXJ5RGF0ZXMuc2V0KGRlbGl2ZXJ5RGF0ZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5kZWxpdmVyeURhdGUuZW5hYmxlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCX0LDQv9GA0LDRiNC40LLQsNC10YIg0LTQsNGC0Ysg0YHQsNC80L7QstGL0LLQvtC30LAg0L/QviDRgdC60LvQsNC00YMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gd2FyZWhvdXNlSWQg0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0YHQutC70LDQtNCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgZGVsaXZlcmllc0J5V2FyZWhvdXNlKHdhcmVob3VzZUlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yZGVyc1NlcnZpY2UuZ2V0U2VsZkRlbGl2ZXJpZXNEYXRhJCh3YXJlaG91c2VJZCkucGlwZShcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UgPyBlcnJvci5lcnJvci5tZXNzYWdlIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLndhcmVob3VzZUlkLnNldEVycm9ycyh7XG4gICAgICAgICAgICAgICAgICAgIHNlcnZlclJlc3BvbnNlOiBtZXNzYWdlID8/IGDQntGI0LjQsdC60LAg0YHQtdGA0LLQtdGA0LA6INC/0L7QttCw0LvRg9C50YHRgtCwLCDQv9C10YDQtdC30LDQs9GA0YPQt9C40YLQtSDRgdGC0YDQsNC90LjRhtGDINC4L9C40LvQuCDQstGL0L/QvtC70L3QuNGC0LUg0LfQsNC/0YDQvtGBINC/0L7Qt9C20LUuYCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLndhcmVob3VzZURlbGl2ZXJ5RGF0ZXMuc2V0KFtdKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKChkZWxpdmVyeURhdGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53YXJlaG91c2VEZWxpdmVyeURhdGVzLnNldChkZWxpdmVyeURhdGVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlEYXRlLmVuYWJsZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQl9Cw0LPRgNGD0LbQsNC10YIg0YTQsNC50Lsg0LIg0YTQvtGA0LzRgy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlINCk0LDQudC7LlxuICAgICAqIEBwYXJhbSBmaWxlc0NvbnRyb2wg0J/QvtC70LUg0YTQsNC50LvQsCDQt9Cw0LrQsNC30LAuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBwcml2YXRlIG9uVXBsb2FkRmlsZShmaWxlOiBUdWlGaWxlTGlrZSwgZmlsZXNDb250cm9sOiBGb3JtQ29udHJvbDxTY1VwbG9hZGVkRmlsZSB8IG51bGw+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgICAgcmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHJlc3VsdCB9ID0gcmVhZGVyO1xuXG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIGZpbGVzQ29udHJvbC5zZXRWYWx1ZShuZXcgU2NVcGxvYWRlZEZpbGUoZmlsZS5uYW1lLCByZXN1bHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSBhcyB1bmtub3duIGFzIEJsb2IpO1xuICAgIH1cbn1cbiIsIkBsZXQgdXNlciA9IHVzZXIkIHwgYXN5bmM7XG5cbjxmb3JtXG4gICAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgICBzY0ZvY3VzRmlyc3RJbnZhbGlkRmllbGRcbiAgICBbZmllbGRPcmRlcl09XCJbJ2NvbnRyYWdlbnRJZCcsICdwYXltZW50VHlwZScsICdkZWxpdmVyeVR5cGUnLCAnd2FyZWhvdXNlSWQnLCAnYWRkcmVzc0lkJywgJ2RlbGl2ZXJ5RGF0ZScsICdjb21tZW50J11cIlxuICAgIChuZ1N1Ym1pdCk9XCJzdWJtaXQoKVwiXG4gICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00XCJcbj5cbiAgICA8bmctdGVtcGxhdGUgI3NlbGVjdExvYWRpbmc+IDx0dWktbG9hZGVyIC8+IDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tINCa0L7QvdGC0YDQsNCz0LXQvdGCLiAtLT5cbiAgICBAaWYgKGNvbnRyYWdlbnRzJCB8IGFzeW5jOyBhcyBjb250cmFnZW50cykge1xuICAgICAgICBAaWYgKGNvbnRyYWdlbnRzLmxlbmd0aCA+IDEgfHwgdXNlcj8uaXNPcmcpIHtcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIHR1aUxhYmVsPlxuICAgICAgICAgICAgICAgICAgICDQmtC+0L3RgtGA0LDQs9C10L3RglxuICAgICAgICAgICAgICAgICAgICA8dHVpLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29udHJhZ2VudElkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZUNvbnRlbnRdPVwiY29udHJhZ2VudHMgPyBzdHJpbmdpZnkoY29udHJhZ2VudHMpIDogc2VsZWN0TG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgINCa0L7QvdGC0YDQsNCz0LXQvdGCXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHVpLWRhdGEtbGlzdCAqdHVpRGF0YUxpc3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoY29udHJhZ2VudCBvZiBjb250cmFnZW50czsgdHJhY2sgY29udHJhZ2VudC5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjb250cmFnZW50LmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29udHJhZ2VudC5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHVpLWRhdGEtbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgPC90dWktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8dHVpLWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb250cmFnZW50SWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Vycm9yXT1cIltdIHwgdHVpRmllbGRFcnJvciB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgIHR1aUxpbmtcbiAgICAgICAgICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS5wbHVzXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZENvbnRyYWdlbnQoKVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtMiBibG9ja1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICDQndC+0LLRi9C5XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICA8IS0tINCi0LjQvyDQvtC/0LvQsNGC0YsuIC0tPlxuICAgIDxsYWJlbCB0dWlMYWJlbD5cbiAgICAgICAg0KLQuNC/INC+0L/Qu9Cw0YLRi1xuICAgICAgICBAbGV0IHBheW1lbnRUeXBlcyA9IHBheW1lbnRUeXBlcyQgfCBhc3luYztcbiAgICAgICAgPHR1aS1zZWxlY3RcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRUeXBlXCJcbiAgICAgICAgICAgIFt2YWx1ZUNvbnRlbnRdPVwicGF5bWVudFR5cGVzID8gc3RyaW5naWZ5KHBheW1lbnRUeXBlcykgOiBzZWxlY3RMb2FkaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgICAg0KLQuNC/INC+0L/Qu9Cw0YLRi1xuICAgICAgICAgICAgPHR1aS1kYXRhLWxpc3QgKnR1aURhdGFMaXN0PlxuICAgICAgICAgICAgICAgIEBmb3IgKHR5cGUgb2YgcGF5bWVudFR5cGVzOyB0cmFjayB0eXBlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR1aU9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInR5cGUuaWRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyB0eXBlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90dWktZGF0YS1saXN0PlxuICAgICAgICA8L3R1aS1zZWxlY3Q+XG4gICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRUeXBlXCJcbiAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgIC8+XG4gICAgICAgIEBpZiAoaXNDYXNoUGF5bWVudFNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC14cyB0ZXh0LXR1aS1zdGF0dXMtcG9zaXRpdmVcIj7Ql9Cw0LrQsNC30Ysg0L/RgNC+0LjQt9Cy0L7QtNGP0YLRgdGPINC/0L4g0L/RgNC10LTQvtC/0LvQsNGC0LU8L3A+XG4gICAgICAgIH1cbiAgICA8L2xhYmVsPlxuXG4gICAgPCEtLSDQn9GA0LXQtNGD0L/RgNC10LbQtNC10L3QuNC1INC+INC90LXQv9C+0LTRgtCy0LXRgNC20LTRkdC90L3Ri9GFINC60L7QvdGC0LDQutGC0L3Ri9GFINC00LDQvdC90YvRhS4gLS0+XG4gICAgQGlmICghaXNQaG9uZUFwcHJvdmVkKCkgfHwgIWlzRW1haWxBcHByb3ZlZCgpKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICN1bmNvbmZpcm1lZERhdGFXYXJuaW5nXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtdHVpLXRleHQtbmVnYXRpdmVcIlxuICAgICAgICAgICAgW2NsYXNzLndhcm5pbmctc2hha2VdPVwid2FybmluZ1NoYWtlKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICDQktC90LjQvNCw0L3QuNC1ISDQlNC70Y8g0L7RhNC+0YDQvNC70LXQvdC40Y8g0LfQsNC60LDQt9CwINC90LXQvtCx0YXQvtC00LjQvNC+INC/0L7QtNGC0LLQtdGA0LTQuNGC0YxcbiAgICAgICAgICAgIEBpZiAoIWlzUGhvbmVBcHByb3ZlZCgpKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGRcIj4g0L3QvtC80LXRgCDRgtC10LvQtdGE0L7QvdCwIDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoIWlzUGhvbmVBcHByb3ZlZCgpICYmICFpc0VtYWlsQXBwcm92ZWQoKSkge1xuICAgICAgICAgICAgICAgIDxzcGFuPiDQuCA8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKCFpc0VtYWlsQXBwcm92ZWQoKSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkXCI+INCw0LTRgNC10YEg0Y3Qu9C10LrRgtGA0L7QvdC90L7QuSDQv9C+0YfRgtGLIDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgdHVpTGlua1xuICAgICAgICAgICAgICAgIHJvdXRlckxpbms9XCIvcHJvZmlsZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAg0LIg0LLQsNGI0LXQvCDQv9GA0L7RhNC40LvQtVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tINCh0L/QvtGB0L7QsSDQtNC+0YHRgtCw0LLQutC4LiAtLT5cbiAgICA8bGFiZWwgdHVpTGFiZWw+XG4gICAgICAgINCh0L/QvtGB0L7QsSDQtNC+0YHRgtCw0LLQutC4XG4gICAgICAgIEBsZXQgZGVsaXZlcnlUeXBlcyA9IGRlbGl2ZXJ5VHlwZXMkIHwgYXN5bmM7XG4gICAgICAgIDx0dWktc2VsZWN0XG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWxpdmVyeVR5cGVcIlxuICAgICAgICAgICAgW3ZhbHVlQ29udGVudF09XCJkZWxpdmVyeVR5cGVzID8gc3RyaW5naWZ5KGRlbGl2ZXJ5VHlwZXMpIDogc2VsZWN0TG9hZGluZ1wiXG4gICAgICAgID5cbiAgICAgICAgICAgINCh0L/QvtGB0L7QsSDQtNC+0YHRgtCw0LLQutC4XG4gICAgICAgICAgICA8dHVpLWRhdGEtbGlzdCAqdHVpRGF0YUxpc3Q+XG4gICAgICAgICAgICAgICAgQGZvciAoZGVsaXZlcnkgb2YgZGVsaXZlcnlUeXBlczsgdHJhY2sgZGVsaXZlcnkuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHVpT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZGVsaXZlcnkuaWRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkZWxpdmVyeS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdHVpLWRhdGEtbGlzdD5cbiAgICAgICAgPC90dWktc2VsZWN0PlxuICAgICAgICA8dHVpLWVycm9yXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWxpdmVyeVR5cGVcIlxuICAgICAgICAgICAgW2Vycm9yXT1cIltdIHwgdHVpRmllbGRFcnJvciB8IGFzeW5jXCJcbiAgICAgICAgLz5cbiAgICA8L2xhYmVsPlxuXG4gICAgPCEtLSDQodC60LvQsNC0LiAtLT5cbiAgICA8bGFiZWwgdHVpTGFiZWw+XG4gICAgICAgINCh0LrQu9Cw0LRcbiAgICAgICAgQGxldCB3YXJlaG91c2VzID0gd2FyZWhvdXNlcyQgfCBhc3luYztcbiAgICAgICAgPHR1aS1zZWxlY3RcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIndhcmVob3VzZUlkXCJcbiAgICAgICAgICAgIFt2YWx1ZUNvbnRlbnRdPVwid2FyZWhvdXNlcyA/IHN0cmluZ2lmeSh3YXJlaG91c2VzKSA6IHNlbGVjdExvYWRpbmdcIlxuICAgICAgICA+XG4gICAgICAgICAgICDQodC60LvQsNC0XG4gICAgICAgICAgICA8dHVpLWRhdGEtbGlzdCAqdHVpRGF0YUxpc3Q+XG4gICAgICAgICAgICAgICAgQGlmICghdGVybWluYWwuaXNSdW5uaW5nT25UZXJtaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICBAZm9yICh3YXJlaG91c2Ugb2Ygd2FyZWhvdXNlczsgdHJhY2sgd2FyZWhvdXNlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIndhcmVob3VzZS5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgd2FyZWhvdXNlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIEBpZiAod2FyZWhvdXNlU2VydmljZS5nZXRDYXRhbG9nV2FyZWhvdXNlQ2hhbmdlJCgpIHwgYXN5bmM7IGFzIHRlcm1pbmFsV2FyZWhvdXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlcm1pbmFsV2FyZWhvdXNlLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZXJtaW5hbFdhcmVob3VzZS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdHVpLWRhdGEtbGlzdD5cbiAgICAgICAgPC90dWktc2VsZWN0PlxuICAgICAgICA8dHVpLWVycm9yXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ3YXJlaG91c2VJZFwiXG4gICAgICAgICAgICBbZXJyb3JdPVwiW10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIlxuICAgICAgICAvPlxuICAgIDwvbGFiZWw+XG5cbiAgICA8IS0tINCQ0LTRgNC10YEg0LTQvtGB0YLQsNCy0LrQuC4gLS0+XG4gICAgQGlmIChpc0RlbGl2ZXJ5KCkpIHtcbiAgICAgICAgQGxldCBhZGRyZXNzZXMgPSBhZGRyZXNzZXMkIHwgYXN5bmM7XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgdHVpTGFiZWw+XG4gICAgICAgICAgICAgICAg0JDQtNGA0LXRgSDQtNC+0YHRgtCw0LLQutC4XG4gICAgICAgICAgICAgICAgPHR1aS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc0lkXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlQ29udGVudF09XCJhZGRyZXNzZXMgPyBzdHJpbmdpZnkoYWRkcmVzc2VzKSA6IHNlbGVjdExvYWRpbmdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAg0JDQtNGA0LXRgSDQtNC+0YHRgtCw0LLQutC4XG4gICAgICAgICAgICAgICAgICAgIDx0dWktZGF0YS1saXN0ICp0dWlEYXRhTGlzdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGFkZHJlc3Mgb2YgYWRkcmVzc2VzOyB0cmFjayBhZGRyZXNzLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImFkZHJlc3MuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYWRkcmVzcy5hZGRyZXNzIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvdHVpLWRhdGEtbGlzdD5cbiAgICAgICAgICAgICAgICA8L3R1aS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgQGlmIChhZGRyZXNzZXMgJiYgYWRkcmVzc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICA8dHVpLWVycm9yIGVycm9yPVwi0KMg0LrQvtC90YLRgNCw0LPQtdC90YLQsCDQvdC10YIg0LDQtNGA0LXRgdCwINC00L7RgdGC0LDQstC60LhcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8dHVpLWVycm9yXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFkZHJlc3NJZFwiXG4gICAgICAgICAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIHR1aUxpbmtcbiAgICAgICAgICAgICAgICBpY29uU3RhcnQ9XCJAdHVpLnBsdXNcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGREZWxpdmVyeUFkZHJlc3MoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtdC0yIGJsb2NrXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICDQndC+0LLRi9C5XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0g0JTQsNGC0LAg0LTQvtGB0YLQsNCy0LrQuC/RgdCw0LzQvtCy0YvQstC+0LfQsC4gLS0+XG4gICAgPGxhYmVsIHR1aUxhYmVsPlxuICAgICAgICDQltC10LvQsNC10LzQsNGPINC00LDRgtCwIHt7IGlzRGVsaXZlcnkoKSA/ICfQtNC+0YHRgtCw0LLQutC4JyA6ICfRgdCw0LzQvtCy0YvQstC+0LfQsCcgfX1cbiAgICAgICAgPHR1aS1pbnB1dC1kYXRlXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWxpdmVyeURhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkSXRlbUhhbmRsZXJdPVwiZGVsaXZlcnlEYXRlRmlsdGVyXCJcbiAgICAgICAgICAgIFttYXJrZXJIYW5kbGVyXT1cImRlbGl2ZXJ5RGF0ZU1hcmtlclwiXG4gICAgICAgICAgICBbbWF4XT1cIm1heERlbGl2ZXJ5RGF5KClcIlxuICAgICAgICAgICAgW21pbl09XCJtaW5EZWxpdmVyeURheSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAg0JbQtdC70LDQtdC80LDRjyDQtNCw0YLQsCB7eyBpc0RlbGl2ZXJ5KCkgPyAn0LTQvtGB0YLQsNCy0LrQuCcgOiAn0YHQsNC80L7QstGL0LLQvtC30LAnIH19XG4gICAgICAgIDwvdHVpLWlucHV0LWRhdGU+XG4gICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlbGl2ZXJ5RGF0ZVwiXG4gICAgICAgICAgICBbZXJyb3JdPVwiW10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIlxuICAgICAgICAvPlxuICAgIDwvbGFiZWw+XG5cbiAgICA8IS0tINCa0L7QvNC80LXQvdGC0LDRgNC40Lkg0LrQu9C40LXQvdGC0LAuIC0tPlxuICAgIDxsYWJlbCB0dWlMYWJlbD5cbiAgICAgICAg0JrQvtC80LzQtdC90YLQsNGA0LjQuSDQutC70LjQtdC90YLQsCDQuiDQt9Cw0LrQsNC30YNcbiAgICAgICAgPHR1aS10ZXh0YXJlYVxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29tbWVudFwiXG4gICAgICAgICAgICBbZXhwYW5kYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtyb3dzXT1cIjE1XCJcbiAgICAgICAgPlxuICAgICAgICAgICAg0JLQstC10LTQuNGC0LUg0YLQtdC60YHRglxuICAgICAgICA8L3R1aS10ZXh0YXJlYT5cbiAgICAgICAgPHR1aS1lcnJvclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29tbWVudFwiXG4gICAgICAgICAgICBbZXJyb3JdPVwiW10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIlxuICAgICAgICAvPlxuICAgIDwvbGFiZWw+XG5cbiAgICA8IS0tINCf0YDQuNC60YDQtdC/0LvQtdC90LjQtSDRhNCw0LnQu9CwINC6INC30LDQutCw0LfRgy4gLS0+XG4gICAgPGRpdj5cbiAgICAgICAgQGlmICghY29udHJvbEZpbGUudmFsdWUpIHtcbiAgICAgICAgICAgIDxsYWJlbCB0dWlJbnB1dEZpbGVzPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBhY2NlcHQ9XCJpbWFnZS8qXCJcbiAgICAgICAgICAgICAgICAgICAgdHVpSW5wdXRGaWxlc1xuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbEZpbGVcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICB9XG5cbiAgICAgICAgPHR1aS1maWxlcyBjbGFzcz1cInR1aS1zcGFjZV90b3AtMVwiPlxuICAgICAgICAgICAgQGlmIChjb250cm9sRmlsZS52YWx1ZSB8IHR1aUZpbGVSZWplY3RlZDogeyBhY2NlcHQ6ICdpbWFnZS8qJyB9IHwgYXN5bmM7IGFzIGZpbGUpIHtcbiAgICAgICAgICAgICAgICA8dHVpLWZpbGVcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU9XCJlcnJvclwiXG4gICAgICAgICAgICAgICAgICAgIFtmaWxlXT1cImZpbGVcIlxuICAgICAgICAgICAgICAgICAgICAocmVtb3ZlKT1cInJlbW92ZUZpbGUoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGZvciAoZmlsZSBvZiBhY2NlcHRlZCQgfCBhc3luYzsgdHJhY2sgZmlsZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgPHR1aS1maWxlXG4gICAgICAgICAgICAgICAgICAgIFtmaWxlXT1cImZpbGVcIlxuICAgICAgICAgICAgICAgICAgICAocmVtb3ZlKT1cInJlbW92ZUZpbGUoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC90dWktZmlsZXM+XG5cbiAgICAgICAgPHR1aS1lcnJvclxuICAgICAgICAgICAgW2Vycm9yXT1cIlsnbWF4TGVuZ3RoJ10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xGaWxlXCJcbiAgICAgICAgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJ0dWktZm9ybV9fZmllbGQtbm90ZVwiPtCd0LDQv9GA0LjQvNC10YAsINGE0L7RgtC+0LPRgNCw0YTQuNGOINC/0L7QstGA0LXQttC00LXQvdC40Lkg0Lgg0LTQtdGE0YTQtdC60YLQvtCyLCDRh9GC0L4g0L/QvtGB0LvRg9C20LjRgiDQtNC+0LrQsNC30LDRgtC10LvRjNGB0YLQstC+0Lwg0L3QtdGB0L7QvtGC0LLQtdGC0YHRgtCy0LjRjyDQt9Cw0Y/QstC70LXQvdC90L7Qs9C+INC60LDRh9C10YHRgtCy0LAg0YLQvtCy0LDRgNCwLjwvcD5cbiAgICA8L2Rpdj5cbjwvZm9ybT5cbiJdfQ==
565
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Mtb3JkZXItZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvb3JkZXIvb3JkZXItZm9ybS9zYy1vcmRlci1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9vcmRlci9vcmRlci1mb3JtL3NjLW9yZGVyLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNFZBQTRWO0FBRTVWLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsTCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUUsT0FBTyxFQUFtQixXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBb0IsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekksT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFDSCxzQkFBc0IsRUFDdEIsU0FBUyxFQUNULFlBQVksRUFFWixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLHdCQUF3QixFQUN4QixjQUFjLEVBT2QsU0FBUyxFQUNULGVBQWUsRUFDZixhQUFhLEVBQ2IsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxjQUFjLEVBRWQsa0JBQWtCLEVBQ2xCLGtCQUFrQixHQUNyQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFB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Q1IsT0FBTzt3QkFDUCxrQkFBa0I7d0JBQ2xCLGlCQUFpQjt3QkFDakIsYUFBYTt3QkFDYixzQkFBc0I7d0JBQ3RCLGlCQUFpQjt3QkFDakIsT0FBTzt3QkFDUCxTQUFTO3dCQUNULGlCQUFpQjt3QkFDakIsbUJBQW1CO3dCQUNuQixpQ0FBaUM7cUJBQ3BDLGFBQ1UsQ0FBQyxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb24scnhqcy9uby1zaGFyZXJlcGxheSxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbixAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2QsQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50LEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGwsQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudCxzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvbiAqL1xuXG5pbXBvcnQgeyBBc3luY1BpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgRGVzdHJveVJlZiwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgT25Jbml0LCBvdXRwdXQsIFNpZ25hbCwgc2lnbmFsLCB2aWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgICBJU19SVU5OSU5HX09OX1RFUk1JTkFMLFxuICAgIElTX1NFUlZFUixcbiAgICBTQ19VU0VSX0lORk8sXG4gICAgU2NDb250cmFnZW50LFxuICAgIFNjQ29udHJhZ2VudFNlcnZpY2UsXG4gICAgU2NDb252ZXJ0ZXJzU2VydmljZSxcbiAgICBTY0RlbGl2ZXJ5QWRkcmVzc1NlcnZpY2UsXG4gICAgU2NEZWxpdmVyeVR5cGUsXG4gICAgU2NJQXBpRXJyb3JSZXNwb25zZSxcbiAgICBTY0lEZWxpdmVyeUFkZHJlc3MsXG4gICAgU2NJTmV3T3JkZXIsXG4gICAgU2NJUmVmZXJlbmNlc1R5cGVzLFxuICAgIFNjSVRlcm1pbmFsUHJvdmlkZXIsXG4gICAgU2NJV2FyZWhvdXNlLFxuICAgIFNjT3BmTGlzdCxcbiAgICBTY09yZGVyc1NlcnZpY2UsXG4gICAgU2NQYXltZW50VHlwZSxcbiAgICBTY1JlZmVyZW5jZXNTZXJ2aWNlLFxuICAgIFNjVUlTZXJ2aWNlLFxuICAgIFNjVXBsb2FkZWRGaWxlLFxuICAgIFNjVXNlcixcbiAgICBTY1dhcmVob3VzZVNlcnZpY2UsXG4gICAgVEVSTUlOQUxfUFJPVklERVJTLFxufSBmcm9tICdAc25hYmNlbnRyL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IFR1aUNvbnRleHQsIHR1aUNvbnRyb2xWYWx1ZSwgVHVpRGF5LCB0dWlJc1ByZXNlbnQsIFR1aVN0cmluZ0hhbmRsZXIsIFR1aVZhbGlkYXRpb25FcnJvciB9IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHsgVHVpRGF0YUxpc3RDb21wb25lbnQsIFR1aURpYWxvZ1NlcnZpY2UsIFR1aUVycm9yLCBUdWlMYWJlbCwgVHVpTGluaywgVHVpTG9hZGVyLCBUdWlNYXJrZXJIYW5kbGVyLCBUdWlPcHRpb24gfSBmcm9tICdAdGFpZ2EtdWkvY29yZSc7XG5pbXBvcnQgeyBUdWlEYXRhTGlzdERpcmVjdGl2ZSB9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvZGF0YS1saXN0JztcbmltcG9ydCB7IFR1aUZpZWxkRXJyb3JQaXBlLCBUdWlGaWxlLCBUdWlGaWxlTGlrZSwgVHVpRmlsZVJlamVjdGVkUGlwZSwgdHVpRmlsZXNBY2NlcHRlZCwgVHVpRmlsZXNDb21wb25lbnQsIFR1aUlucHV0RmlsZXMsIFR1aUlucHV0RmlsZXNEaXJlY3RpdmUgfSBmcm9tICdAdGFpZ2EtdWkva2l0JztcbmltcG9ydCB7IFR1aUlucHV0RGF0ZU1vZHVsZSwgVHVpU2VsZWN0TW9kdWxlLCBUdWlUZXh0YXJlYU1vZHVsZSB9IGZyb20gJ0B0YWlnYS11aS9sZWdhY3knO1xuaW1wb3J0IHsgUG9seW1vcnBoZXVzQ29tcG9uZW50IH0gZnJvbSAnQHRhaWdhLXVpL3BvbHltb3JwaGV1cyc7XG5pbXBvcnQgeyBmb3JtYXQsIGlzVmFsaWQsIHBhcnNlIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNTdHJpbmcgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgY29tYmluZUxhdGVzdCwgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGZpcnN0LCBtYXAsIG1lcmdlLCBPYnNlcnZhYmxlLCBvZiwgcmV0cnksIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRhcCwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTY0FkZENvbnRyYWdlbnREaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb250cmFnZW50cy9hZGQtY29udHJhZ2VudC1kaWFsb2cvc2MtYWRkLWNvbnRyYWdlbnQtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTY0FkZERlbGl2ZXJ5QWRkcmVzc0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2RlbGl2ZXJ5LWFkZHJlc3MvYWRkLWRlbGl2ZXJ5LWFkZHJlc3MtZGlhbG9nL3NjLWFkZC1kZWxpdmVyeS1hZGRyZXNzLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2NGb2N1c0ZpcnN0SW52YWxpZEZpZWxkRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9zYy1mb2N1cy1maXJzdC1pbnZhbGlkLWZpZWxkLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJTmV3T3JkZXJGb3JtIH0gZnJvbSAnLi4vbW9kZWxzL2ktbmV3LW9yZGVyLWZvcm0nO1xuaW1wb3J0IHsgU0NfT1JERVJfRk9STV9DT05GSUcgfSBmcm9tICcuL3NjLW9yZGVyLWZvcm0uY29uZmlnJztcblxuLyoqXG4gKiDQotC40L/Riywg0LrQvtGC0L7RgNGL0LUg0LLQvtC30LzQvtC20L3QviDQv9GA0LXQvtCx0YDQsNC30L7QstCw0YLRjCDQsiDQt9C90LDRh9C10L3QuNC1LCDQvtGC0L7QsdGA0LDQttCw0LXQvNC+0LUg0LIg0L/QvtC70LUg0LLQstC+0LTQsC5cbiAqL1xudHlwZSBTZWxlY3RUeXBlID1cbiAgICB8IFNjSVJlZmVyZW5jZXNUeXBlczxTY1BheW1lbnRUeXBlLCB0eXBlb2YgU2NQYXltZW50VHlwZT5cbiAgICB8IFNjQ29udHJhZ2VudFxuICAgIHwgU2NJUmVmZXJlbmNlc1R5cGVzPFNjRGVsaXZlcnlUeXBlLCB0eXBlb2YgU2NEZWxpdmVyeVR5cGU+XG4gICAgfCBTY0lXYXJlaG91c2VcbiAgICB8IFNjSURlbGl2ZXJ5QWRkcmVzcztcblxuLyoqXG4gKiDQpNC+0YDQvNCwINC+0YTQvtGA0LzQu9C10L3QuNGPINC30LDQutCw0LfQsC5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3NjLW9yZGVyLWZvcm0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zYy1vcmRlci1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zYy1vcmRlci1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBSb3V0ZXJMaW5rLFxuICAgICAgICBUdWlMb2FkZXIsXG4gICAgICAgIFR1aUxhYmVsLFxuICAgICAgICBUdWlTZWxlY3RNb2R1bGUsXG4gICAgICAgIFR1aURhdGFMaXN0RGlyZWN0aXZlLFxuICAgICAgICBUdWlEYXRhTGlzdENvbXBvbmVudCxcbiAgICAgICAgVHVpT3B0aW9uLFxuICAgICAgICBUdWlFcnJvcixcbiAgICAgICAgVHVpTGluayxcbiAgICAgICAgVHVpSW5wdXREYXRlTW9kdWxlLFxuICAgICAgICBUdWlUZXh0YXJlYU1vZHVsZSxcbiAgICAgICAgVHVpSW5wdXRGaWxlcyxcbiAgICAgICAgVHVpSW5wdXRGaWxlc0RpcmVjdGl2ZSxcbiAgICAgICAgVHVpRmlsZXNDb21wb25lbnQsXG4gICAgICAgIFR1aUZpbGUsXG4gICAgICAgIEFzeW5jUGlwZSxcbiAgICAgICAgVHVpRmllbGRFcnJvclBpcGUsXG4gICAgICAgIFR1aUZpbGVSZWplY3RlZFBpcGUsXG4gICAgICAgIFNjRm9jdXNGaXJzdEludmFsaWRGaWVsZERpcmVjdGl2ZSxcbiAgICBdLFxuICAgIHByb3ZpZGVyczogW1RFUk1JTkFMX1BST1ZJREVSU10sXG59KVxuZXhwb3J0IGNsYXNzIFNjT3JkZXJGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICAvKipcbiAgICAgKiDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQvdCw0L/RgNCw0LLQu9C10L3QuNGPINC/0YDQvtC00LDQtiDQt9Cw0LrQsNC30LAuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGRpcmVjdGlvbklkID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyPigpO1xuXG4gICAgLyoqXG4gICAgICog0KLRgNC10LHQvtCy0LDRgtGMINC/0L7QtNGC0LLQtdGA0LbQtNGR0L3QvdGL0LUg0LrQvtC90YLQsNC60YLQvdGL0LUg0LTQsNC90L3Ri9C1INC00LvRjyDQvtGE0L7RgNC80LvQtdC90LjRjy4g0JTQu9GPINGH0LXRgNC90L7QstC40LrQsCDigJQgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZW5mb3JjZUFwcHJvdmVkQ29udGFjdHMgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKlxuICAgICAqINCh0L7RhdGA0LDQvdGP0YLRjCDQuCDQstC+0YHRgdGC0LDQvdCw0LLQu9C40LLQsNGC0Ywg0YfQtdGA0L3QvtCy0YvQtSDQtNCw0L3QvdGL0LUg0YTQvtGA0LzRiyDQv9C+INC90LDQv9GA0LDQstC70LXQvdC40Y4gKNC80LXRgtCw0LTQsNC90L3Ri9C1KS4g0JTQu9GPINGH0LXRgNC90L7QstC40LrQsCDigJQgYGZhbHNlYC5cbiAgICAgKiDQoNCw0LHQvtGC0LDQtdGCINGC0L7Qu9GM0LrQviDQtdGB0LvQuCDQv9GA0LXQtNC+0YHRgtCw0LLQu9C10L0g0YLQvtC60LXQvSB7QGxpbmsgU0NfT1JERVJfRk9STV9DT05GSUd9LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBwZXJzaXN0TWV0YWRhdGEgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKlxuICAgICAqINCh0L7QsdGL0YLQuNC1INC+0YLQv9GA0LDQstC60Lgg0LLQsNC70LjQtNC90L7QuSDRhNC+0YDQvNGLINC+0YTQvtGA0LzQu9C10L3QuNGPLiDQn9C+0LvQtdC30L3QsNGPINC90LDQs9GA0YPQt9C60LAg4oCUINGB0YvRgNGL0LUg0LfQvdCw0YfQtdC90LjRjyDRhNC+0YDQvNGLLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBvcmRlclN1Ym1pdCA9IG91dHB1dDxTY0lOZXdPcmRlcj4oKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDRgdC/0YDQsNCy0L7Rh9C90LjQutC+0LIuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWZlcmVuY2VzU2VydmljZSA9IGluamVjdChTY1JlZmVyZW5jZXNTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDRgNCw0LHQvtGC0Ysg0YEg0LrQvtC90YLRgNCw0LPQtdC90YLQsNC80LguXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250cmFnZW50U2VydmljZSA9IGluamVjdChTY0NvbnRyYWdlbnRTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDRgNCw0LHQvtGC0Ysg0YEg0LDQtNGA0LXRgdCw0LzQuCDQtNC+0YHRgtCw0LLQutC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVsaXZlcnlBZGRyZXNzU2VydmljZSA9IGluamVjdChTY0RlbGl2ZXJ5QWRkcmVzc1NlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINC00LvRjyDRgNCw0LHQvtGC0Ysg0YHQviDRgdC60LvQsNC00LDQvNC4LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSB3YXJlaG91c2VTZXJ2aWNlID0gaW5qZWN0KFNjV2FyZWhvdXNlU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSDQt9Cw0LrQsNC30LDQvNC4ICjQt9Cw0LPRgNGD0LfQutCwINC00LDRgiDQtNC+0YHRgtCw0LLQutC4L9GB0LDQvNC+0LLRi9Cy0L7Qt9CwKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IG9yZGVyc1NlcnZpY2UgPSBpbmplY3QoU2NPcmRlcnNTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQtNC70Y8g0YDQsNCx0L7RgtGLINGBIFVJLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdWlTZXJ2aWNlID0gaW5qZWN0KFNjVUlTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQutC+0L3QstC10YDRgtCw0YbQuNC4INC00LDQvdC90YvRhS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnZlcnRlcnNTZXJ2aWNlID0gaW5qZWN0KFNjQ29udmVydGVyc1NlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINGA0LDQsdC+0YLRiyDRgSDQtNC40LDQu9C+0LPQvtCy0YvQvCDQvtC60L3QvtC8LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nID0gaW5qZWN0KFR1aURpYWxvZ1NlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQsNC50LTQtdGAINC00LDQvdC90YvRhSDQviDRgtC10YDQvNC40L3QsNC70LUuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHRlcm1pbmFsID0gaW5qZWN0PFNjSVRlcm1pbmFsUHJvdmlkZXI+KElTX1JVTk5JTkdfT05fVEVSTUlOQUwpO1xuXG4gICAgLyoqXG4gICAgICog0J/QvtGC0L7QuiDQtNCw0L3QvdGL0YUg0L4g0YLQtdC60YPRidC10Lwg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9C1LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSB1c2VyJCA9IGluamVjdDxPYnNlcnZhYmxlPFNjVXNlcj4+KFNDX1VTRVJfSU5GTyk7XG5cbiAgICAvKipcbiAgICAgKiDQndCw0YHRgtGA0L7QudC60Lgg0YTQvtGA0LzRiyDQvtGE0L7RgNC80LvQtdC90LjRjyDQt9Cw0LrQsNC30LAuINCV0YHQu9C4INC90LUg0L/RgNC10LTQvtGB0YLQsNCy0LvQtdC90YssINC80LXRgtCw0LTQsNC90L3Ri9C1INGE0L7RgNC80Ysg0L3QtSDRgdC+0YXRgNCw0L3Rj9GO0YLRgdGPLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnID0gaW5qZWN0KFNDX09SREVSX0ZPUk1fQ09ORklHLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0Log0LLRi9C/0L7Qu9C90LXQvdC40Y8g0YHQutGA0LjQv9GC0LAg0L3QsCDRgdC10YDQstC10YDQtS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGlzU2VydmVyID0gaW5qZWN0KElTX1NFUlZFUik7XG5cbiAgICAvKipcbiAgICAgKiDQodGB0YvQu9C60LAg0LTQu9GPINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC+0LPQviDRg9C/0YDQsNCy0LvQtdC90LjRjyDRg9C90LjRh9GC0L7QttC10L3QuNC10Lwg0LfQsNCy0LjRgdC40LzQvtGB0YLQtdC5LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIC8qKlxuICAgICAqINCX0LDQtNC10YDQttC60LAg0YHRh9C40YLRi9Cy0LDQvdC40Y8g0YHQuNCz0L3QsNC70L7QsiDRhNC+0YDQvNGLLCDQtNC70Y8g0LjQt9Cx0LXQttCw0L3QuNGPINC70LjRiNC90LjRhSDQvtCx0YDQsNCx0L7RgtC+0Log0L/RgNC4INGB0LzQtdC90LUg0LfQvdCw0YfQtdC90LjQuS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYm91bmNlVGltZUZvcm1DaGFuZ2UgPSA1MDtcblxuICAgIC8qKlxuICAgICAqINCk0L7RgNC80LAg0YHQvtC30LTQsNC90LjRjyDQt9Cw0LrQsNC30LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGZvcm0gPSBuZXcgRm9ybUdyb3VwPElOZXdPcmRlckZvcm0+KHtcbiAgICAgICAgY29udHJhZ2VudElkOiBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyIHwgbnVsbD4obnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICAgIHBheW1lbnRUeXBlOiBuZXcgRm9ybUNvbnRyb2w8U2NQYXltZW50VHlwZSB8IG51bGw+KHsgdmFsdWU6IG51bGwsIGRpc2FibGVkOiB0cnVlIH0sIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgICBkZWxpdmVyeVR5cGU6IG5ldyBGb3JtQ29udHJvbDxTY0RlbGl2ZXJ5VHlwZSB8IG51bGw+KHsgdmFsdWU6IG51bGwsIGRpc2FibGVkOiB0cnVlIH0sIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgICBkZWxpdmVyeURhdGU6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPih7IHZhbHVlOiBudWxsLCBkaXNhYmxlZDogdHJ1ZSB9LCBbXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgICAgICAgKHsgdmFsdWUgfTogQWJzdHJhY3RDb250cm9sPHN0cmluZyB8IG51bGw+KTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUgfHwgdGhpcy5kZWxpdmVyeURhdGVzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgIXRoaXMuZGVsaXZlcnlEYXRlcygpLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzZXJ2ZXJSZXNwb25zZTogJ9Cj0LrQsNC20LjRgtC1INC60L7RgNGA0LXQutGC0L3Rg9GOINC00LDRgtGDLCDQuNC70Lgg0LLRi9Cx0LXRgNC40YLQtSDQuNC3INCw0LrRgtC40LLQvdGL0YUg0LTQsNGCINC60LDQu9C10L3QtNCw0YDRjycgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgICB3YXJlaG91c2VJZDogbmV3IEZvcm1Db250cm9sPG51bWJlciB8IG51bGw+KHsgdmFsdWU6IG51bGwsIGRpc2FibGVkOiB0cnVlIH0sIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgICBhZGRyZXNzSWQ6IG5ldyBGb3JtQ29udHJvbDxudW1iZXIgfCBudWxsPih7IHZhbHVlOiBudWxsLCBkaXNhYmxlZDogdHJ1ZSB9LCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgICAgY29tbWVudDogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpLFxuICAgICAgICBpbWFnZTogbmV3IEZvcm1Db250cm9sPFNjVXBsb2FkZWRGaWxlIHwgbnVsbD4obnVsbCksXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0LvQtSDRhNCw0LnQu9CwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjb250cm9sRmlsZSA9IG5ldyBGb3JtQ29udHJvbDxGaWxlIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0YHQv9C40YHQutCwINC/0L7QtNGC0LLQtdGA0LbQtNGR0L3QvdGL0YUg0YTQsNC50LvQvtCyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBhY2NlcHRlZCQgPSB0aGlzLmNvbnRyb2xGaWxlLnZhbHVlQ2hhbmdlcy5waXBlKG1hcCgoKSA9PiB0dWlGaWxlc0FjY2VwdGVkKHRoaXMuY29udHJvbEZpbGUpKSk7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiwg0YfRgtC+INCy0LrQu9GO0YfRkdC9INGA0LXQttC40Lwg0LDQvdC40LzQsNGG0LjQuCDQv9GA0LXQtNGD0L/RgNC10LbQtNC10L3QuNGPINC+INC90LXQv9C+0LTRgtCy0LXRgNC20LTRkdC90L3Ri9GFINC00LDQvdC90YvRhS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2FybmluZ1NoYWtlID0gc2lnbmFsKGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqINCf0YDQuNC30L3QsNC6LCDRh9GC0L4g0LrQvtC90YLRgNCw0LPQtdC90YIg0Y/QstC70Y/QtdGC0YHRjyDRhNC40LfQuNGH0LXRgdC60LjQvCDQu9C40YbQvtC8LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc0luZGl2aWR1YWwgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC/0LjRgdC+0Log0LLQvtC30LzQvtC20L3Ri9GFINC00LDRgiDRgdCw0LzQvtCy0YvQstC+0LfQsCDRgdC+INGB0LrQu9Cw0LTQsC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHdhcmVob3VzZURlbGl2ZXJ5RGF0ZXMgPSBzaWduYWw8c3RyaW5nW10+KFtdKTtcblxuICAgIC8qKlxuICAgICAqINCh0L/QuNGB0L7QuiDQstC+0LfQvNC+0LbQvdGL0YUg0LTQsNGCINC00L7RgdGC0LDQstC60LguXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBhZGRyZXNzRGVsaXZlcnlEYXRlcyA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INGB0L/QuNGB0LrQsCDQutC+0L3RgtGA0LDQs9C10L3RgtC+0LIg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjb250cmFnZW50cyQ6IE9ic2VydmFibGU8U2NDb250cmFnZW50W10gfCBudWxsPiA9IHRoaXMuY29udHJhZ2VudFNlcnZpY2UuY29udHJhZ2VudHMkO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INGB0L/QuNGB0LrQsCDQsNC00YDQtdGB0L7QsiDQutC+0L3RgtGA0LDQs9C10L3RgtCwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBhZGRyZXNzZXMkOiBPYnNlcnZhYmxlPFNjSURlbGl2ZXJ5QWRkcmVzc1tdIHwgbnVsbD4gPSB0aGlzLmRlbGl2ZXJ5QWRkcmVzc1NlcnZpY2UuZGVsaXZlcnlBZGRyZXNzZXMkLnBpcGUoXG4gICAgICAgIHRhcCgoZGVsaXZlcnlBZGRyZXNzZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChkZWxpdmVyeUFkZHJlc3NlcyAmJiB0aGlzLmZvcm0uY29udHJvbHMuYWRkcmVzc0lkLnZhbHVlICYmICFkZWxpdmVyeUFkZHJlc3Nlcy5zb21lKChkZWxpdmVyeSkgPT4gZGVsaXZlcnkuaWQgPT09IHRoaXMuZm9ybS5jb250cm9scy5hZGRyZXNzSWQudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmFkZHJlc3NJZC5yZXNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0YHQv9C40YHQutCwINGB0LrQu9Cw0LTQvtCyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSB3YXJlaG91c2VzJDogT2JzZXJ2YWJsZTxTY0lXYXJlaG91c2VbXT4gPSB0aGlzLndhcmVob3VzZVNlcnZpY2UuZ2V0V2FyZWhvdXNlcyQoKTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDQntCf0KQg0LLRi9Cx0YDQsNC90L3QvtCz0L4g0LrQvtC90YLRgNCw0LPQtdC90YLQsC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wZiQgPSB0dWlDb250cm9sVmFsdWU8bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZD4odGhpcy5mb3JtLmNvbnRyb2xzLmNvbnRyYWdlbnRJZCkucGlwZShcbiAgICAgICAgZmlsdGVyKHR1aUlzUHJlc2VudCksXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMucGF5bWVudFR5cGUuZW5hYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlUeXBlLmVuYWJsZSgpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKChzZWxlY3RDb250cmFnZW50SWQpID0+XG4gICAgICAgICAgICB0aGlzLmNvbnRyYWdlbnRzJC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcih0dWlJc1ByZXNlbnQpLFxuICAgICAgICAgICAgICAgIG1hcCgoY29udHJhZ2VudHM6IFNjQ29udHJhZ2VudFtdKSA9PiBjb250cmFnZW50cy5maW5kKChjb250cmFnZW50KSA9PiBjb250cmFnZW50LmlkID09PSBzZWxlY3RDb250cmFnZW50SWQpKSxcbiAgICAgICAgICAgICAgICBtYXAoKGNvbnRyYWdlbnQpID0+IGNvbnRyYWdlbnQ/Lm9wZiksXG4gICAgICAgICAgICAgICAgdGFwKChvcGYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0luZGl2aWR1YWwuc2V0KG9wZj8uaWQgPT09IFNjT3BmTGlzdC5pbmRpdmlkdWFsLnZhbHVlT2YoKSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgc2hhcmVSZXBsYXkoMSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDRgtC40L/QvtCyINC+0L/Qu9Cw0YLRiyDQt9Cw0LrQsNC30LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBheW1lbnRUeXBlcyQ6IE9ic2VydmFibGU8QXJyYXk8U2NJUmVmZXJlbmNlc1R5cGVzPFNjUGF5bWVudFR5cGUsIHR5cGVvZiBTY1BheW1lbnRUeXBlPj4+ID0gdGhpcy5vcGYkLnBpcGUoXG4gICAgICAgIG1hcCgob3BmKSA9PiBvcGYgJiYgKG9wZi5pZCA9PT0gU2NPcGZMaXN0LmluZGl2aWR1YWwgPyBTY1BheW1lbnRUeXBlLmJlem5hbDIgOiBTY1BheW1lbnRUeXBlLm9ubGluZSkpLFxuICAgICAgICBzd2l0Y2hNYXAoKHBheW1lbnRUeXBlRmlsdGVyKSA9PlxuICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VzU2VydmljZS5wYXltZW50VHlwZXMkLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChwYXltZW50VHlwZXMpID0+IChwYXltZW50VHlwZUZpbHRlciA/IHBheW1lbnRUeXBlcyA6IFtdKSksXG4gICAgICAgICAgICAgICAgbWFwKChwYXltZW50VHlwZXMpID0+IHBheW1lbnRUeXBlcy5maWx0ZXIoKHR5cGUpID0+IHR5cGUuaWQgIT09IHBheW1lbnRUeXBlRmlsdGVyKSksXG4gICAgICAgICAgICAgICAgdGFwKChwYXltZW50VHlwZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybS5jb250cm9scy5wYXltZW50VHlwZS52YWx1ZSAmJiAhcGF5bWVudFR5cGVzLnNvbWUoKHBheW1lbnQpID0+IHBheW1lbnQuaWQgPT09IHRoaXMuZm9ybS5jb250cm9scy5wYXltZW50VHlwZS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5wYXltZW50VHlwZS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5mb3JtLmNvbnRyb2xzLnBheW1lbnRUeXBlLnZhbHVlICYmIHBheW1lbnRUeXBlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5wYXltZW50VHlwZS5wYXRjaFZhbHVlKHBheW1lbnRUeXBlc1swXS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDRgtC40L/QvtCyINC00L7RgdGC0LDQstC60Lgg0LfQsNC60LDQt9CwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkZWxpdmVyeVR5cGVzJDogT2JzZXJ2YWJsZTxBcnJheTxTY0lSZWZlcmVuY2VzVHlwZXM8U2NEZWxpdmVyeVR5cGUsIHR5cGVvZiBTY0RlbGl2ZXJ5VHlwZT4+PiA9IHRoaXMub3BmJC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKG9wZikgPT5cbiAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlc1NlcnZpY2UuZGVsaXZlcnlUeXBlcyQucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGRlbGl2ZXJ5VHlwZXMpID0+IChvcGYgPyBkZWxpdmVyeVR5cGVzIDogW10pKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKGRlbGl2ZXJ5VHlwZXMpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsaXZlcnlBZGRyZXNzU2VydmljZS5kZWxpdmVyeUFkZHJlc3NlcyQucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoZGVsaXZlcnlBZGRyZXNzZXMpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BmPy5pZCA9PT0gU2NPcGZMaXN0LmluZGl2aWR1YWwgJiYgIShkZWxpdmVyeUFkZHJlc3NlcyAmJiBkZWxpdmVyeUFkZHJlc3Nlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlbGl2ZXJ5VHlwZXMuZmlsdGVyKCh0eXBlKSA9PiB0eXBlLmlkICE9PSBTY0RlbGl2ZXJ5VHlwZS5kZWxpdmVyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZWxpdmVyeVR5cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHRhcCgoZGVsaXZlcnlUeXBlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtLmNvbnRyb2xzLmRlbGl2ZXJ5VHlwZS52YWx1ZSAmJiAhZGVsaXZlcnlUeXBlcy5zb21lKChkZWxpdmVyeSkgPT4gZGVsaXZlcnkuaWQgPT09IHRoaXMuZm9ybS5jb250cm9scy5kZWxpdmVyeVR5cGUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlUeXBlLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlUeXBlLnZhbHVlICYmIGRlbGl2ZXJ5VHlwZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlUeXBlLnBhdGNoVmFsdWUoZGVsaXZlcnlUeXBlc1swXS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqINCf0YDQuNC30L3QsNC6LCDRh9GC0L4g0LLRi9Cx0YDQsNC9INGC0LjQvyDQvtC/0LvQsNGC0Ysg0L3QsNC70LjRh9C90YvQvNC4LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc0Nhc2hQYXltZW50U2VsZWN0ZWQ6IFNpZ25hbDxib29sZWFuPiA9IHRvU2lnbmFsKFxuICAgICAgICB0dWlDb250cm9sVmFsdWU8U2NQYXltZW50VHlwZSB8IG51bGw+KHRoaXMuZm9ybS5jb250cm9scy5wYXltZW50VHlwZSkucGlwZShtYXAoKHBheW1lbnRUeXBlKSA9PiBwYXltZW50VHlwZSA9PT0gU2NQYXltZW50VHlwZS5uYWwpKSxcbiAgICAgICAgeyBpbml0aWFsVmFsdWU6IGZhbHNlIH1cbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0LosINGH0YLQviDQvdC+0LzQtdGAINGC0LXQu9C10YTQvtC90LAg0L/QvtC00YLQstC10YDQttC00ZHQvS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNQaG9uZUFwcHJvdmVkOiBTaWduYWw8Ym9vbGVhbj4gPSB0b1NpZ25hbChcbiAgICAgICAgdGhpcy51c2VyJC5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKCh1c2VyKSA9PiAhdXNlci5pc0d1ZXN0KSxcbiAgICAgICAgICAgIG1hcCgodXNlcikgPT4gdXNlci5jb250YWN0cy5waG9uZS5pc0FwcHJvdmVkKVxuICAgICAgICApLFxuICAgICAgICB7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9XG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqINCf0YDQuNC30L3QsNC6LCDRh9GC0L4g0LDQtNGA0LXRgSDRjdC70LXQutGC0YDQvtC90L3QvtC5INC/0L7Rh9GC0Ysg0L/QvtC00YLQstC10YDQttC00ZHQvSDQv9C+0LvRjNC30L7QstCw0YLQtdC70LXQvC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGlzRW1haWxBcHByb3ZlZFVzZXI6IFNpZ25hbDxib29sZWFuPiA9IHRvU2lnbmFsKFxuICAgICAgICB0aGlzLnVzZXIkLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKHVzZXIpID0+ICF1c2VyLmlzR3Vlc3QpLFxuICAgICAgICAgICAgbWFwKCh1c2VyKSA9PiB1c2VyLmNvbnRhY3RzLmVtYWlsLmlzQXBwcm92ZWQpXG4gICAgICAgICksXG4gICAgICAgIHsgaW5pdGlhbFZhbHVlOiB0cnVlIH1cbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0LosINGH0YLQviDQsNC00YDQtdGBINGN0LvQtdC60YLRgNC+0L3QvdC+0Lkg0L/QvtGH0YLRiyDQv9C+0LTRgtCy0LXRgNC20LTRkdC9INC40LvQuCDQutC+0L3RgtGA0LDQs9C10L3RgiDRj9Cy0LvRj9C10YLRgdGPINGE0LjQt9C40YfQtdGB0LrQuNC8INC70LjRhtC+0LwuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzRW1haWxBcHByb3ZlZDogU2lnbmFsPGJvb2xlYW4+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pc0VtYWlsQXBwcm92ZWRVc2VyKCkgfHwgdGhpcy5pc0luZGl2aWR1YWwoKSk7XG5cbiAgICAvKipcbiAgICAgKiDQl9C90LDRh9C10L3QuNC1INCy0YvQsdGA0LDQvdC90L7Qs9C+INGC0LjQv9CwINC00L7RgdGC0LDQstC60LguXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWxpdmVyeVR5cGVWYWx1ZSA9IHRvU2lnbmFsKHR1aUNvbnRyb2xWYWx1ZTxTY0RlbGl2ZXJ5VHlwZSB8IG51bGw+KHRoaXMuZm9ybS5jb250cm9scy5kZWxpdmVyeVR5cGUpLCB7IGluaXRpYWxWYWx1ZTogbnVsbCB9KTtcblxuICAgIC8qKlxuICAgICAqINCf0YDQuNC30L3QsNC6LCDRh9GC0L4g0LLRi9Cx0YDQsNC9INGC0LjQvyDQtNC+0YHRgtCw0LLQutC4IFwi0JTQvtGB0YLQsNCy0LrQsFwiLlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtZnVuY3Rpb24tc2NvcGluZ1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc0RlbGl2ZXJ5ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5kZWxpdmVyeVR5cGVWYWx1ZSgpID09PSBTY0RlbGl2ZXJ5VHlwZS5kZWxpdmVyeSk7XG5cbiAgICAvKipcbiAgICAgKiDQndCw0LHQvtGAINC00L7RgdGC0YPQv9C90YvRhSDQtNCw0YIg0LIg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCDQvtGCINGC0LjQv9CwINC00L7RgdGC0LDQstC60LguXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlbGl2ZXJ5RGF0ZXMgPSBjb21wdXRlZDxzdHJpbmdbXT4oKCkgPT5cbiAgICAgICAgdGhpcy5kZWxpdmVyeVR5cGVWYWx1ZSgpID09PSBTY0RlbGl2ZXJ5VHlwZS5zZWxmX2RlbGl2ZXJ5ID8gdGhpcy53YXJlaG91c2VEZWxpdmVyeURhdGVzKCkgOiB0aGlzLmFkZHJlc3NEZWxpdmVyeURhdGVzKClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0J3QsNCx0L7RgCDQtNC+0YHRgtGD0L/QvdGL0YUg0LTQsNGCINCyINCy0LjQtNC1INC00LDRgiDQutCw0LvQtdC90LTQsNGA0Y8sINC+0YLRgdC+0YDRgtC40YDQvtCy0LDQvdC90YvQuSDQv9C+INCy0L7Qt9GA0LDRgdGC0LDQvdC40Y4uXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWxpdmVyeURheXMgPSBjb21wdXRlZDxUdWlEYXlbXT4oKCkgPT5cbiAgICAgICAgdGhpcy5kZWxpdmVyeURhdGVzKClcbiAgICAgICAgICAgIC5tYXAoKGRhdGUpID0+IFR1aURheS5ub3JtYWxpemVQYXJzZShkYXRlLnNsaWNlKDAsIDEwKSwgJ1lNRCcpKVxuICAgICAgICAgICAgLnNvcnQoKGZpcnN0RGF5LCBzZWNvbmREYXkpID0+IChmaXJzdERheS5kYXlTYW1lT3JCZWZvcmUoc2Vjb25kRGF5KSA/IC0xIDogMSkpXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqINCf0LXRgNCy0LDRjyDQtNC+0YHRgtGD0L/QvdCw0Y8g0LTQsNGC0LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1pbkRlbGl2ZXJ5RGF5ID0gY29tcHV0ZWQ8VHVpRGF5IHwgbnVsbD4oKCkgPT4gdGhpcy5kZWxpdmVyeURheXMoKVswXSA/PyBudWxsKTtcblxuICAgIC8qKlxuICAgICAqINCf0L7RgdC70LXQtNC90Y/RjyDQtNC+0YHRgtGD0L/QvdCw0Y8g0LTQsNGC0LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1heERlbGl2ZXJ5RGF5ID0gY29tcHV0ZWQ8VHVpRGF5IHwgbnVsbD4oKCkgPT4gdGhpcy5kZWxpdmVyeURheXMoKS5hdCgtMSkgPz8gbnVsbCk7XG5cbiAgICAvKipcbiAgICAgKiDQodGB0YvQu9C60LAg0L3QsCDRjdC70LXQvNC10L3RgiDRgSDQv9GA0LXQtNGD0L/RgNC10LbQtNC10L3QuNC10Lwg0L4g0L3QtdC/0L7QtNGC0LLQtdGA0LbQtNGR0L3QvdGL0YUg0LTQsNC90L3Ri9GFLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSB1bmNvbmZpcm1lZERhdGFXYXJuaW5nID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PigndW5jb25maXJtZWREYXRhV2FybmluZycpO1xuXG4gICAgLyoqXG4gICAgICog0JLQvtC30LLRgNCw0YnQsNC10YIg0LzQsNGA0LrQtdGALCDQutC+0YLQvtGA0YvQvCDQstGL0LTQtdC70Y/QtdGC0YHRjyDQtNC+0YHRgtGD0L/QvdCw0Y8g0LTQu9GPINCy0YvQsdC+0YDQsCDQtNCw0YLQsC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRlINCU0LDRgtCwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkZWxpdmVyeURhdGVNYXJrZXI6IFR1aU1hcmtlckhhbmRsZXIgPSAoZGF0ZTogVHVpRGF5KSA9PiAodGhpcy5kZWxpdmVyeURhdGVGaWx0ZXIoZGF0ZSkgPyBbXSA6IFsndmFyKC0tdHVpLWJhY2tncm91bmQtYWNjZW50LTEpJ10pO1xuXG4gICAgLyoqXG4gICAgICog0JLQvtC30LLRgNCw0YnQsNC10YIg0L/RgNC40LfQvdCw0LosINGH0YLQviDRg9C60LDQt9Cw0L3QvdCw0Y8g0LTQsNGC0LAg0L3QtdC00L7RgdGC0YPQv9C90LAg0LTQu9GPINCy0YvQsdC+0YDQsC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRlINCU0LDRgtCwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkZWxpdmVyeURhdGVGaWx0ZXIgPSAoZGF0ZTogVHVpRGF5KTogYm9vbGVhbiA9PiAhdGhpcy5kZWxpdmVyeURhdGVzKCkuaW5jbHVkZXMoYCR7ZGF0ZS50b1N0cmluZygnWU1EJywgJy0nKX0gMDA6MDA6MDBgKTtcblxuICAgIC8qKlxuICAgICAqINCY0L3QuNGG0LjQsNC70LjQt9C40YDRg9C10YIg0Y3QutC30LXQvNC/0LvRj9GAINC60LvQsNGB0YHQsCB7QGxpbmsgU2NPcmRlckZvcm1Db21wb25lbnR9LlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8g0JDQstGC0L7QvNCw0YLQuNGH0LXRgdC60Lgg0LLRi9Cx0LjRgNCw0LXQvCDQtdC00LjQvdGB0YLQstC10L3QvdC+0LPQviDQutC+0L3RgtGA0LDQs9C10L3RgtCwLdGE0LjQt9C70LjRhtC+LlxuICAgICAgICB0aGlzLmNvbnRyYWdlbnRzJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChjb250cmFnZW50cyk6IGNvbnRyYWdlbnRzIGlzIFtTY0NvbnRyYWdlbnRdID0+ICEhY29udHJhZ2VudHMgJiYgY29udHJhZ2VudHMubGVuZ3RoID09PSAxKSxcbiAgICAgICAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgICAgICAgIGZpbHRlcigoW2NvbnRyYWdlbnRdKSA9PiBjb250cmFnZW50Lm9wZi5pZCA9PT0gU2NPcGZMaXN0LmluZGl2aWR1YWwudmFsdWVPZigpKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoW2NvbnRyYWdlbnRdKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmNvbnRyYWdlbnRJZD8ucGF0Y2hWYWx1ZShjb250cmFnZW50LmlkKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaW5pdEZvcm1DaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICAvLyDQktC+0YHRgdGC0LDQvdCw0LLQu9C40LLQsNC10Lwg0Lgg0YHQvtGF0YDQsNC90Y/QtdC8INGH0LXRgNC90L7QstGL0LUg0LTQsNC90L3Ri9C1INGE0L7RgNC80Ysg0L/QviDQvdCw0L/RgNCw0LLQu9C10L3QuNGOLlxuICAgICAgICBpZiAodGhpcy5wZXJzaXN0TWV0YWRhdGEoKSkge1xuICAgICAgICAgICAgdGhpcy5pbml0TWV0YWRhdGEoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0L7QsdGK0LXQutGC0Ysg0LIg0LfQvdCw0YfQtdC90LjRjywg0L7RgtC+0LHRgNCw0LbQsNC10LzQvtC1INCyINC/0L7Qu9C1INCy0LLQvtC00LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbXMg0JLRi9Cx0YDQsNC90L3Ri9C1INC+0LHRitC10LrRgtGLINCy0YvQv9Cw0LTQsNGO0YnQtdCz0L4g0YHQv9C40YHQutCwLlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gICAgcHVibGljIHN0cmluZ2lmeShpdGVtczogcmVhZG9ubHkgU2VsZWN0VHlwZVtdKTogVHVpU3RyaW5nSGFuZGxlcjxUdWlDb250ZXh0PG51bWJlcj4+IHtcbiAgICAgICAgY29uc3QgaXRlbXNNYXAgPSBuZXcgTWFwKFxuICAgICAgICAgICAgaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tbmVzdGVkLXRlcm5hcnksc29uYXJqcy9uby1uZXN0ZWQtY29uZGl0aW9uYWxcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gJ25hbWUnIGluIGl0ZW0gPyBpdGVtLm5hbWUgOiAnYWRkcmVzcycgaW4gaXRlbSA/IGl0ZW0uYWRkcmVzcyA6ICcnO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtpdGVtLmlkLCBuYW1lXSBhcyBbbnVtYmVyLCBzdHJpbmddO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gKHsgJGltcGxpY2l0IH06IFR1aUNvbnRleHQ8bnVtYmVyPikgPT4gaXRlbXNNYXAuZ2V0KCRpbXBsaWNpdCkgPz8gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGCINC+0YLQv9GA0LDQstC60YMg0YTQvtGA0LzRizog0LLQsNC70LjQtNC40YDRg9C10YIg0Lgg0Y3QvNC40YLQuNGCINC00LDQvdC90YvQtSDQt9Cw0LrQsNC30LAg0YDQvtC00LjRgtC10LvRji5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3VibWl0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuXG4gICAgICAgIGlmICghdGhpcy5mb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250YWN0c0FwcHJvdmVkID0gIXRoaXMuZW5mb3JjZUFwcHJvdmVkQ29udGFjdHMoKSB8fCAodGhpcy5pc1Bob25lQXBwcm92ZWQoKSAmJiB0aGlzLmlzRW1haWxBcHByb3ZlZCgpKTtcblxuICAgICAgICBpZiAoIWNvbnRhY3RzQXBwcm92ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVuY29uZmlybWVkV2FybmluZygpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9yZGVyU3VibWl0LmVtaXQodGhpcy5mb3JtLmdldFJhd1ZhbHVlKCkgYXMgU2NJTmV3T3JkZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0YDQuNC80LXQvdGP0LXRgiDQuiDQv9C+0LvRj9C8INGE0L7RgNC80Ysg0L7RiNC40LHQutC4LCDQv9GA0LjRiNC10LTRiNC40LUg0L7RgiDRgdC10YDQstC10YDQsC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcnJvciDQntGC0LLQtdGCINGB0LXRgNCy0LXRgNCwINGBINC+0YjQuNCx0LrQsNC80LguXG4gICAgICovXG4gICAgcHVibGljIGFwcGx5U2VydmVyRXJyb3JzKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGVycm9ycywgbWVzc2FnZSB9ID0gZXJyb3IuZXJyb3IgYXMgU2NJQXBpRXJyb3JSZXNwb25zZTtcblxuICAgICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhlcnJvcnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09ICdkZWxpdmVyeURhdGUnICYmIGlzQXJyYXkoZXJyb3JzW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoa2V5KT8uc2V0RXJyb3JzKHsgc2VydmVyUmVzcG9uc2U6IG5ldyBUdWlWYWxpZGF0aW9uRXJyb3IoZXJyb3JzW2tleV0uYXQoMSkgPz8gZXJyb3JzW2tleV0uYXQoMCkpIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoa2V5KT8uc2V0RXJyb3JzKHsgc2VydmVyUmVzcG9uc2U6IG5ldyBUdWlWYWxpZGF0aW9uRXJyb3IoZXJyb3JzW2tleV0pIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KGtleSk/Lm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5zZXRFcnJvcnMoeyBzZXJ2ZXJSZXNwb25zZTogbmV3IFR1aVZhbGlkYXRpb25FcnJvcihtZXNzYWdlKSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0LTQsNC70Y/QtdGCINGE0LDQudC7INC40Lcg0YTQvtGA0LzRiyDQt9Cw0LrQsNC30LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlbW92ZUZpbGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udHJvbEZpbGUucmVzZXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntGC0LrRgNGL0LLQsNC10YIg0LTQuNCw0LvQvtCz0L7QstC+0LUg0L7QutC90L4g0LTQvtCx0LDQstC70LXQvdC40Y8g0LDQtNGA0LXRgdCwINC00L7RgdGC0LDQstC60LguXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFkZERlbGl2ZXJ5QWRkcmVzcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaWFsb2dcbiAgICAgICAgICAgIC5vcGVuKG5ldyBQb2x5bW9ycGhldXNDb21wb25lbnQoU2NBZGREZWxpdmVyeUFkZHJlc3NEaWFsb2dDb21wb25lbnQpLCB7XG4gICAgICAgICAgICAgICAgc2l6ZTogJ2wnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAn0JTQvtCx0LDQstC70LXQvdC40LUg0LDQtNGA0LXRgdCwINC00L7RgdGC0LDQstC60LgnLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntGC0LrRgNGL0LLQsNC10YIg0LTQuNCw0LvQvtCz0L7QstC+0LUg0L7QutC90L4g0LTQvtCx0LDQstC70LXQvdC40Y8g0LrQvtC90YLRgNCw0LPQtdC90YLQsC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkQ29udHJhZ2VudCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaWFsb2dcbiAgICAgICAgICAgIC5vcGVuKG5ldyBQb2x5bW9ycGhldXNDb21wb25lbnQoU2NBZGRDb250cmFnZW50RGlhbG9nQ29tcG9uZW50KSwge1xuICAgICAgICAgICAgICAgIHNpemU6ICdtJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ9CU0L7QsdCw0LLQu9C10L3QuNC1INC60L7QvdGC0YDQsNCz0LXQvdGC0LAnLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQl9Cw0L/Rg9GB0LrQsNC10YIg0LDQvdC40LzQsNGG0LjRjiDQv9GA0LXQtNGD0L/RgNC10LbQtNC10L3QuNGPINC+INC90LXQv9C+0LTRgtCy0LXRgNC20LTRkdC90L3Ri9GFINC00LDQvdC90YvRhSDQuCDQv9GA0L7QutGA0YPRh9C40LLQsNC10YIg0Log0L3QtdC80YMuXG4gICAgICovXG4gICAgcHJpdmF0ZSB0cmlnZ2VyVW5jb25maXJtZWRXYXJuaW5nKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy51bmNvbmZpcm1lZERhdGFXYXJuaW5nKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzU2VydmVyICYmIGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud2FybmluZ1NoYWtlLnNldChmYWxzZSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53YXJuaW5nU2hha2Uuc2V0KHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC+0YHRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0YfQtdGA0L3QvtCy0YvQtSDQtNCw0L3QvdGL0LUg0YTQvtGA0LzRiyDQuNC3INC80LXRgtCw0LTQsNC90L3Ri9GFINC4INC40L3QuNGG0LjQsNC70LjQt9C40YDRg9C10YIg0LjRhSDRgdC+0YXRgNCw0L3QtdC90LjQtS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGluaXRNZXRhZGF0YSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBjb25maWcgfSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbWJpbmVMYXRlc3Qoe1xuICAgICAgICAgICAgb3JkZXJNZXRhZGF0YTogdGhpcy51aVNlcnZpY2UuZ2V0TmV3T3JkZXJNZXRhZGF0YSQodGhpcy5kaXJlY3Rpb25JZCgpKSxcbiAgICAgICAgICAgIHVzZXI6IHRoaXMudXNlciQucGlwZShmaWx0ZXIoKHVzZXIpID0+ICF1c2VyLmlzR3Vlc3QpKSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKGZpcnN0KCksIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyanMvY29nbml0aXZlLWNvbXBsZXhpdHlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgb3JkZXJNZXRhZGF0YSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGRlbGl2ZXJ5RGF0ZTogc3RyaW5nIHwgbnVsbCA9XG4gICAgICAgICAgICAgICAgICAgIG9yZGVyTWV0YWRhdGE/LmRlbGl2ZXJ5RGF0ZSAmJiBpc1ZhbGlkKHBhcnNlKG9yZGVyTWV0YWRhdGEuZGVsaXZlcnlEYXRlLCBjb25maWcuZGF0ZUZvcm1hdHMuYXBpLCBuZXcgRGF0ZSgpKSkgPyBvcmRlck1ldGFkYXRhLmRlbGl2ZXJ5RGF0ZSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICAvLyDQldGB0LvQuCDQtNCw0YLQsCDRgdGC0LDRgNC+0LPQviDRhNC+0YDQvNCw0YLQsCwg0YLQviDQv9GA0LXQvtCx0YDQsNC30YPQtdC8INC10ZEg0LIg0L3QvtCy0YvQuSDRhNC+0YDQvNCw0YIuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzog0KPQsdGA0LDRgtGMINGN0YLQvtGCINCx0LvQvtC6INC60L7Qs9C00LAg0LLRgdC1INC00LDRgtGLINGDINC60LvQuNC10L3RgtC+0LIg0LLRgdGC0LDQvdGD0YIg0LIg0L3QvtGA0LzQsNC70YzQvdC+0Lwg0YTQvtGA0LzQsNGC0LUuXG4gICAgICAgICAgICAgICAgaWYgKG9yZGVyTWV0YWRhdGE/LmRlbGl2ZXJ5RGF0ZSAmJiAhZGVsaXZlcnlEYXRlICYmIGlzVmFsaWQocGFyc2Uob3JkZXJNZXRhZGF0YS5kZWxpdmVyeURhdGUsIGNvbmZpZy5kYXRlRm9ybWF0cy51aURhdGUsIG5ldyBEYXRlKCkpKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeURhdGUgPSBmb3JtYXQocGFyc2Uob3JkZXJNZXRhZGF0YS5kZWxpdmVyeURhdGUsIGNvbmZpZy5kYXRlRm9ybWF0cy51aURhdGUsIG5ldyBEYXRlKCkpLCBjb25maWcuZGF0ZUZvcm1hdHMuYXBpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHVpSXNQcmVzZW50KG9yZGVyTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWdlbnRJZDogb3JkZXJNZXRhZGF0YS5jb250cmFnZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXltZW50VHlwZTogb3JkZXJNZXRhZGF0YS5jb250cmFnZW50SWQgPyBvcmRlck1ldGFkYXRhLnBheW1lbnRUeXBlIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5VHlwZTogb3JkZXJNZXRhZGF0YS5jb250cmFnZW50SWQgPyBvcmRlck1ldGFkYXRhLmRlbGl2ZXJ5VHlwZSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeURhdGU6IG9yZGVyTWV0YWRhdGEuY29udHJhZ2VudElkICYmIEJvb2xlYW4ob3JkZXJNZXRhZGF0YS5kZWxpdmVyeVR5cGUpICYmIGRlbGl2ZXJ5RGF0ZSA/IGRlbGl2ZXJ5RGF0ZSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzSWQ6IG9yZGVyTWV0YWRhdGEuZGVsaXZlcnlUeXBlID09PSBTY0RlbGl2ZXJ5VHlwZS5kZWxpdmVyeSAmJiBvcmRlck1ldGFkYXRhLmFkZHJlc3NJZCA/IG9yZGVyTWV0YWRhdGEuYWRkcmVzc0lkIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhcmVob3VzZUlkOiBvcmRlck1ldGFkYXRhLmNvbnRyYWdlbnRJZCAmJiBCb29sZWFuKG9yZGVyTWV0YWRhdGEuZGVsaXZlcnlUeXBlKSA/IG9yZGVyTWV0YWRhdGEud2FyZWhvdXNlSWQgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudDogb3JkZXJNZXRhZGF0YS5jb21tZW50LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKGNvbmZpZy5kZWJvdW5jZVRpbWUpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKChuZXdPcmRlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy51aVNlcnZpY2Uuc2V0TmV3T3JkZXJNZXRhZGF0YSh0aGlzLmRpcmVjdGlvbklkKCksIHRoaXMuY29udmVydGVyc1NlcnZpY2UucmVtb3ZlTnVsbDxTY0lOZXdPcmRlcj4obmV3T3JkZXIgYXMgU2NJTmV3T3JkZXIpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXRgiDQv9C+0LTQv9C40YHQutC4INC90LAg0LjQt9C80LXQvdC10L3QuNGPINC/0L7Qu9C10Lkg0YTQvtGA0LzRiy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGluaXRGb3JtQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0RmlsZUNoYW5nZSgpO1xuICAgICAgICB0aGlzLmluaXRXYXJlaG91c2VDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5pbml0RGVsaXZlcnlEYXRlc0NoYW5nZSgpO1xuICAgICAgICB0aGlzLmluaXREYXRlRmllbGRBY3RpdmF0aW9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXRgiDQv9C+0LTQv9C40YHQutGDINC90LAg0LjQt9C80LXQvdC10L3QuNC1INC/0L7Qu9GPINC/0YDQuNC60YDQtdC/0LvQtdC90LjRjyDRhNCw0LnQu9CwLlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5pdEZpbGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udHJvbEZpbGUudmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbGUgJiYgdGhpcy5mb3JtLmNvbnRyb2xzLmltYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblVwbG9hZEZpbGUoZmlsZSwgdGhpcy5mb3JtLmNvbnRyb2xzLmltYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmltYWdlPy5yZXNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdGCINC/0L7QtNC/0LjRgdC60YMg0L3QsCDQuNC30LzQtdC90LXQvdC40LUg0LLRi9Cx0YDQsNC90L3QvtCz0L4g0YHQutC70LDQtNCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5pdFdhcmVob3VzZUNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLndhcmVob3VzZUlkLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCh3YXJlaG91c2VJZCkgPT4gdHVpSXNQcmVzZW50KHdhcmVob3VzZUlkKSAmJiB0aGlzLndhcmVob3VzZVNlcnZpY2UuZ2V0Q3VycmVudFdhcmVob3VzZUlkU2VsZWN0KCkgIT09IHdhcmVob3VzZUlkKSxcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMCksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53YXJlaG91c2VTZXJ2aWNlLnNldFdhcmVob3VzZUlkU2VsZWN0Q2hhbmdlKGlkISk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdGCINC/0L7QtNC/0LjRgdC60YMg0L3QsCDQuNC30LzQtdC90LXQvdC40LUg0LDQtNGA0LXRgdCwINC00L7RgdGC0LDQstC60Lgg0Lgg0LLRi9Cx0YDQsNC90L3QvtCz0L4g0YHQutC70LDQtNCwINC00LvRjyDQv9C+0LvRg9GH0LXQvdC40Y8g0YHQv9C40YHQutCwINC00L7RgdGC0YPQv9C90YvRhSDQtNCw0YIg0LTQvtGB0YLQsNCy0LrQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGluaXREZWxpdmVyeURhdGVzQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICBtZXJnZShcbiAgICAgICAgICAgIHR1aUNvbnRyb2xWYWx1ZTxudW1iZXIgfCBudWxsPih0aGlzLmZvcm0uY29udHJvbHMuYWRkcmVzc0lkKS5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcih0dWlJc1ByZXNlbnQpLFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZUZvcm1DaGFuZ2UpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoYWRkcmVzc0lkOiBudW1iZXIpID0+IHRoaXMuZGVsaXZlcmllc0J5QWRkcmVzcyhhZGRyZXNzSWQpKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHR1aUNvbnRyb2xWYWx1ZTxudW1iZXIgfCBudWxsPih0aGlzLmZvcm0uY29udHJvbHMud2FyZWhvdXNlSWQpLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKHR1aUlzUHJlc2VudCksXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lRm9ybUNoYW5nZSksXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZm9ybS5jb250cm9scy5kZWxpdmVyeVR5cGUudmFsdWUgPT09IFNjRGVsaXZlcnlUeXBlLnNlbGZfZGVsaXZlcnkpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgod2FyZWhvdXNlSWQ6IG51bWJlcikgPT4gdGhpcy5kZWxpdmVyaWVzQnlXYXJlaG91c2Uod2FyZWhvdXNlSWQpKVxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlEYXRlLmRpc2FibGUoKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgcmV0cnkoKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZGVsaXZlcnlEYXRlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbGl2ZXJ5RGF0ZVZhbHVlID0gdGhpcy5mb3JtLmNvbnRyb2xzLmRlbGl2ZXJ5RGF0ZS52YWx1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChkZWxpdmVyeURhdGVWYWx1ZSAmJiAhZGVsaXZlcnlEYXRlcy5pbmNsdWRlcyhkZWxpdmVyeURhdGVWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmRlbGl2ZXJ5RGF0ZS5yZXNldCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCY0L3QuNGG0LjQsNC70LjQt9C40YDRg9C10YIg0L/QvtC00L/QuNGB0LrRgyDQvdCwINC40LfQvNC10L3QtdC90LjQtSDQv9C+0LvQtdC5INGE0L7RgNC80Ysg0LTQu9GPINCx0LvQvtC60LjRgNC+0LLQsNC90LjRjy/QsNC60YLQuNCy0LDRhtC40Lgg0L/QvtC70Y8g0LLRi9Cx0L7RgNCwINC00LDRgtGLLlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5pdERhdGVGaWVsZEFjdGl2YXRpb25DaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgdHVpQ29udHJvbFZhbHVlPFNjRGVsaXZlcnlUeXBlPih0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlUeXBlKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5jb250cmFnZW50SWQ/LnZhbHVlQ2hhbmdlcy5waXBlKGZpbHRlcigoKSA9PiB0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlUeXBlLnZhbHVlID09PSBTY0RlbGl2ZXJ5VHlwZS5kZWxpdmVyeSkpID8/IG9mKClcbiAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlEYXRlLmRpc2FibGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMud2FyZWhvdXNlSWQuZGlzYWJsZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0RlbGl2ZXJ5RGF0ZXMuc2V0KFtdKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlUeXBlLnZhbHVlID09PSBTY0RlbGl2ZXJ5VHlwZS5kZWxpdmVyeSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuYWRkcmVzc0lkLmVuYWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndhcmVob3VzZVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWxpdmVyeVdhcmVob3VzZSQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnhqcy9uby1uZXN0ZWQtc3Vic2NyaWJlXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh3YXJlaG91c2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMud2FyZWhvdXNlSWQucGF0Y2hWYWx1ZSh3YXJlaG91c2UuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybS5jb250cm9scy5kZWxpdmVyeVR5cGUudmFsdWUgPT09IFNjRGVsaXZlcnlUeXBlLnNlbGZfZGVsaXZlcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmFkZHJlc3NJZC5kaXNhYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy53YXJlaG91c2VJZC5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQl9Cw0L/RgNCw0YjQuNCy0LDQtdGCINC00LDRgtGLINC00L7RgdGC0LDQstC60Lgg0L/QviDQsNC00YDQtdGB0YMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWRkcmVzc0lkINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINCw0LTRgNC10YHQsCDQtNC+0YHRgtCw0LLQutC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgZGVsaXZlcmllc0J5QWRkcmVzcyhhZGRyZXNzSWQ6IG51bWJlcik6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JkZXJzU2VydmljZS5nZXREZWxpdmVyaWVzRGF0YSQoYWRkcmVzc0lkKS5waXBlKFxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSA/IGVycm9yLmVycm9yLm1lc3NhZ2UgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuYWRkcmVzc0lkLnNldEVycm9ycyh7XG4gICAgICAgICAgICAgICAgICAgIHNlcnZlclJlc3BvbnNlOiBtZXNzYWdlID8/IGDQntGI0LjQsdC60LAg0YHQtdGA0LLQtdGA0LA6INC/0L7QttCw0LvRg9C50YHRgtCwLCDQv9C10YDQtdC30LDQs9GA0YPQt9C40YLQtSDRgdGC0YDQsNC90LjRhtGDINC4L9C40LvQuCDQstGL0L/QvtC70L3QuNGC0LUg0LfQsNC/0YDQvtGBINC/0L7Qt9C20LUuYCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NEZWxpdmVyeURhdGVzLnNldChbXSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcCgoZGVsaXZlcnlEYXRlcykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0RlbGl2ZXJ5RGF0ZXMuc2V0KGRlbGl2ZXJ5RGF0ZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5kZWxpdmVyeURhdGUuZW5hYmxlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCX0LDQv9GA0LDRiNC40LLQsNC10YIg0LTQsNGC0Ysg0YHQsNC80L7QstGL0LLQvtC30LAg0L/QviDRgdC60LvQsNC00YMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gd2FyZWhvdXNlSWQg0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0YHQutC70LDQtNCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgZGVsaXZlcmllc0J5V2FyZWhvdXNlKHdhcmVob3VzZUlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yZGVyc1NlcnZpY2UuZ2V0U2VsZkRlbGl2ZXJpZXNEYXRhJCh3YXJlaG91c2VJZCkucGlwZShcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UgPyBlcnJvci5lcnJvci5tZXNzYWdlIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLndhcmVob3VzZUlkLnNldEVycm9ycyh7XG4gICAgICAgICAgICAgICAgICAgIHNlcnZlclJlc3BvbnNlOiBtZXNzYWdlID8/IGDQntGI0LjQsdC60LAg0YHQtdGA0LLQtdGA0LA6INC/0L7QttCw0LvRg9C50YHRgtCwLCDQv9C10YDQtdC30LDQs9GA0YPQt9C40YLQtSDRgdGC0YDQsNC90LjRhtGDINC4L9C40LvQuCDQstGL0L/QvtC70L3QuNGC0LUg0LfQsNC/0YDQvtGBINC/0L7Qt9C20LUuYCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLndhcmVob3VzZURlbGl2ZXJ5RGF0ZXMuc2V0KFtdKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKChkZWxpdmVyeURhdGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53YXJlaG91c2VEZWxpdmVyeURhdGVzLnNldChkZWxpdmVyeURhdGVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuZGVsaXZlcnlEYXRlLmVuYWJsZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQl9Cw0LPRgNGD0LbQsNC10YIg0YTQsNC50Lsg0LIg0YTQvtGA0LzRgy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlINCk0LDQudC7LlxuICAgICAqIEBwYXJhbSBmaWxlc0NvbnRyb2wg0J/QvtC70LUg0YTQsNC50LvQsCDQt9Cw0LrQsNC30LAuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBwcml2YXRlIG9uVXBsb2FkRmlsZShmaWxlOiBUdWlGaWxlTGlrZSwgZmlsZXNDb250cm9sOiBGb3JtQ29udHJvbDxTY1VwbG9hZGVkRmlsZSB8IG51bGw+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgICAgcmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHJlc3VsdCB9ID0gcmVhZGVyO1xuXG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIGZpbGVzQ29udHJvbC5zZXRWYWx1ZShuZXcgU2NVcGxvYWRlZEZpbGUoZmlsZS5uYW1lLCByZXN1bHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSBhcyB1bmtub3duIGFzIEJsb2IpO1xuICAgIH1cbn1cbiIsIkBsZXQgdXNlciA9IHVzZXIkIHwgYXN5bmM7XG5cbjxmb3JtXG4gICAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgICBzY0ZvY3VzRmlyc3RJbnZhbGlkRmllbGRcbiAgICBbZmllbGRPcmRlcl09XCJbJ2NvbnRyYWdlbnRJZCcsICdwYXltZW50VHlwZScsICdkZWxpdmVyeVR5cGUnLCAnd2FyZWhvdXNlSWQnLCAnYWRkcmVzc0lkJywgJ2RlbGl2ZXJ5RGF0ZScsICdjb21tZW50J11cIlxuICAgIChuZ1N1Ym1pdCk9XCJzdWJtaXQoKVwiXG4gICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00XCJcbj5cbiAgICA8bmctdGVtcGxhdGUgI3NlbGVjdExvYWRpbmc+IDx0dWktbG9hZGVyIC8+IDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tINCa0L7QvdGC0YDQsNCz0LXQvdGCLiAtLT5cbiAgICBAaWYgKGNvbnRyYWdlbnRzJCB8IGFzeW5jOyBhcyBjb250cmFnZW50cykge1xuICAgICAgICBAaWYgKGNvbnRyYWdlbnRzLmxlbmd0aCA+IDEgfHwgdXNlcj8uaXNPcmcpIHtcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIHR1aUxhYmVsPlxuICAgICAgICAgICAgICAgICAgICDQmtC+0L3RgtGA0LDQs9C10L3RglxuICAgICAgICAgICAgICAgICAgICA8dHVpLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29udHJhZ2VudElkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZUNvbnRlbnRdPVwiY29udHJhZ2VudHMgPyBzdHJpbmdpZnkoY29udHJhZ2VudHMpIDogc2VsZWN0TG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgINCa0L7QvdGC0YDQsNCz0LXQvdGCXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHVpLWRhdGEtbGlzdCAqdHVpRGF0YUxpc3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoY29udHJhZ2VudCBvZiBjb250cmFnZW50czsgdHJhY2sgY29udHJhZ2VudC5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjb250cmFnZW50LmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29udHJhZ2VudC5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHVpLWRhdGEtbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgPC90dWktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8dHVpLWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb250cmFnZW50SWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Vycm9yXT1cIltdIHwgdHVpRmllbGRFcnJvciB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgIHR1aUxpbmtcbiAgICAgICAgICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS5wbHVzXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZENvbnRyYWdlbnQoKVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtMiBibG9ja1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICDQndC+0LLRi9C5XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICA8IS0tINCi0LjQvyDQvtC/0LvQsNGC0YsuIC0tPlxuICAgIDxsYWJlbCB0dWlMYWJlbD5cbiAgICAgICAg0KLQuNC/INC+0L/Qu9Cw0YLRi1xuICAgICAgICBAbGV0IHBheW1lbnRUeXBlcyA9IHBheW1lbnRUeXBlcyQgfCBhc3luYztcbiAgICAgICAgPHR1aS1zZWxlY3RcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRUeXBlXCJcbiAgICAgICAgICAgIFt2YWx1ZUNvbnRlbnRdPVwicGF5bWVudFR5cGVzID8gc3RyaW5naWZ5KHBheW1lbnRUeXBlcykgOiBzZWxlY3RMb2FkaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgICAg0KLQuNC/INC+0L/Qu9Cw0YLRi1xuICAgICAgICAgICAgPHR1aS1kYXRhLWxpc3QgKnR1aURhdGFMaXN0PlxuICAgICAgICAgICAgICAgIEBmb3IgKHR5cGUgb2YgcGF5bWVudFR5cGVzOyB0cmFjayB0eXBlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR1aU9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInR5cGUuaWRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyB0eXBlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90dWktZGF0YS1saXN0PlxuICAgICAgICA8L3R1aS1zZWxlY3Q+XG4gICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRUeXBlXCJcbiAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgIC8+XG4gICAgICAgIEBpZiAoaXNDYXNoUGF5bWVudFNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC14cyB0ZXh0LXR1aS1zdGF0dXMtcG9zaXRpdmVcIj7Ql9Cw0LrQsNC30Ysg0L/RgNC+0LjQt9Cy0L7QtNGP0YLRgdGPINC/0L4g0L/RgNC10LTQvtC/0LvQsNGC0LU8L3A+XG4gICAgICAgIH1cbiAgICA8L2xhYmVsPlxuXG4gICAgPCEtLSDQn9GA0LXQtNGD0L/RgNC10LbQtNC10L3QuNC1INC+INC90LXQv9C+0LTRgtCy0LXRgNC20LTRkdC90L3Ri9GFINC60L7QvdGC0LDQutGC0L3Ri9GFINC00LDQvdC90YvRhS4gLS0+XG4gICAgQGlmICghaXNQaG9uZUFwcHJvdmVkKCkgfHwgIWlzRW1haWxBcHByb3ZlZCgpKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICN1bmNvbmZpcm1lZERhdGFXYXJuaW5nXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtdHVpLXRleHQtbmVnYXRpdmVcIlxuICAgICAgICAgICAgW2NsYXNzLndhcm5pbmctc2hha2VdPVwid2FybmluZ1NoYWtlKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICDQktC90LjQvNCw0L3QuNC1ISDQlNC70Y8g0L7RhNC+0YDQvNC70LXQvdC40Y8g0LfQsNC60LDQt9CwINC90LXQvtCx0YXQvtC00LjQvNC+INC/0L7QtNGC0LLQtdGA0LTQuNGC0YxcbiAgICAgICAgICAgIEBpZiAoIWlzUGhvbmVBcHByb3ZlZCgpKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGRcIj4g0L3QvtC80LXRgCDRgtC10LvQtdGE0L7QvdCwIDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoIWlzUGhvbmVBcHByb3ZlZCgpICYmICFpc0VtYWlsQXBwcm92ZWQoKSkge1xuICAgICAgICAgICAgICAgIDxzcGFuPiDQuCA8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKCFpc0VtYWlsQXBwcm92ZWQoKSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkXCI+INCw0LTRgNC10YEg0Y3Qu9C10LrRgtGA0L7QvdC90L7QuSDQv9C+0YfRgtGLIDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgdHVpTGlua1xuICAgICAgICAgICAgICAgIHJvdXRlckxpbms9XCIvcHJvZmlsZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAg0LIg0LLQsNGI0LXQvCDQv9GA0L7RhNC40LvQtVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tINCh0L/QvtGB0L7QsSDQtNC+0YHRgtCw0LLQutC4LiAtLT5cbiAgICA8bGFiZWwgdHVpTGFiZWw+XG4gICAgICAgINCh0L/QvtGB0L7QsSDQtNC+0YHRgtCw0LLQutC4XG4gICAgICAgIEBsZXQgZGVsaXZlcnlUeXBlcyA9IGRlbGl2ZXJ5VHlwZXMkIHwgYXN5bmM7XG4gICAgICAgIDx0dWktc2VsZWN0XG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWxpdmVyeVR5cGVcIlxuICAgICAgICAgICAgW3ZhbHVlQ29udGVudF09XCJkZWxpdmVyeVR5cGVzID8gc3RyaW5naWZ5KGRlbGl2ZXJ5VHlwZXMpIDogc2VsZWN0TG9hZGluZ1wiXG4gICAgICAgID5cbiAgICAgICAgICAgINCh0L/QvtGB0L7QsSDQtNC+0YHRgtCw0LLQutC4XG4gICAgICAgICAgICA8dHVpLWRhdGEtbGlzdCAqdHVpRGF0YUxpc3Q+XG4gICAgICAgICAgICAgICAgQGZvciAoZGVsaXZlcnkgb2YgZGVsaXZlcnlUeXBlczsgdHJhY2sgZGVsaXZlcnkuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHVpT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZGVsaXZlcnkuaWRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkZWxpdmVyeS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdHVpLWRhdGEtbGlzdD5cbiAgICAgICAgPC90dWktc2VsZWN0PlxuICAgICAgICA8dHVpLWVycm9yXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWxpdmVyeVR5cGVcIlxuICAgICAgICAgICAgW2Vycm9yXT1cIltdIHwgdHVpRmllbGRFcnJvciB8IGFzeW5jXCJcbiAgICAgICAgLz5cbiAgICA8L2xhYmVsPlxuXG4gICAgPCEtLSDQodC60LvQsNC0LiAtLT5cbiAgICA8bGFiZWwgdHVpTGFiZWw+XG4gICAgICAgINCh0LrQu9Cw0LRcbiAgICAgICAgQGxldCB3YXJlaG91c2VzID0gd2FyZWhvdXNlcyQgfCBhc3luYztcbiAgICAgICAgPHR1aS1zZWxlY3RcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIndhcmVob3VzZUlkXCJcbiAgICAgICAgICAgIFt2YWx1ZUNvbnRlbnRdPVwid2FyZWhvdXNlcyA/IHN0cmluZ2lmeSh3YXJlaG91c2VzKSA6IHNlbGVjdExvYWRpbmdcIlxuICAgICAgICA+XG4gICAgICAgICAgICDQodC60LvQsNC0XG4gICAgICAgICAgICA8dHVpLWRhdGEtbGlzdCAqdHVpRGF0YUxpc3Q+XG4gICAgICAgICAgICAgICAgQGlmICghdGVybWluYWwuaXNSdW5uaW5nT25UZXJtaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICBAZm9yICh3YXJlaG91c2Ugb2Ygd2FyZWhvdXNlczsgdHJhY2sgd2FyZWhvdXNlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIndhcmVob3VzZS5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgd2FyZWhvdXNlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIEBpZiAod2FyZWhvdXNlU2VydmljZS5nZXRDYXRhbG9nV2FyZWhvdXNlQ2hhbmdlJCgpIHwgYXN5bmM7IGFzIHRlcm1pbmFsV2FyZWhvdXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlcm1pbmFsV2FyZWhvdXNlLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZXJtaW5hbFdhcmVob3VzZS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdHVpLWRhdGEtbGlzdD5cbiAgICAgICAgPC90dWktc2VsZWN0PlxuICAgICAgICA8dHVpLWVycm9yXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ3YXJlaG91c2VJZFwiXG4gICAgICAgICAgICBbZXJyb3JdPVwiW10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIlxuICAgICAgICAvPlxuICAgIDwvbGFiZWw+XG5cbiAgICA8IS0tINCQ0LTRgNC10YEg0LTQvtGB0YLQsNCy0LrQuC4gLS0+XG4gICAgQGlmIChpc0RlbGl2ZXJ5KCkpIHtcbiAgICAgICAgQGxldCBhZGRyZXNzZXMgPSBhZGRyZXNzZXMkIHwgYXN5bmM7XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgdHVpTGFiZWw+XG4gICAgICAgICAgICAgICAg0JDQtNGA0LXRgSDQtNC+0YHRgtCw0LLQutC4XG4gICAgICAgICAgICAgICAgPHR1aS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc0lkXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlQ29udGVudF09XCJhZGRyZXNzZXMgPyBzdHJpbmdpZnkoYWRkcmVzc2VzKSA6IHNlbGVjdExvYWRpbmdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAg0JDQtNGA0LXRgSDQtNC+0YHRgtCw0LLQutC4XG4gICAgICAgICAgICAgICAgICAgIDx0dWktZGF0YS1saXN0ICp0dWlEYXRhTGlzdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGFkZHJlc3Mgb2YgYWRkcmVzc2VzOyB0cmFjayBhZGRyZXNzLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImFkZHJlc3MuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYWRkcmVzcy5hZGRyZXNzIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvdHVpLWRhdGEtbGlzdD5cbiAgICAgICAgICAgICAgICA8L3R1aS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgQGlmIChhZGRyZXNzZXMgJiYgYWRkcmVzc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICA8dHVpLWVycm9yIGVycm9yPVwi0KMg0LrQvtC90YLRgNCw0LPQtdC90YLQsCDQvdC10YIg0LDQtNGA0LXRgdCwINC00L7RgdGC0LDQstC60LhcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8dHVpLWVycm9yXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFkZHJlc3NJZFwiXG4gICAgICAgICAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIHR1aUxpbmtcbiAgICAgICAgICAgICAgICBpY29uU3RhcnQ9XCJAdHVpLnBsdXNcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGREZWxpdmVyeUFkZHJlc3MoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtdC0yIGJsb2NrXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICDQndC+0LLRi9C5XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0g0JTQsNGC0LAg0LTQvtGB0YLQsNCy0LrQuC/RgdCw0LzQvtCy0YvQstC+0LfQsC4gLS0+XG4gICAgPGxhYmVsIHR1aUxhYmVsPlxuICAgICAgICDQltC10LvQsNC10LzQsNGPINC00LDRgtCwIHt7IGlzRGVsaXZlcnkoKSA/ICfQtNC+0YHRgtCw0LLQutC4JyA6ICfRgdCw0LzQvtCy0YvQstC+0LfQsCcgfX1cbiAgICAgICAgPHR1aS1pbnB1dC1kYXRlXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWxpdmVyeURhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkSXRlbUhhbmRsZXJdPVwiZGVsaXZlcnlEYXRlRmlsdGVyXCJcbiAgICAgICAgICAgIFttYXJrZXJIYW5kbGVyXT1cImRlbGl2ZXJ5RGF0ZU1hcmtlclwiXG4gICAgICAgICAgICBbbWF4XT1cIm1heERlbGl2ZXJ5RGF5KClcIlxuICAgICAgICAgICAgW21pbl09XCJtaW5EZWxpdmVyeURheSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAg0JbQtdC70LDQtdC80LDRjyDQtNCw0YLQsCB7eyBpc0RlbGl2ZXJ5KCkgPyAn0LTQvtGB0YLQsNCy0LrQuCcgOiAn0YHQsNC80L7QstGL0LLQvtC30LAnIH19XG4gICAgICAgIDwvdHVpLWlucHV0LWRhdGU+XG4gICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlbGl2ZXJ5RGF0ZVwiXG4gICAgICAgICAgICBbZXJyb3JdPVwiW10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIlxuICAgICAgICAvPlxuICAgIDwvbGFiZWw+XG5cbiAgICA8IS0tINCa0L7QvNC80LXQvdGC0LDRgNC40Lkg0LrQu9C40LXQvdGC0LAuIC0tPlxuICAgIDxsYWJlbCB0dWlMYWJlbD5cbiAgICAgICAg0JrQvtC80LzQtdC90YLQsNGA0LjQuSDQutC70LjQtdC90YLQsCDQuiDQt9Cw0LrQsNC30YNcbiAgICAgICAgPHR1aS10ZXh0YXJlYVxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29tbWVudFwiXG4gICAgICAgICAgICBbZXhwYW5kYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtyb3dzXT1cIjE1XCJcbiAgICAgICAgPlxuICAgICAgICAgICAg0JLQstC10LTQuNGC0LUg0YLQtdC60YHRglxuICAgICAgICA8L3R1aS10ZXh0YXJlYT5cbiAgICAgICAgPHR1aS1lcnJvclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29tbWVudFwiXG4gICAgICAgICAgICBbZXJyb3JdPVwiW10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIlxuICAgICAgICAvPlxuICAgIDwvbGFiZWw+XG5cbiAgICA8IS0tINCf0YDQuNC60YDQtdC/0LvQtdC90LjQtSDRhNCw0LnQu9CwINC6INC30LDQutCw0LfRgy4gLS0+XG4gICAgPGRpdj5cbiAgICAgICAgQGlmICghY29udHJvbEZpbGUudmFsdWUpIHtcbiAgICAgICAgICAgIDxsYWJlbCB0dWlJbnB1dEZpbGVzPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBhY2NlcHQ9XCJpbWFnZS8qXCJcbiAgICAgICAgICAgICAgICAgICAgdHVpSW5wdXRGaWxlc1xuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbEZpbGVcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICB9XG5cbiAgICAgICAgPHR1aS1maWxlcyBjbGFzcz1cInR1aS1zcGFjZV90b3AtMVwiPlxuICAgICAgICAgICAgQGlmIChjb250cm9sRmlsZS52YWx1ZSB8IHR1aUZpbGVSZWplY3RlZDogeyBhY2NlcHQ6ICdpbWFnZS8qJyB9IHwgYXN5bmM7IGFzIGZpbGUpIHtcbiAgICAgICAgICAgICAgICA8dHVpLWZpbGVcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU9XCJlcnJvclwiXG4gICAgICAgICAgICAgICAgICAgIFtmaWxlXT1cImZpbGVcIlxuICAgICAgICAgICAgICAgICAgICAocmVtb3ZlKT1cInJlbW92ZUZpbGUoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGZvciAoZmlsZSBvZiBhY2NlcHRlZCQgfCBhc3luYzsgdHJhY2sgZmlsZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgPHR1aS1maWxlXG4gICAgICAgICAgICAgICAgICAgIFtmaWxlXT1cImZpbGVcIlxuICAgICAgICAgICAgICAgICAgICAocmVtb3ZlKT1cInJlbW92ZUZpbGUoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC90dWktZmlsZXM+XG5cbiAgICAgICAgPHR1aS1lcnJvclxuICAgICAgICAgICAgW2Vycm9yXT1cIlsnbWF4TGVuZ3RoJ10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xGaWxlXCJcbiAgICAgICAgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJ0dWktZm9ybV9fZmllbGQtbm90ZVwiPtCd0LDQv9GA0LjQvNC10YAsINGE0L7RgtC+0LPRgNCw0YTQuNGOINC/0L7QstGA0LXQttC00LXQvdC40Lkg0Lgg0LTQtdGE0YTQtdC60YLQvtCyLCDRh9GC0L4g0L/QvtGB0LvRg9C20LjRgiDQtNC+0LrQsNC30LDRgtC10LvRjNGB0YLQstC+0Lwg0L3QtdGB0L7QvtGC0LLQtdGC0YHRgtCy0LjRjyDQt9Cw0Y/QstC70LXQvdC90L7Qs9C+INC60LDRh9C10YHRgtCy0LAg0YLQvtCy0LDRgNCwLjwvcD5cbiAgICA8L2Rpdj5cbjwvZm9ybT5cbiJdfQ==