barsa-sap-ui 2.2.56 → 2.2.57

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 (25) hide show
  1. package/esm2022/lib/barsa-chat/barsa-chat.component.mjs +3 -12
  2. package/esm2022/lib/barsa-chat/chat.model.mjs +1 -1
  3. package/esm2022/lib/barsa-chat-list/barsa-chat-list.component.mjs +68 -17
  4. package/esm2022/lib/barsa-chat-message/barsa-chat-message.component.mjs +5 -4
  5. package/esm2022/lib/barsa-table-header/barsa-table-header.component.mjs +9 -3
  6. package/esm2022/lib/barsa-ulv-main/barsa-ulv-main.component.mjs +5 -3
  7. package/esm2022/lib/column-renderer/column-renderer.component.mjs +3 -3
  8. package/esm2022/lib/ly-layout-panel/ly-layout-panel.component.mjs +2 -2
  9. package/esm2022/lib/ly-tab-page/ly-tab-page.component.mjs +2 -2
  10. package/esm2022/lib/ui-num-int-ui/ui-num-int-ui.component.mjs +3 -3
  11. package/esm2022/lib/ui-read-only-field/ui-read-only-field.component.mjs +3 -3
  12. package/esm2022/lib/ui-report-container/ui-report-container.component.mjs +7 -1
  13. package/esm2022/lib/ui-simple-combo/ui-simple-combo.component.mjs +2 -2
  14. package/esm2022/lib/ui-table-view/ui-table-view.component.mjs +2 -2
  15. package/esm2022/lib/ui-ulv-main-ui/ui-ulv-main-ui.component.mjs +4 -3
  16. package/fesm2022/barsa-sap-ui.mjs +109 -55
  17. package/fesm2022/barsa-sap-ui.mjs.map +1 -1
  18. package/lib/barsa-chat/barsa-chat.component.d.ts +0 -1
  19. package/lib/barsa-chat/chat.model.d.ts +1 -1
  20. package/lib/barsa-chat-list/barsa-chat-list.component.d.ts +12 -4
  21. package/lib/barsa-table-header/barsa-table-header.component.d.ts +1 -0
  22. package/lib/barsa-ulv-main/barsa-ulv-main.component.d.ts +2 -1
  23. package/lib/ui-report-container/ui-report-container.component.d.ts +1 -0
  24. package/lib/ui-ulv-main-ui/ui-ulv-main-ui.component.d.ts +1 -0
  25. package/package.json +1 -1
@@ -8,7 +8,8 @@ import * as i4 from "@fundamental-ngx/core/content-density";
8
8
  import * as i5 from "@fundamental-ngx/core/button";
9
9
  import * as i6 from "@fundamental-ngx/core/icon";
10
10
  import * as i7 from "@fundamental-ngx/core/popover";
11
- import * as i8 from "../util-date-to-hh-mm.pipe";
11
+ import * as i8 from "../download-files.directive";
12
+ import * as i9 from "../util-date-to-hh-mm.pipe";
12
13
  export class BarsaChatMessageComponent {
13
14
  constructor() {
14
15
  this.reply = new EventEmitter();
@@ -31,7 +32,7 @@ export class BarsaChatMessageComponent {
31
32
  return { ...image, displayWidth, displayHeight };
32
33
  }
33
34
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BarsaChatMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: BarsaChatMessageComponent, selector: "bsu-barsa-chat-message", inputs: { message: "message", showSender: "showSender", nextIsSame: "nextIsSame", pervIsSame: "pervIsSame", badge: "badge", nextHasBadge: "nextHasBadge", badgeLabel: "badgeLabel" }, outputs: { reply: "reply" }, ngImport: i0, template: "<div\r\n class=\"tw-w-full tw-px-4 tw-flex tw-flex-wrap\"\r\n [ngClass]=\"{\r\n'tw-pt-1': pervIsSame,\r\n'tw-pt-3': !pervIsSame,\r\n}\"\r\n>\r\n @if (badge) {\r\n <div class=\"tw-w-full tw-pb-6 tw-pt-5\">\r\n <div class=\"tw-w-fit tw-bg-zinc-500 tw-text-white tw-px-4 tw-mx-auto tw-rounded-full tw-text-md\">\r\n {{ badgeLabel }}\r\n </div>\r\n </div>\r\n }\r\n <div\r\n class=\"tw-w-full tw-flex tw-gap-2 tw-items-end tw-relative\"\r\n [ngClass]=\"{\r\n'tw-justify-start': message.owner.id === userId,\r\n'tw-flex-row-reverse': message.owner.id !== userId,\r\n'tw-ms-14': (nextIsSame && !nextHasBadge) && message.owner.id === userId,\r\n'tw-me-14': (nextIsSame && !nextHasBadge) && message.owner.id !== userId,\r\n }\"\r\n >\r\n @if (!nextIsSame || nextHasBadge) {\r\n <fd-avatar\r\n size=\"s\"\r\n [label]=\"message.owner.avatar ? '' : message.owner?.name\"\r\n [circle]=\"true\"\r\n [image]=\"message.owner?.avatar\"\r\n [placeholder]=\"message.owner.avatar ? false : true\"\r\n ></fd-avatar>\r\n } @if (!nextIsSame || nextHasBadge) {\r\n <div\r\n class=\"tw-bg-transparent tw-overflow-hidden tw-size-3 tw-absolute tw-bottom-0 tw-border-[6px] tw-border-t-transparent\"\r\n [ngClass]=\"{\r\n 'tw-right-11 tw-border-b-bubble-mine tw-border-l-bubble-mine tw-border-r-transparent':\r\n message.owner.id === userId,\r\n 'tw-left-11 tw-border-b-default tw-border-r-default tw-border-l-transparent':\r\n message.owner.id !== userId\r\n }\"\r\n ></div>\r\n }\r\n <div\r\n @inPaneAnimation\r\n class=\"tw-max-w-[80%] tw-min-w-40 tw-rounded-2xl tw-text-base tw-relative tw-overflow-hidden\"\r\n [ngClass]=\"{\r\n '!tw-rounded-br-none':\r\n message.owner.id === userId && (nextHasBadge || (nextIsSame && !nextHasBadge) || !nextIsSame),\r\n '!tw-rounded-bl-none':\r\n message.owner.id !== userId && (nextHasBadge || (nextIsSame && !nextHasBadge) || !nextIsSame),\r\n '!tw-rounded-tr-none': message.owner.id === userId && pervIsSame && !badge,\r\n '!tw-rounded-tl-none': message.owner.id !== userId && pervIsSame && !badge\r\n }\"\r\n >\r\n @if (showSender && (!pervIsSame || badge)) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId && !message.image,\r\n'tw-bg-default': message.owner.id !== userId && !message.image,\r\n'tw-absolute tw-top-0 tw-right-0 tw-pb-8 tw-w-full tw-rounded-tr-2xl tw-bg-gradient-to-b tw-to-transparent': message.image,\r\n'tw-from-bubble-mine': message.owner.id === userId && message.image,\r\n'tw-from-default': message.owner.id !== userId && message.image,\r\n }\"\r\n class=\"tw-font-bold tw-text-base tw-px-3 tw-pt-2 tw-z-10\"\r\n >\r\n {{ message.owner.name }}\r\n </div>\r\n } @if (message.image) { @if (imageRatio(message.image); as image) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine/[.3]': message.owner.id === userId,\r\n'tw-bg-default/[.3]': message.owner.id !== userId,\r\n }\"\r\n class=\"tw-flex tw-justify-center tw-items-center tw-bg-zinc-500/[.3] tw-relative\"\r\n >\r\n <a\r\n [download]=\"message.image.name\"\r\n href=\"assets/bg-chat.jpg\"\r\n target=\"_blank\"\r\n class=\"tw-absolute tw-w-full tw-h-full tw-bg-black/[.4] dark:tw-bg-white/[.4] tw-opacity-0 hover:tw-opacity-100 tw-transition-all tw-cursor-pointer tw-flex tw-justify-center tw-items-center\"\r\n >\r\n <fd-icon class=\"!tw-text-default !tw-text-3xl\" glyph=\"download\"></fd-icon>\r\n </a>\r\n <img\r\n [ngStyle]=\"{\r\n width: image.displayWidth + 'px',\r\n height: image.displayHeight + 'px'\r\n }\"\r\n [src]=\"image.url\"\r\n />\r\n </div>\r\n } } @if (message.file?.name) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId,\r\n'tw-bg-default': message.owner.id !== userId,\r\n }\"\r\n class=\"tw-px-2 tw-pt-2 w-full tw-flex tw-gap-2\"\r\n >\r\n <a\r\n [download]=\"message.file?.FileName\"\r\n href=\"assets/bg-chat.jpg\"\r\n target=\"_blank\"\r\n class=\"tw-shrink-0 tw-row-0 tw-size-12 tw-rounded-lg tw-bg-orange-400 tw-flex tw-justify-center tw-items-center tw-cursor-pointer tw-transition-all hover:tw-bg-orange-600\"\r\n >\r\n <span class=\"tw-font-bold leading-6 tw-text-lg tw-text-white\">\r\n {{ message.file?.Type }}\r\n </span>\r\n </a>\r\n <div class=\"tw-flex tw-flex-col\">\r\n <span class=\"tw-font-bold tw-text-md tw-text-base tw-w-full tw-truncate\">\r\n {{ message.file?.FileName }}</span\r\n >\r\n <span class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400 tw-w-full tw-truncate\">\r\n {{ message.file?.Size }}</span\r\n >\r\n </div>\r\n </div>\r\n } @if (message.text) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId,\r\n'tw-bg-default': message.owner.id !== userId,\r\n }\"\r\n class=\"tw-whitespace-pre-line tw-px-3 tw-pt-1\"\r\n [innerHTML]=\"message.text\"\r\n ></div>\r\n }\r\n <div\r\n class=\"tw-flex tw-w-full tw-px-2 tw-pt-1 tw-pb-2 tw-items-center tw-gap-2 tw-justify-end\"\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId,\r\n'tw-bg-default tw-flex-row-reverse': message.owner.id !== userId,\r\n}\"\r\n >\r\n <span class=\"tw-text-xs tw-text-gray-500 dark:tw-text-gray-300\">{{\r\n message.createdAt | utilDateToHhMm\r\n }}</span>\r\n <fd-popover placement=\"bottom-end\" title=\"bottom-end\">\r\n <fd-popover-control>\r\n <button\r\n fd-button\r\n fdType=\"transparent\"\r\n [fdCompact]=\"true\"\r\n glyph=\"navigation-down-arrow\"\r\n ></button>\r\n </fd-popover-control>\r\n <fd-popover-body minWidth=\"10rem\">\r\n <div class=\"tw-flex tw-flex-col tw-bg-default tw-w-full\" bodyClick>\r\n <label\r\n class=\"tw-px-4 tw-py-2 tw-flex tw-gap-2 tw-w-full hover:tw-bg-base/[.1] tw-transition-all tw-cursor-pointer\"\r\n (click)=\"reply.emit(message)\"\r\n >\r\n <fd-icon class=\"!tw-text-base !tw-text-3xl\" glyph=\"undo\"></fd-icon>\r\n <span class=\"!tw-text-base\">\u067E\u0627\u0633\u062E \u062F\u0627\u062F\u0646</span>\r\n </label>\r\n <label\r\n class=\"tw-px-4 tw-py-2 tw-flex tw-gap-2 tw-w-full hover:tw-bg-base/[.1] tw-transition-all tw-cursor-pointer\"\r\n >\r\n <fd-icon class=\"!tw-text-base !tw-text-3xl\" glyph=\"forward\"></fd-icon>\r\n <span class=\"!tw-text-base\">\u0627\u0631\u0633\u0627\u0644 \u06A9\u0631\u062F\u0646</span>\r\n </label>\r\n <label\r\n class=\"tw-px-4 tw-py-2 tw-flex tw-gap-2 tw-w-full hover:tw-bg-base/[.1] tw-transition-all tw-cursor-pointer\"\r\n >\r\n <fd-icon class=\"!tw-text-base !tw-text-3xl\" glyph=\"delete\"></fd-icon>\r\n <span class=\"!tw-text-base\">\u062D\u0630\u0641</span>\r\n </label>\r\n </div>\r\n </fd-popover-body>\r\n </fd-popover>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.BodyClickDirective, selector: "[bodyClick]", inputs: ["disableBodyClick"] }, { kind: "component", type: i3.AvatarComponent, selector: "fd-avatar", inputs: ["class", "id", "ariaLabel", "ariaLabelledby", "label", "size", "font", "glyph", "zoomGlyph", "circle", "transparent", "contain", "placeholder", "tile", "border", "colorAccent", "colorIndication", "random", "clickable", "valueState", "image", "alterIcon", "backupImage"], outputs: ["avatarClicked", "zoomGlyphClicked"] }, { kind: "directive", type: i4.ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "component", type: i5.ButtonComponent, selector: "button[fd-button], a[fd-button], span[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i6.IconComponent, selector: "fd-icon", inputs: ["glyph", "font", "color", "background", "class", "ariaLabel", "ariaHidden"] }, { kind: "component", type: i7.PopoverControlComponent, selector: "fd-popover-control, [fdPopoverControl]" }, { kind: "component", type: i7.PopoverBodyComponent, selector: "fd-popover-body", inputs: ["minWidth", "maxWidth", "minHeight", "maxHeight"] }, { kind: "component", type: i7.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll"] }, { kind: "pipe", type: i8.UtilDateToHhMmPipe, name: "utilDateToHhMm" }], animations: [
35
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: BarsaChatMessageComponent, selector: "bsu-barsa-chat-message", inputs: { message: "message", showSender: "showSender", nextIsSame: "nextIsSame", pervIsSame: "pervIsSame", badge: "badge", nextHasBadge: "nextHasBadge", badgeLabel: "badgeLabel" }, outputs: { reply: "reply" }, ngImport: i0, template: "<div\r\n class=\"tw-w-full tw-px-4 tw-flex tw-flex-wrap\"\r\n [ngClass]=\"{\r\n'tw-pt-1': pervIsSame,\r\n'tw-pt-3': !pervIsSame,\r\n}\"\r\n>\r\n @if (badge) {\r\n <div class=\"tw-w-full tw-pb-6 tw-pt-5\">\r\n <div class=\"tw-w-fit tw-bg-zinc-500 tw-text-white tw-px-4 tw-mx-auto tw-rounded-full tw-text-md\">\r\n {{ badgeLabel }}\r\n </div>\r\n </div>\r\n }\r\n <div\r\n class=\"tw-w-full tw-flex tw-gap-2 tw-items-end tw-relative\"\r\n [ngClass]=\"{\r\n'tw-justify-start': message.owner.id === userId,\r\n'tw-flex-row-reverse': message.owner.id !== userId,\r\n'tw-ms-14': (nextIsSame && !nextHasBadge) && message.owner.id === userId,\r\n'tw-me-14': (nextIsSame && !nextHasBadge) && message.owner.id !== userId,\r\n }\"\r\n >\r\n @if (!nextIsSame || nextHasBadge) {\r\n <fd-avatar\r\n size=\"s\"\r\n [label]=\"message.owner.avatar ? '' : message.owner?.name\"\r\n [circle]=\"true\"\r\n [image]=\"message.owner?.avatar\"\r\n [placeholder]=\"message.owner.avatar ? false : true\"\r\n ></fd-avatar>\r\n } @if (!nextIsSame || nextHasBadge) {\r\n <div\r\n class=\"tw-bg-transparent tw-overflow-hidden tw-size-3 tw-absolute tw-bottom-0 tw-border-[6px] tw-border-t-transparent\"\r\n [ngClass]=\"{\r\n 'tw-right-11 tw-border-b-bubble-mine tw-border-l-bubble-mine tw-border-r-transparent':\r\n message.owner.id === userId,\r\n 'tw-left-11 tw-border-b-default tw-border-r-default tw-border-l-transparent':\r\n message.owner.id !== userId\r\n }\"\r\n ></div>\r\n }\r\n <div\r\n @inPaneAnimation\r\n class=\"tw-max-w-[80%] tw-min-w-40 tw-rounded-2xl tw-text-base tw-relative tw-overflow-hidden\"\r\n [ngClass]=\"{\r\n '!tw-rounded-br-none':\r\n message.owner.id === userId && (nextHasBadge || (nextIsSame && !nextHasBadge) || !nextIsSame),\r\n '!tw-rounded-bl-none':\r\n message.owner.id !== userId && (nextHasBadge || (nextIsSame && !nextHasBadge) || !nextIsSame),\r\n '!tw-rounded-tr-none': message.owner.id === userId && pervIsSame && !badge,\r\n '!tw-rounded-tl-none': message.owner.id !== userId && pervIsSame && !badge\r\n }\"\r\n >\r\n @if (showSender && (!pervIsSame || badge)) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId && !message.image,\r\n'tw-bg-default': message.owner.id !== userId && !message.image,\r\n'tw-absolute tw-top-0 tw-right-0 tw-pb-8 tw-w-full tw-rounded-tr-2xl tw-bg-gradient-to-b tw-to-transparent': message.image,\r\n'tw-from-bubble-mine': message.owner.id === userId && message.image,\r\n'tw-from-default': message.owner.id !== userId && message.image,\r\n }\"\r\n class=\"tw-font-bold tw-text-base tw-px-3 tw-pt-2 tw-z-10\"\r\n >\r\n {{ message.owner.name }}\r\n </div>\r\n } @if (message.image) { @if (imageRatio(message.image); as image) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine/[.3]': message.owner.id === userId,\r\n'tw-bg-default/[.3]': message.owner.id !== userId,\r\n }\"\r\n class=\"tw-flex tw-justify-center tw-items-center tw-bg-zinc-500/[.3] tw-relative\"\r\n >\r\n <a\r\n [download]=\"message.image.name\"\r\n href=\"assets/bg-chat.jpg\"\r\n target=\"_blank\"\r\n class=\"tw-absolute tw-w-full tw-h-full tw-bg-black/[.4] dark:tw-bg-white/[.4] tw-opacity-0 hover:tw-opacity-100 tw-transition-all tw-cursor-pointer tw-flex tw-justify-center tw-items-center\"\r\n >\r\n <fd-icon class=\"!tw-text-default !tw-text-3xl\" glyph=\"download\"></fd-icon>\r\n </a>\r\n <img\r\n [ngStyle]=\"{\r\n width: image.displayWidth + 'px',\r\n height: image.displayHeight + 'px'\r\n }\"\r\n [src]=\"image.url\"\r\n />\r\n </div>\r\n } } @for(file of message.files;track file.Id) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId,\r\n'tw-bg-default': message.owner.id !== userId,\r\n }\"\r\n class=\"tw-px-2 tw-pt-2 w-full tw-flex tw-gap-2\"\r\n >\r\n <a\r\n downloadFiles\r\n [files]=\"[file]\"\r\n class=\"tw-shrink-0 tw-row-0 tw-size-12 tw-rounded-lg tw-bg-orange-400 tw-flex tw-justify-center tw-items-center tw-cursor-pointer tw-transition-all hover:tw-bg-orange-600\"\r\n >\r\n <span class=\"tw-font-bold leading-6 tw-text-lg tw-text-white\">\r\n {{ file.Type }}\r\n </span>\r\n </a>\r\n <div class=\"tw-flex tw-flex-col\">\r\n <span\r\n class=\"tw-font-bold tw-text-md tw-text-base tw-w-full tw-truncate\"\r\n [attr.title]=\"file.FileName\"\r\n >\r\n {{ file.FileName }}</span\r\n >\r\n <span class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400 tw-w-full tw-truncate\">\r\n {{ file.Size }}KB</span\r\n >\r\n </div>\r\n </div>\r\n } @if (message.text) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId,\r\n'tw-bg-default': message.owner.id !== userId,\r\n }\"\r\n class=\"tw-whitespace-pre-line tw-px-3 tw-pt-1\"\r\n [innerHTML]=\"message.text\"\r\n ></div>\r\n }\r\n <div\r\n class=\"tw-flex tw-w-full tw-px-2 tw-pt-1 tw-pb-2 tw-items-center tw-gap-2 tw-justify-end\"\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId,\r\n'tw-bg-default tw-flex-row-reverse': message.owner.id !== userId,\r\n}\"\r\n >\r\n <span class=\"tw-text-xs tw-text-gray-500 dark:tw-text-gray-300\">{{\r\n message.createdAt | utilDateToHhMm\r\n }}</span>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<ng-template #moreActions>\r\n <fd-popover placement=\"bottom-end\" title=\"bottom-end\">\r\n <fd-popover-control>\r\n <button\r\n fd-button\r\n fdType=\"transparent\"\r\n [fdCompact]=\"true\"\r\n glyph=\"navigation-down-arrow\"\r\n ></button>\r\n </fd-popover-control>\r\n <fd-popover-body minWidth=\"10rem\">\r\n <div class=\"tw-flex tw-flex-col tw-bg-default tw-w-full\" bodyClick>\r\n <label\r\n class=\"tw-px-4 tw-py-2 tw-flex tw-gap-2 tw-w-full hover:tw-bg-base/[.1] tw-transition-all tw-cursor-pointer\"\r\n (click)=\"reply.emit(message)\"\r\n >\r\n <fd-icon class=\"!tw-text-base !tw-text-3xl\" glyph=\"undo\"></fd-icon>\r\n <span class=\"!tw-text-base\">\u067E\u0627\u0633\u062E \u062F\u0627\u062F\u0646</span>\r\n </label>\r\n <label\r\n class=\"tw-px-4 tw-py-2 tw-flex tw-gap-2 tw-w-full hover:tw-bg-base/[.1] tw-transition-all tw-cursor-pointer\"\r\n >\r\n <fd-icon class=\"!tw-text-base !tw-text-3xl\" glyph=\"forward\"></fd-icon>\r\n <span class=\"!tw-text-base\">\u0627\u0631\u0633\u0627\u0644 \u06A9\u0631\u062F\u0646</span>\r\n </label>\r\n <label\r\n class=\"tw-px-4 tw-py-2 tw-flex tw-gap-2 tw-w-full hover:tw-bg-base/[.1] tw-transition-all tw-cursor-pointer\"\r\n >\r\n <fd-icon class=\"!tw-text-base !tw-text-3xl\" glyph=\"delete\"></fd-icon>\r\n <span class=\"!tw-text-base\">\u062D\u0630\u0641</span>\r\n </label>\r\n </div>\r\n </fd-popover-body>\r\n </fd-popover>\r\n</ng-template>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.BodyClickDirective, selector: "[bodyClick]", inputs: ["disableBodyClick"] }, { kind: "component", type: i3.AvatarComponent, selector: "fd-avatar", inputs: ["class", "id", "ariaLabel", "ariaLabelledby", "label", "size", "font", "glyph", "zoomGlyph", "circle", "transparent", "contain", "placeholder", "tile", "border", "colorAccent", "colorIndication", "random", "clickable", "valueState", "image", "alterIcon", "backupImage"], outputs: ["avatarClicked", "zoomGlyphClicked"] }, { kind: "directive", type: i4.ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "component", type: i5.ButtonComponent, selector: "button[fd-button], a[fd-button], span[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i6.IconComponent, selector: "fd-icon", inputs: ["glyph", "font", "color", "background", "class", "ariaLabel", "ariaHidden"] }, { kind: "component", type: i7.PopoverControlComponent, selector: "fd-popover-control, [fdPopoverControl]" }, { kind: "component", type: i7.PopoverBodyComponent, selector: "fd-popover-body", inputs: ["minWidth", "maxWidth", "minHeight", "maxHeight"] }, { kind: "component", type: i7.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll"] }, { kind: "directive", type: i8.DownloadFilesDirective, selector: "[downloadFiles]", inputs: ["files"] }, { kind: "pipe", type: i9.UtilDateToHhMmPipe, name: "utilDateToHhMm" }], animations: [
35
36
  trigger('inPaneAnimation', [
36
37
  transition(':enter', [
37
38
  style({ opacity: 0, transform: 'scale(0, 0)' }),
@@ -57,7 +58,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
57
58
  animate('300ms ease-in-out', style({ opacity: 0, transform: 'scale(0, 0)' }))
58
59
  ])
59
60
  ])
60
- ], standalone: false, template: "<div\r\n class=\"tw-w-full tw-px-4 tw-flex tw-flex-wrap\"\r\n [ngClass]=\"{\r\n'tw-pt-1': pervIsSame,\r\n'tw-pt-3': !pervIsSame,\r\n}\"\r\n>\r\n @if (badge) {\r\n <div class=\"tw-w-full tw-pb-6 tw-pt-5\">\r\n <div class=\"tw-w-fit tw-bg-zinc-500 tw-text-white tw-px-4 tw-mx-auto tw-rounded-full tw-text-md\">\r\n {{ badgeLabel }}\r\n </div>\r\n </div>\r\n }\r\n <div\r\n class=\"tw-w-full tw-flex tw-gap-2 tw-items-end tw-relative\"\r\n [ngClass]=\"{\r\n'tw-justify-start': message.owner.id === userId,\r\n'tw-flex-row-reverse': message.owner.id !== userId,\r\n'tw-ms-14': (nextIsSame && !nextHasBadge) && message.owner.id === userId,\r\n'tw-me-14': (nextIsSame && !nextHasBadge) && message.owner.id !== userId,\r\n }\"\r\n >\r\n @if (!nextIsSame || nextHasBadge) {\r\n <fd-avatar\r\n size=\"s\"\r\n [label]=\"message.owner.avatar ? '' : message.owner?.name\"\r\n [circle]=\"true\"\r\n [image]=\"message.owner?.avatar\"\r\n [placeholder]=\"message.owner.avatar ? false : true\"\r\n ></fd-avatar>\r\n } @if (!nextIsSame || nextHasBadge) {\r\n <div\r\n class=\"tw-bg-transparent tw-overflow-hidden tw-size-3 tw-absolute tw-bottom-0 tw-border-[6px] tw-border-t-transparent\"\r\n [ngClass]=\"{\r\n 'tw-right-11 tw-border-b-bubble-mine tw-border-l-bubble-mine tw-border-r-transparent':\r\n message.owner.id === userId,\r\n 'tw-left-11 tw-border-b-default tw-border-r-default tw-border-l-transparent':\r\n message.owner.id !== userId\r\n }\"\r\n ></div>\r\n }\r\n <div\r\n @inPaneAnimation\r\n class=\"tw-max-w-[80%] tw-min-w-40 tw-rounded-2xl tw-text-base tw-relative tw-overflow-hidden\"\r\n [ngClass]=\"{\r\n '!tw-rounded-br-none':\r\n message.owner.id === userId && (nextHasBadge || (nextIsSame && !nextHasBadge) || !nextIsSame),\r\n '!tw-rounded-bl-none':\r\n message.owner.id !== userId && (nextHasBadge || (nextIsSame && !nextHasBadge) || !nextIsSame),\r\n '!tw-rounded-tr-none': message.owner.id === userId && pervIsSame && !badge,\r\n '!tw-rounded-tl-none': message.owner.id !== userId && pervIsSame && !badge\r\n }\"\r\n >\r\n @if (showSender && (!pervIsSame || badge)) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId && !message.image,\r\n'tw-bg-default': message.owner.id !== userId && !message.image,\r\n'tw-absolute tw-top-0 tw-right-0 tw-pb-8 tw-w-full tw-rounded-tr-2xl tw-bg-gradient-to-b tw-to-transparent': message.image,\r\n'tw-from-bubble-mine': message.owner.id === userId && message.image,\r\n'tw-from-default': message.owner.id !== userId && message.image,\r\n }\"\r\n class=\"tw-font-bold tw-text-base tw-px-3 tw-pt-2 tw-z-10\"\r\n >\r\n {{ message.owner.name }}\r\n </div>\r\n } @if (message.image) { @if (imageRatio(message.image); as image) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine/[.3]': message.owner.id === userId,\r\n'tw-bg-default/[.3]': message.owner.id !== userId,\r\n }\"\r\n class=\"tw-flex tw-justify-center tw-items-center tw-bg-zinc-500/[.3] tw-relative\"\r\n >\r\n <a\r\n [download]=\"message.image.name\"\r\n href=\"assets/bg-chat.jpg\"\r\n target=\"_blank\"\r\n class=\"tw-absolute tw-w-full tw-h-full tw-bg-black/[.4] dark:tw-bg-white/[.4] tw-opacity-0 hover:tw-opacity-100 tw-transition-all tw-cursor-pointer tw-flex tw-justify-center tw-items-center\"\r\n >\r\n <fd-icon class=\"!tw-text-default !tw-text-3xl\" glyph=\"download\"></fd-icon>\r\n </a>\r\n <img\r\n [ngStyle]=\"{\r\n width: image.displayWidth + 'px',\r\n height: image.displayHeight + 'px'\r\n }\"\r\n [src]=\"image.url\"\r\n />\r\n </div>\r\n } } @if (message.file?.name) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId,\r\n'tw-bg-default': message.owner.id !== userId,\r\n }\"\r\n class=\"tw-px-2 tw-pt-2 w-full tw-flex tw-gap-2\"\r\n >\r\n <a\r\n [download]=\"message.file?.FileName\"\r\n href=\"assets/bg-chat.jpg\"\r\n target=\"_blank\"\r\n class=\"tw-shrink-0 tw-row-0 tw-size-12 tw-rounded-lg tw-bg-orange-400 tw-flex tw-justify-center tw-items-center tw-cursor-pointer tw-transition-all hover:tw-bg-orange-600\"\r\n >\r\n <span class=\"tw-font-bold leading-6 tw-text-lg tw-text-white\">\r\n {{ message.file?.Type }}\r\n </span>\r\n </a>\r\n <div class=\"tw-flex tw-flex-col\">\r\n <span class=\"tw-font-bold tw-text-md tw-text-base tw-w-full tw-truncate\">\r\n {{ message.file?.FileName }}</span\r\n >\r\n <span class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400 tw-w-full tw-truncate\">\r\n {{ message.file?.Size }}</span\r\n >\r\n </div>\r\n </div>\r\n } @if (message.text) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId,\r\n'tw-bg-default': message.owner.id !== userId,\r\n }\"\r\n class=\"tw-whitespace-pre-line tw-px-3 tw-pt-1\"\r\n [innerHTML]=\"message.text\"\r\n ></div>\r\n }\r\n <div\r\n class=\"tw-flex tw-w-full tw-px-2 tw-pt-1 tw-pb-2 tw-items-center tw-gap-2 tw-justify-end\"\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId,\r\n'tw-bg-default tw-flex-row-reverse': message.owner.id !== userId,\r\n}\"\r\n >\r\n <span class=\"tw-text-xs tw-text-gray-500 dark:tw-text-gray-300\">{{\r\n message.createdAt | utilDateToHhMm\r\n }}</span>\r\n <fd-popover placement=\"bottom-end\" title=\"bottom-end\">\r\n <fd-popover-control>\r\n <button\r\n fd-button\r\n fdType=\"transparent\"\r\n [fdCompact]=\"true\"\r\n glyph=\"navigation-down-arrow\"\r\n ></button>\r\n </fd-popover-control>\r\n <fd-popover-body minWidth=\"10rem\">\r\n <div class=\"tw-flex tw-flex-col tw-bg-default tw-w-full\" bodyClick>\r\n <label\r\n class=\"tw-px-4 tw-py-2 tw-flex tw-gap-2 tw-w-full hover:tw-bg-base/[.1] tw-transition-all tw-cursor-pointer\"\r\n (click)=\"reply.emit(message)\"\r\n >\r\n <fd-icon class=\"!tw-text-base !tw-text-3xl\" glyph=\"undo\"></fd-icon>\r\n <span class=\"!tw-text-base\">\u067E\u0627\u0633\u062E \u062F\u0627\u062F\u0646</span>\r\n </label>\r\n <label\r\n class=\"tw-px-4 tw-py-2 tw-flex tw-gap-2 tw-w-full hover:tw-bg-base/[.1] tw-transition-all tw-cursor-pointer\"\r\n >\r\n <fd-icon class=\"!tw-text-base !tw-text-3xl\" glyph=\"forward\"></fd-icon>\r\n <span class=\"!tw-text-base\">\u0627\u0631\u0633\u0627\u0644 \u06A9\u0631\u062F\u0646</span>\r\n </label>\r\n <label\r\n class=\"tw-px-4 tw-py-2 tw-flex tw-gap-2 tw-w-full hover:tw-bg-base/[.1] tw-transition-all tw-cursor-pointer\"\r\n >\r\n <fd-icon class=\"!tw-text-base !tw-text-3xl\" glyph=\"delete\"></fd-icon>\r\n <span class=\"!tw-text-base\">\u062D\u0630\u0641</span>\r\n </label>\r\n </div>\r\n </fd-popover-body>\r\n </fd-popover>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
61
+ ], standalone: false, template: "<div\r\n class=\"tw-w-full tw-px-4 tw-flex tw-flex-wrap\"\r\n [ngClass]=\"{\r\n'tw-pt-1': pervIsSame,\r\n'tw-pt-3': !pervIsSame,\r\n}\"\r\n>\r\n @if (badge) {\r\n <div class=\"tw-w-full tw-pb-6 tw-pt-5\">\r\n <div class=\"tw-w-fit tw-bg-zinc-500 tw-text-white tw-px-4 tw-mx-auto tw-rounded-full tw-text-md\">\r\n {{ badgeLabel }}\r\n </div>\r\n </div>\r\n }\r\n <div\r\n class=\"tw-w-full tw-flex tw-gap-2 tw-items-end tw-relative\"\r\n [ngClass]=\"{\r\n'tw-justify-start': message.owner.id === userId,\r\n'tw-flex-row-reverse': message.owner.id !== userId,\r\n'tw-ms-14': (nextIsSame && !nextHasBadge) && message.owner.id === userId,\r\n'tw-me-14': (nextIsSame && !nextHasBadge) && message.owner.id !== userId,\r\n }\"\r\n >\r\n @if (!nextIsSame || nextHasBadge) {\r\n <fd-avatar\r\n size=\"s\"\r\n [label]=\"message.owner.avatar ? '' : message.owner?.name\"\r\n [circle]=\"true\"\r\n [image]=\"message.owner?.avatar\"\r\n [placeholder]=\"message.owner.avatar ? false : true\"\r\n ></fd-avatar>\r\n } @if (!nextIsSame || nextHasBadge) {\r\n <div\r\n class=\"tw-bg-transparent tw-overflow-hidden tw-size-3 tw-absolute tw-bottom-0 tw-border-[6px] tw-border-t-transparent\"\r\n [ngClass]=\"{\r\n 'tw-right-11 tw-border-b-bubble-mine tw-border-l-bubble-mine tw-border-r-transparent':\r\n message.owner.id === userId,\r\n 'tw-left-11 tw-border-b-default tw-border-r-default tw-border-l-transparent':\r\n message.owner.id !== userId\r\n }\"\r\n ></div>\r\n }\r\n <div\r\n @inPaneAnimation\r\n class=\"tw-max-w-[80%] tw-min-w-40 tw-rounded-2xl tw-text-base tw-relative tw-overflow-hidden\"\r\n [ngClass]=\"{\r\n '!tw-rounded-br-none':\r\n message.owner.id === userId && (nextHasBadge || (nextIsSame && !nextHasBadge) || !nextIsSame),\r\n '!tw-rounded-bl-none':\r\n message.owner.id !== userId && (nextHasBadge || (nextIsSame && !nextHasBadge) || !nextIsSame),\r\n '!tw-rounded-tr-none': message.owner.id === userId && pervIsSame && !badge,\r\n '!tw-rounded-tl-none': message.owner.id !== userId && pervIsSame && !badge\r\n }\"\r\n >\r\n @if (showSender && (!pervIsSame || badge)) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId && !message.image,\r\n'tw-bg-default': message.owner.id !== userId && !message.image,\r\n'tw-absolute tw-top-0 tw-right-0 tw-pb-8 tw-w-full tw-rounded-tr-2xl tw-bg-gradient-to-b tw-to-transparent': message.image,\r\n'tw-from-bubble-mine': message.owner.id === userId && message.image,\r\n'tw-from-default': message.owner.id !== userId && message.image,\r\n }\"\r\n class=\"tw-font-bold tw-text-base tw-px-3 tw-pt-2 tw-z-10\"\r\n >\r\n {{ message.owner.name }}\r\n </div>\r\n } @if (message.image) { @if (imageRatio(message.image); as image) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine/[.3]': message.owner.id === userId,\r\n'tw-bg-default/[.3]': message.owner.id !== userId,\r\n }\"\r\n class=\"tw-flex tw-justify-center tw-items-center tw-bg-zinc-500/[.3] tw-relative\"\r\n >\r\n <a\r\n [download]=\"message.image.name\"\r\n href=\"assets/bg-chat.jpg\"\r\n target=\"_blank\"\r\n class=\"tw-absolute tw-w-full tw-h-full tw-bg-black/[.4] dark:tw-bg-white/[.4] tw-opacity-0 hover:tw-opacity-100 tw-transition-all tw-cursor-pointer tw-flex tw-justify-center tw-items-center\"\r\n >\r\n <fd-icon class=\"!tw-text-default !tw-text-3xl\" glyph=\"download\"></fd-icon>\r\n </a>\r\n <img\r\n [ngStyle]=\"{\r\n width: image.displayWidth + 'px',\r\n height: image.displayHeight + 'px'\r\n }\"\r\n [src]=\"image.url\"\r\n />\r\n </div>\r\n } } @for(file of message.files;track file.Id) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId,\r\n'tw-bg-default': message.owner.id !== userId,\r\n }\"\r\n class=\"tw-px-2 tw-pt-2 w-full tw-flex tw-gap-2\"\r\n >\r\n <a\r\n downloadFiles\r\n [files]=\"[file]\"\r\n class=\"tw-shrink-0 tw-row-0 tw-size-12 tw-rounded-lg tw-bg-orange-400 tw-flex tw-justify-center tw-items-center tw-cursor-pointer tw-transition-all hover:tw-bg-orange-600\"\r\n >\r\n <span class=\"tw-font-bold leading-6 tw-text-lg tw-text-white\">\r\n {{ file.Type }}\r\n </span>\r\n </a>\r\n <div class=\"tw-flex tw-flex-col\">\r\n <span\r\n class=\"tw-font-bold tw-text-md tw-text-base tw-w-full tw-truncate\"\r\n [attr.title]=\"file.FileName\"\r\n >\r\n {{ file.FileName }}</span\r\n >\r\n <span class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400 tw-w-full tw-truncate\">\r\n {{ file.Size }}KB</span\r\n >\r\n </div>\r\n </div>\r\n } @if (message.text) {\r\n <div\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId,\r\n'tw-bg-default': message.owner.id !== userId,\r\n }\"\r\n class=\"tw-whitespace-pre-line tw-px-3 tw-pt-1\"\r\n [innerHTML]=\"message.text\"\r\n ></div>\r\n }\r\n <div\r\n class=\"tw-flex tw-w-full tw-px-2 tw-pt-1 tw-pb-2 tw-items-center tw-gap-2 tw-justify-end\"\r\n [ngClass]=\"{\r\n'tw-bg-bubble-mine': message.owner.id === userId,\r\n'tw-bg-default tw-flex-row-reverse': message.owner.id !== userId,\r\n}\"\r\n >\r\n <span class=\"tw-text-xs tw-text-gray-500 dark:tw-text-gray-300\">{{\r\n message.createdAt | utilDateToHhMm\r\n }}</span>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<ng-template #moreActions>\r\n <fd-popover placement=\"bottom-end\" title=\"bottom-end\">\r\n <fd-popover-control>\r\n <button\r\n fd-button\r\n fdType=\"transparent\"\r\n [fdCompact]=\"true\"\r\n glyph=\"navigation-down-arrow\"\r\n ></button>\r\n </fd-popover-control>\r\n <fd-popover-body minWidth=\"10rem\">\r\n <div class=\"tw-flex tw-flex-col tw-bg-default tw-w-full\" bodyClick>\r\n <label\r\n class=\"tw-px-4 tw-py-2 tw-flex tw-gap-2 tw-w-full hover:tw-bg-base/[.1] tw-transition-all tw-cursor-pointer\"\r\n (click)=\"reply.emit(message)\"\r\n >\r\n <fd-icon class=\"!tw-text-base !tw-text-3xl\" glyph=\"undo\"></fd-icon>\r\n <span class=\"!tw-text-base\">\u067E\u0627\u0633\u062E \u062F\u0627\u062F\u0646</span>\r\n </label>\r\n <label\r\n class=\"tw-px-4 tw-py-2 tw-flex tw-gap-2 tw-w-full hover:tw-bg-base/[.1] tw-transition-all tw-cursor-pointer\"\r\n >\r\n <fd-icon class=\"!tw-text-base !tw-text-3xl\" glyph=\"forward\"></fd-icon>\r\n <span class=\"!tw-text-base\">\u0627\u0631\u0633\u0627\u0644 \u06A9\u0631\u062F\u0646</span>\r\n </label>\r\n <label\r\n class=\"tw-px-4 tw-py-2 tw-flex tw-gap-2 tw-w-full hover:tw-bg-base/[.1] tw-transition-all tw-cursor-pointer\"\r\n >\r\n <fd-icon class=\"!tw-text-base !tw-text-3xl\" glyph=\"delete\"></fd-icon>\r\n <span class=\"!tw-text-base\">\u062D\u0630\u0641</span>\r\n </label>\r\n </div>\r\n </fd-popover-body>\r\n </fd-popover>\r\n</ng-template>\r\n" }]
61
62
  }], propDecorators: { message: [{
62
63
  type: Input
63
64
  }], showSender: [{
@@ -75,4 +76,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
75
76
  }], reply: [{
76
77
  type: Output
77
78
  }] } });
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyc2EtY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXNhcC11aS9zcmMvbGliL2JhcnNhLWNoYXQtbWVzc2FnZS9iYXJzYS1jaGF0LW1lc3NhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etc2FwLXVpL3NyYy9saWIvYmFyc2EtY2hhdC1tZXNzYWdlL2JhcnNhLWNoYXQtbWVzc2FnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7OztBQXFCMUUsTUFBTSxPQUFPLHlCQUF5QjtJQWxCdEM7UUEwQmMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDMUMsV0FBTSxHQUFHLCtCQUErQixDQUFDO0tBaUI1QztJQWZHLFVBQVUsQ0FBQyxLQUFVO1FBQ2pCLE1BQU0sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQ2hELElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDdEIsSUFBSSxhQUFhLEdBQUcsY0FBYyxFQUFFLENBQUM7WUFDakMsTUFBTSxLQUFLLEdBQUcsYUFBYSxHQUFHLEdBQUcsQ0FBQztZQUNsQyxZQUFZLEdBQUcsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUNyQyxhQUFhLEdBQUcsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUMzQyxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sS0FBSyxHQUFHLGNBQWMsR0FBRyxHQUFHLENBQUM7WUFDbkMsWUFBWSxHQUFHLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDckMsYUFBYSxHQUFHLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDM0MsQ0FBQztRQUNELE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLENBQUM7SUFDckQsQ0FBQzsrR0F6QlEseUJBQXlCO21HQUF6Qix5QkFBeUIsaVJDdEJ0Qyw2dFJBK0tBLGsvRER2S2dCO1lBQ1IsT0FBTyxDQUFDLGlCQUFpQixFQUFFO2dCQUN2QixVQUFVLENBQUMsUUFBUSxFQUFFO29CQUNqQixLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQztvQkFDL0MsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQztpQkFDdEYsQ0FBQztnQkFDRixVQUFVLENBQUMsUUFBUSxFQUFFO29CQUNqQixLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO29CQUNyRCxPQUFPLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztpQkFDaEYsQ0FBQzthQUNMLENBQUM7U0FDTDs7NEZBR1EseUJBQXlCO2tCQWxCckMsU0FBUzsrQkFDSSx3QkFBd0IsY0FHdEI7d0JBQ1IsT0FBTyxDQUFDLGlCQUFpQixFQUFFOzRCQUN2QixVQUFVLENBQUMsUUFBUSxFQUFFO2dDQUNqQixLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQztnQ0FDL0MsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQzs2QkFDdEYsQ0FBQzs0QkFDRixVQUFVLENBQUMsUUFBUSxFQUFFO2dDQUNqQixLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO2dDQUNyRCxPQUFPLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQzs2QkFDaEYsQ0FBQzt5QkFDTCxDQUFDO3FCQUNMLGNBQ1csS0FBSzs4QkFHUixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDSSxLQUFLO3NCQUFkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBhbmltYXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnLi4vYmFyc2EtY2hhdC9jaGF0Lm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdic3UtYmFyc2EtY2hhdC1tZXNzYWdlJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9iYXJzYS1jaGF0LW1lc3NhZ2UuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmw6ICcuL2JhcnNhLWNoYXQtbWVzc2FnZS5jb21wb25lbnQuY3NzJyxcclxuICAgIGFuaW1hdGlvbnM6IFtcclxuICAgICAgICB0cmlnZ2VyKCdpblBhbmVBbmltYXRpb24nLCBbXHJcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtcclxuICAgICAgICAgICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGUoMCwgMCknIH0pLFxyXG4gICAgICAgICAgICAgICAgYW5pbWF0ZSgnMzAwbXMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3NjYWxlKDEwMCUsIDEwMCUpJyB9KSlcclxuICAgICAgICAgICAgXSksXHJcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFtcclxuICAgICAgICAgICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAnc2NhbGUoMTAwJSwgMTAwJSknIH0pLFxyXG4gICAgICAgICAgICAgICAgYW5pbWF0ZSgnMzAwbXMgZWFzZS1pbi1vdXQnLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDAsIDApJyB9KSlcclxuICAgICAgICAgICAgXSlcclxuICAgICAgICBdKVxyXG4gICAgXSxcclxuICAgIHN0YW5kYWxvbmU6IGZhbHNlXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXJzYUNoYXRNZXNzYWdlQ29tcG9uZW50IHtcclxuICAgIEBJbnB1dCgpIG1lc3NhZ2U6IE1lc3NhZ2U7XHJcbiAgICBASW5wdXQoKSBzaG93U2VuZGVyOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgbmV4dElzU2FtZTogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIHBlcnZJc1NhbWU6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBiYWRnZTogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIG5leHRIYXNCYWRnZTogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIGJhZGdlTGFiZWw6IHN0cmluZztcclxuICAgIEBPdXRwdXQoKSByZXBseSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgdXNlcklkID0gJ19Jb3VnS1NLbHhGeEFmdFNJN2E0OFN6ay1Ha00xJztcclxuXHJcbiAgICBpbWFnZVJhdGlvKGltYWdlOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IHsgb3JpZ2luYWxXaWR0aCwgb3JpZ2luYWxIZWlnaHQgfSA9IGltYWdlO1xyXG4gICAgICAgIGxldCBkaXNwbGF5V2lkdGggPSAwO1xyXG4gICAgICAgIGxldCBkaXNwbGF5SGVpZ2h0ID0gMDtcclxuICAgICAgICBpZiAob3JpZ2luYWxXaWR0aCA+IG9yaWdpbmFsSGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhdGlvID0gb3JpZ2luYWxXaWR0aCAvIDMyMDtcclxuICAgICAgICAgICAgZGlzcGxheVdpZHRoID0gb3JpZ2luYWxXaWR0aCAvIHJhdGlvO1xyXG4gICAgICAgICAgICBkaXNwbGF5SGVpZ2h0ID0gb3JpZ2luYWxIZWlnaHQgLyByYXRpbztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByYXRpbyA9IG9yaWdpbmFsSGVpZ2h0IC8gMzIwO1xyXG4gICAgICAgICAgICBkaXNwbGF5V2lkdGggPSBvcmlnaW5hbFdpZHRoIC8gcmF0aW87XHJcbiAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQgPSBvcmlnaW5hbEhlaWdodCAvIHJhdGlvO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyAuLi5pbWFnZSwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0IH07XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdlxyXG4gICAgY2xhc3M9XCJ0dy13LWZ1bGwgdHctcHgtNCB0dy1mbGV4IHR3LWZsZXgtd3JhcFwiXHJcbiAgICBbbmdDbGFzc109XCJ7XHJcbid0dy1wdC0xJzogcGVydklzU2FtZSxcclxuJ3R3LXB0LTMnOiAhcGVydklzU2FtZSxcclxufVwiXHJcbj5cclxuICAgIEBpZiAoYmFkZ2UpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ0dy13LWZ1bGwgdHctcGItNiB0dy1wdC01XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXctZml0IHR3LWJnLXppbmMtNTAwIHR3LXRleHQtd2hpdGUgdHctcHgtNCB0dy1teC1hdXRvIHR3LXJvdW5kZWQtZnVsbCB0dy10ZXh0LW1kXCI+XHJcbiAgICAgICAgICAgIHt7IGJhZGdlTGFiZWwgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwidHctdy1mdWxsIHR3LWZsZXggdHctZ2FwLTIgdHctaXRlbXMtZW5kIHR3LXJlbGF0aXZlXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7XHJcbid0dy1qdXN0aWZ5LXN0YXJ0JzogbWVzc2FnZS5vd25lci5pZCA9PT0gdXNlcklkLFxyXG4ndHctZmxleC1yb3ctcmV2ZXJzZSc6IG1lc3NhZ2Uub3duZXIuaWQgIT09IHVzZXJJZCxcclxuJ3R3LW1zLTE0JzogKG5leHRJc1NhbWUgJiYgIW5leHRIYXNCYWRnZSkgJiYgbWVzc2FnZS5vd25lci5pZCA9PT0gdXNlcklkLFxyXG4ndHctbWUtMTQnOiAobmV4dElzU2FtZSAmJiAhbmV4dEhhc0JhZGdlKSAmJiBtZXNzYWdlLm93bmVyLmlkICE9PSB1c2VySWQsXHJcbiAgICB9XCJcclxuICAgID5cclxuICAgICAgICBAaWYgKCFuZXh0SXNTYW1lIHx8IG5leHRIYXNCYWRnZSkge1xyXG4gICAgICAgIDxmZC1hdmF0YXJcclxuICAgICAgICAgICAgc2l6ZT1cInNcIlxyXG4gICAgICAgICAgICBbbGFiZWxdPVwibWVzc2FnZS5vd25lci5hdmF0YXIgPyAnJyA6IG1lc3NhZ2Uub3duZXI/Lm5hbWVcIlxyXG4gICAgICAgICAgICBbY2lyY2xlXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbaW1hZ2VdPVwibWVzc2FnZS5vd25lcj8uYXZhdGFyXCJcclxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIm1lc3NhZ2Uub3duZXIuYXZhdGFyID8gZmFsc2UgOiB0cnVlXCJcclxuICAgICAgICA+PC9mZC1hdmF0YXI+XHJcbiAgICAgICAgfSBAaWYgKCFuZXh0SXNTYW1lIHx8IG5leHRIYXNCYWRnZSkge1xyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJ0dy1iZy10cmFuc3BhcmVudCB0dy1vdmVyZmxvdy1oaWRkZW4gdHctc2l6ZS0zIHR3LWFic29sdXRlIHR3LWJvdHRvbS0wIHR3LWJvcmRlci1bNnB4XSB0dy1ib3JkZXItdC10cmFuc3BhcmVudFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICd0dy1yaWdodC0xMSB0dy1ib3JkZXItYi1idWJibGUtbWluZSB0dy1ib3JkZXItbC1idWJibGUtbWluZSB0dy1ib3JkZXItci10cmFuc3BhcmVudCc6XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vd25lci5pZCA9PT0gdXNlcklkLFxyXG4gICAgICAgICAgICAgICAgJ3R3LWxlZnQtMTEgdHctYm9yZGVyLWItZGVmYXVsdCB0dy1ib3JkZXItci1kZWZhdWx0IHR3LWJvcmRlci1sLXRyYW5zcGFyZW50JzpcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm93bmVyLmlkICE9PSB1c2VySWRcclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIEBpblBhbmVBbmltYXRpb25cclxuICAgICAgICAgICAgY2xhc3M9XCJ0dy1tYXgtdy1bODAlXSB0dy1taW4tdy00MCB0dy1yb3VuZGVkLTJ4bCB0dy10ZXh0LWJhc2UgdHctcmVsYXRpdmUgdHctb3ZlcmZsb3ctaGlkZGVuXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgJyF0dy1yb3VuZGVkLWJyLW5vbmUnOlxyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3duZXIuaWQgPT09IHVzZXJJZCAmJiAobmV4dEhhc0JhZGdlIHx8IChuZXh0SXNTYW1lICYmICFuZXh0SGFzQmFkZ2UpIHx8ICFuZXh0SXNTYW1lKSxcclxuICAgICAgICAgICAgICAgICchdHctcm91bmRlZC1ibC1ub25lJzpcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm93bmVyLmlkICE9PSB1c2VySWQgJiYgKG5leHRIYXNCYWRnZSB8fCAobmV4dElzU2FtZSAmJiAhbmV4dEhhc0JhZGdlKSB8fCAhbmV4dElzU2FtZSksXHJcbiAgICAgICAgICAgICAgICAnIXR3LXJvdW5kZWQtdHItbm9uZSc6IG1lc3NhZ2Uub3duZXIuaWQgPT09IHVzZXJJZCAmJiBwZXJ2SXNTYW1lICYmICFiYWRnZSxcclxuICAgICAgICAgICAgICAgICchdHctcm91bmRlZC10bC1ub25lJzogbWVzc2FnZS5vd25lci5pZCAhPT0gdXNlcklkICYmIHBlcnZJc1NhbWUgJiYgIWJhZGdlXHJcbiAgICAgICAgICAgIH1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgQGlmIChzaG93U2VuZGVyICYmICghcGVydklzU2FtZSB8fCBiYWRnZSkpIHtcclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4ndHctYmctYnViYmxlLW1pbmUnOiBtZXNzYWdlLm93bmVyLmlkID09PSB1c2VySWQgJiYgIW1lc3NhZ2UuaW1hZ2UsXHJcbid0dy1iZy1kZWZhdWx0JzogbWVzc2FnZS5vd25lci5pZCAhPT0gdXNlcklkICYmICFtZXNzYWdlLmltYWdlLFxyXG4ndHctYWJzb2x1dGUgdHctdG9wLTAgdHctcmlnaHQtMCB0dy1wYi04IHR3LXctZnVsbCB0dy1yb3VuZGVkLXRyLTJ4bCB0dy1iZy1ncmFkaWVudC10by1iIHR3LXRvLXRyYW5zcGFyZW50JzogbWVzc2FnZS5pbWFnZSxcclxuJ3R3LWZyb20tYnViYmxlLW1pbmUnOiBtZXNzYWdlLm93bmVyLmlkID09PSB1c2VySWQgJiYgbWVzc2FnZS5pbWFnZSxcclxuJ3R3LWZyb20tZGVmYXVsdCc6IG1lc3NhZ2Uub3duZXIuaWQgIT09IHVzZXJJZCAmJiBtZXNzYWdlLmltYWdlLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1mb250LWJvbGQgdHctdGV4dC1iYXNlIHR3LXB4LTMgdHctcHQtMiB0dy16LTEwXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3sgbWVzc2FnZS5vd25lci5uYW1lIH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9IEBpZiAobWVzc2FnZS5pbWFnZSkgeyBAaWYgKGltYWdlUmF0aW8obWVzc2FnZS5pbWFnZSk7IGFzIGltYWdlKSB7XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuJ3R3LWJnLWJ1YmJsZS1taW5lL1suM10nOiBtZXNzYWdlLm93bmVyLmlkID09PSB1c2VySWQsXHJcbid0dy1iZy1kZWZhdWx0L1suM10nOiBtZXNzYWdlLm93bmVyLmlkICE9PSB1c2VySWQsXHJcbiAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInR3LWZsZXggdHctanVzdGlmeS1jZW50ZXIgdHctaXRlbXMtY2VudGVyIHR3LWJnLXppbmMtNTAwL1suM10gdHctcmVsYXRpdmVcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8YVxyXG4gICAgICAgICAgICAgICAgICAgIFtkb3dubG9hZF09XCJtZXNzYWdlLmltYWdlLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGhyZWY9XCJhc3NldHMvYmctY2hhdC5qcGdcIlxyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1hYnNvbHV0ZSB0dy13LWZ1bGwgdHctaC1mdWxsIHR3LWJnLWJsYWNrL1suNF0gZGFyazp0dy1iZy13aGl0ZS9bLjRdIHR3LW9wYWNpdHktMCBob3Zlcjp0dy1vcGFjaXR5LTEwMCB0dy10cmFuc2l0aW9uLWFsbCB0dy1jdXJzb3ItcG9pbnRlciB0dy1mbGV4IHR3LWp1c3RpZnktY2VudGVyIHR3LWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZkLWljb24gY2xhc3M9XCIhdHctdGV4dC1kZWZhdWx0ICF0dy10ZXh0LTN4bFwiIGdseXBoPVwiZG93bmxvYWRcIj48L2ZkLWljb24+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogaW1hZ2UuZGlzcGxheVdpZHRoICsgJ3B4JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBpbWFnZS5kaXNwbGF5SGVpZ2h0ICsgJ3B4J1xyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiaW1hZ2UudXJsXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9IH0gQGlmIChtZXNzYWdlLmZpbGU/Lm5hbWUpIHtcclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4ndHctYmctYnViYmxlLW1pbmUnOiBtZXNzYWdlLm93bmVyLmlkID09PSB1c2VySWQsXHJcbid0dy1iZy1kZWZhdWx0JzogbWVzc2FnZS5vd25lci5pZCAhPT0gdXNlcklkLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1weC0yIHR3LXB0LTIgdy1mdWxsIHR3LWZsZXggdHctZ2FwLTJcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8YVxyXG4gICAgICAgICAgICAgICAgICAgIFtkb3dubG9hZF09XCJtZXNzYWdlLmZpbGU/LkZpbGVOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBocmVmPVwiYXNzZXRzL2JnLWNoYXQuanBnXCJcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHctc2hyaW5rLTAgdHctcm93LTAgdHctc2l6ZS0xMiB0dy1yb3VuZGVkLWxnIHR3LWJnLW9yYW5nZS00MDAgdHctZmxleCB0dy1qdXN0aWZ5LWNlbnRlciB0dy1pdGVtcy1jZW50ZXIgdHctY3Vyc29yLXBvaW50ZXIgdHctdHJhbnNpdGlvbi1hbGwgaG92ZXI6dHctYmctb3JhbmdlLTYwMFwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0dy1mb250LWJvbGQgbGVhZGluZy02IHR3LXRleHQtbGcgdHctdGV4dC13aGl0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBtZXNzYWdlLmZpbGU/LlR5cGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctZmxleCB0dy1mbGV4LWNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHctZm9udC1ib2xkIHR3LXRleHQtbWQgdHctdGV4dC1iYXNlIHR3LXctZnVsbCB0dy10cnVuY2F0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBtZXNzYWdlLmZpbGU/LkZpbGVOYW1lIH19PC9zcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHctdGV4dC1zbSB0dy10ZXh0LWdyYXktNTAwIGRhcms6dHctdGV4dC1ncmF5LTQwMCB0dy13LWZ1bGwgdHctdHJ1bmNhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgbWVzc2FnZS5maWxlPy5TaXplIH19PC9zcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9IEBpZiAobWVzc2FnZS50ZXh0KSB7XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuJ3R3LWJnLWJ1YmJsZS1taW5lJzogbWVzc2FnZS5vd25lci5pZCA9PT0gdXNlcklkLFxyXG4ndHctYmctZGVmYXVsdCc6IG1lc3NhZ2Uub3duZXIuaWQgIT09IHVzZXJJZCxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHctd2hpdGVzcGFjZS1wcmUtbGluZSB0dy1weC0zIHR3LXB0LTFcIlxyXG4gICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJtZXNzYWdlLnRleHRcIlxyXG4gICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1mbGV4IHR3LXctZnVsbCB0dy1weC0yIHR3LXB0LTEgdHctcGItMiB0dy1pdGVtcy1jZW50ZXIgdHctZ2FwLTIgdHctanVzdGlmeS1lbmRcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4ndHctYmctYnViYmxlLW1pbmUnOiBtZXNzYWdlLm93bmVyLmlkID09PSB1c2VySWQsXHJcbid0dy1iZy1kZWZhdWx0IHR3LWZsZXgtcm93LXJldmVyc2UnOiBtZXNzYWdlLm93bmVyLmlkICE9PSB1c2VySWQsXHJcbn1cIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInR3LXRleHQteHMgdHctdGV4dC1ncmF5LTUwMCBkYXJrOnR3LXRleHQtZ3JheS0zMDBcIj57e1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY3JlYXRlZEF0IHwgdXRpbERhdGVUb0hoTW1cclxuICAgICAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGZkLXBvcG92ZXIgcGxhY2VtZW50PVwiYm90dG9tLWVuZFwiIHRpdGxlPVwiYm90dG9tLWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmZC1wb3BvdmVyLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRUeXBlPVwidHJhbnNwYXJlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZkQ29tcGFjdF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoPVwibmF2aWdhdGlvbi1kb3duLWFycm93XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZmQtcG9wb3Zlci1jb250cm9sPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmZC1wb3BvdmVyLWJvZHkgbWluV2lkdGg9XCIxMHJlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctZmxleCB0dy1mbGV4LWNvbCB0dy1iZy1kZWZhdWx0IHR3LXctZnVsbFwiIGJvZHlDbGljaz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHctcHgtNCB0dy1weS0yIHR3LWZsZXggdHctZ2FwLTIgdHctdy1mdWxsIGhvdmVyOnR3LWJnLWJhc2UvWy4xXSB0dy10cmFuc2l0aW9uLWFsbCB0dy1jdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlcGx5LmVtaXQobWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZC1pY29uIGNsYXNzPVwiIXR3LXRleHQtYmFzZSAhdHctdGV4dC0zeGxcIiBnbHlwaD1cInVuZG9cIj48L2ZkLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCIhdHctdGV4dC1iYXNlXCI+2b7Yp9iz2K4g2K/Yp9iv2YY8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1weC00IHR3LXB5LTIgdHctZmxleCB0dy1nYXAtMiB0dy13LWZ1bGwgaG92ZXI6dHctYmctYmFzZS9bLjFdIHR3LXRyYW5zaXRpb24tYWxsIHR3LWN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmQtaWNvbiBjbGFzcz1cIiF0dy10ZXh0LWJhc2UgIXR3LXRleHQtM3hsXCIgZ2x5cGg9XCJmb3J3YXJkXCI+PC9mZC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIXR3LXRleHQtYmFzZVwiPtin2LHYs9in2YQg2qnYsdiv2YY8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1weC00IHR3LXB5LTIgdHctZmxleCB0dy1nYXAtMiB0dy13LWZ1bGwgaG92ZXI6dHctYmctYmFzZS9bLjFdIHR3LXRyYW5zaXRpb24tYWxsIHR3LWN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmQtaWNvbiBjbGFzcz1cIiF0dy10ZXh0LWJhc2UgIXR3LXRleHQtM3hsXCIgZ2x5cGg9XCJkZWxldGVcIj48L2ZkLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCIhdHctdGV4dC1iYXNlXCI+2K3YsNmBPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9mZC1wb3BvdmVyLWJvZHk+XHJcbiAgICAgICAgICAgICAgICA8L2ZkLXBvcG92ZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyc2EtY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXNhcC11aS9zcmMvbGliL2JhcnNhLWNoYXQtbWVzc2FnZS9iYXJzYS1jaGF0LW1lc3NhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etc2FwLXVpL3NyYy9saWIvYmFyc2EtY2hhdC1tZXNzYWdlL2JhcnNhLWNoYXQtbWVzc2FnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7QUFxQjFFLE1BQU0sT0FBTyx5QkFBeUI7SUFsQnRDO1FBMEJjLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzFDLFdBQU0sR0FBRywrQkFBK0IsQ0FBQztLQWlCNUM7SUFmRyxVQUFVLENBQUMsS0FBVTtRQUNqQixNQUFNLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUNoRCxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksYUFBYSxHQUFHLGNBQWMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sS0FBSyxHQUFHLGFBQWEsR0FBRyxHQUFHLENBQUM7WUFDbEMsWUFBWSxHQUFHLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDckMsYUFBYSxHQUFHLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLEtBQUssR0FBRyxjQUFjLEdBQUcsR0FBRyxDQUFDO1lBQ25DLFlBQVksR0FBRyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQ3JDLGFBQWEsR0FBRyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzNDLENBQUM7UUFDRCxPQUFPLEVBQUUsR0FBRyxLQUFLLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ3JELENBQUM7K0dBekJRLHlCQUF5QjttR0FBekIseUJBQXlCLGlSQ3RCdEMsNjZRQW9MQSwwbEVENUtnQjtZQUNSLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtnQkFDdkIsVUFBVSxDQUFDLFFBQVEsRUFBRTtvQkFDakIsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUM7b0JBQy9DLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUM7aUJBQ3RGLENBQUM7Z0JBQ0YsVUFBVSxDQUFDLFFBQVEsRUFBRTtvQkFDakIsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztvQkFDckQsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7aUJBQ2hGLENBQUM7YUFDTCxDQUFDO1NBQ0w7OzRGQUdRLHlCQUF5QjtrQkFsQnJDLFNBQVM7K0JBQ0ksd0JBQXdCLGNBR3RCO3dCQUNSLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTs0QkFDdkIsVUFBVSxDQUFDLFFBQVEsRUFBRTtnQ0FDakIsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUM7Z0NBQy9DLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUM7NkJBQ3RGLENBQUM7NEJBQ0YsVUFBVSxDQUFDLFFBQVEsRUFBRTtnQ0FDakIsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztnQ0FDckQsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7NkJBQ2hGLENBQUM7eUJBQ0wsQ0FBQztxQkFDTCxjQUNXLEtBQUs7OEJBR1IsT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgYW5pbWF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4uL2JhcnNhLWNoYXQvY2hhdC5tb2RlbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYnN1LWJhcnNhLWNoYXQtbWVzc2FnZScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vYmFyc2EtY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsOiAnLi9iYXJzYS1jaGF0LW1lc3NhZ2UuY29tcG9uZW50LmNzcycsXHJcbiAgICBhbmltYXRpb25zOiBbXHJcbiAgICAgICAgdHJpZ2dlcignaW5QYW5lQW5pbWF0aW9uJywgW1xyXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbXHJcbiAgICAgICAgICAgICAgICBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDAsIDApJyB9KSxcclxuICAgICAgICAgICAgICAgIGFuaW1hdGUoJzMwMG1zIGVhc2UtaW4tb3V0Jywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICdzY2FsZSgxMDAlLCAxMDAlKScgfSkpXHJcbiAgICAgICAgICAgIF0pLFxyXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXHJcbiAgICAgICAgICAgICAgICBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3NjYWxlKDEwMCUsIDEwMCUpJyB9KSxcclxuICAgICAgICAgICAgICAgIGFuaW1hdGUoJzMwMG1zIGVhc2UtaW4tb3V0Jywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdzY2FsZSgwLCAwKScgfSkpXHJcbiAgICAgICAgICAgIF0pXHJcbiAgICAgICAgXSlcclxuICAgIF0sXHJcbiAgICBzdGFuZGFsb25lOiBmYWxzZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFyc2FDaGF0TWVzc2FnZUNvbXBvbmVudCB7XHJcbiAgICBASW5wdXQoKSBtZXNzYWdlOiBNZXNzYWdlO1xyXG4gICAgQElucHV0KCkgc2hvd1NlbmRlcjogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIG5leHRJc1NhbWU6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBwZXJ2SXNTYW1lOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgYmFkZ2U6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBuZXh0SGFzQmFkZ2U6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBiYWRnZUxhYmVsOiBzdHJpbmc7XHJcbiAgICBAT3V0cHV0KCkgcmVwbHkgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIHVzZXJJZCA9ICdfSW91Z0tTS2x4RnhBZnRTSTdhNDhTemstR2tNMSc7XHJcblxyXG4gICAgaW1hZ2VSYXRpbyhpbWFnZTogYW55KTogYW55IHtcclxuICAgICAgICBjb25zdCB7IG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0IH0gPSBpbWFnZTtcclxuICAgICAgICBsZXQgZGlzcGxheVdpZHRoID0gMDtcclxuICAgICAgICBsZXQgZGlzcGxheUhlaWdodCA9IDA7XHJcbiAgICAgICAgaWYgKG9yaWdpbmFsV2lkdGggPiBvcmlnaW5hbEhlaWdodCkge1xyXG4gICAgICAgICAgICBjb25zdCByYXRpbyA9IG9yaWdpbmFsV2lkdGggLyAzMjA7XHJcbiAgICAgICAgICAgIGRpc3BsYXlXaWR0aCA9IG9yaWdpbmFsV2lkdGggLyByYXRpbztcclxuICAgICAgICAgICAgZGlzcGxheUhlaWdodCA9IG9yaWdpbmFsSGVpZ2h0IC8gcmF0aW87XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcmF0aW8gPSBvcmlnaW5hbEhlaWdodCAvIDMyMDtcclxuICAgICAgICAgICAgZGlzcGxheVdpZHRoID0gb3JpZ2luYWxXaWR0aCAvIHJhdGlvO1xyXG4gICAgICAgICAgICBkaXNwbGF5SGVpZ2h0ID0gb3JpZ2luYWxIZWlnaHQgLyByYXRpbztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgLi4uaW1hZ2UsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCB9O1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXZcclxuICAgIGNsYXNzPVwidHctdy1mdWxsIHR3LXB4LTQgdHctZmxleCB0dy1mbGV4LXdyYXBcIlxyXG4gICAgW25nQ2xhc3NdPVwie1xyXG4ndHctcHQtMSc6IHBlcnZJc1NhbWUsXHJcbid0dy1wdC0zJzogIXBlcnZJc1NhbWUsXHJcbn1cIlxyXG4+XHJcbiAgICBAaWYgKGJhZGdlKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwidHctdy1mdWxsIHR3LXBiLTYgdHctcHQtNVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dy13LWZpdCB0dy1iZy16aW5jLTUwMCB0dy10ZXh0LXdoaXRlIHR3LXB4LTQgdHctbXgtYXV0byB0dy1yb3VuZGVkLWZ1bGwgdHctdGV4dC1tZFwiPlxyXG4gICAgICAgICAgICB7eyBiYWRnZUxhYmVsIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cInR3LXctZnVsbCB0dy1mbGV4IHR3LWdhcC0yIHR3LWl0ZW1zLWVuZCB0dy1yZWxhdGl2ZVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4ndHctanVzdGlmeS1zdGFydCc6IG1lc3NhZ2Uub3duZXIuaWQgPT09IHVzZXJJZCxcclxuJ3R3LWZsZXgtcm93LXJldmVyc2UnOiBtZXNzYWdlLm93bmVyLmlkICE9PSB1c2VySWQsXHJcbid0dy1tcy0xNCc6IChuZXh0SXNTYW1lICYmICFuZXh0SGFzQmFkZ2UpICYmIG1lc3NhZ2Uub3duZXIuaWQgPT09IHVzZXJJZCxcclxuJ3R3LW1lLTE0JzogKG5leHRJc1NhbWUgJiYgIW5leHRIYXNCYWRnZSkgJiYgbWVzc2FnZS5vd25lci5pZCAhPT0gdXNlcklkLFxyXG4gICAgfVwiXHJcbiAgICA+XHJcbiAgICAgICAgQGlmICghbmV4dElzU2FtZSB8fCBuZXh0SGFzQmFkZ2UpIHtcclxuICAgICAgICA8ZmQtYXZhdGFyXHJcbiAgICAgICAgICAgIHNpemU9XCJzXCJcclxuICAgICAgICAgICAgW2xhYmVsXT1cIm1lc3NhZ2Uub3duZXIuYXZhdGFyID8gJycgOiBtZXNzYWdlLm93bmVyPy5uYW1lXCJcclxuICAgICAgICAgICAgW2NpcmNsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgW2ltYWdlXT1cIm1lc3NhZ2Uub3duZXI/LmF2YXRhclwiXHJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJtZXNzYWdlLm93bmVyLmF2YXRhciA/IGZhbHNlIDogdHJ1ZVwiXHJcbiAgICAgICAgPjwvZmQtYXZhdGFyPlxyXG4gICAgICAgIH0gQGlmICghbmV4dElzU2FtZSB8fCBuZXh0SGFzQmFkZ2UpIHtcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwidHctYmctdHJhbnNwYXJlbnQgdHctb3ZlcmZsb3ctaGlkZGVuIHR3LXNpemUtMyB0dy1hYnNvbHV0ZSB0dy1ib3R0b20tMCB0dy1ib3JkZXItWzZweF0gdHctYm9yZGVyLXQtdHJhbnNwYXJlbnRcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAndHctcmlnaHQtMTEgdHctYm9yZGVyLWItYnViYmxlLW1pbmUgdHctYm9yZGVyLWwtYnViYmxlLW1pbmUgdHctYm9yZGVyLXItdHJhbnNwYXJlbnQnOlxyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3duZXIuaWQgPT09IHVzZXJJZCxcclxuICAgICAgICAgICAgICAgICd0dy1sZWZ0LTExIHR3LWJvcmRlci1iLWRlZmF1bHQgdHctYm9yZGVyLXItZGVmYXVsdCB0dy1ib3JkZXItbC10cmFuc3BhcmVudCc6XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vd25lci5pZCAhPT0gdXNlcklkXHJcbiAgICAgICAgICAgIH1cIlxyXG4gICAgICAgID48L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBAaW5QYW5lQW5pbWF0aW9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwidHctbWF4LXctWzgwJV0gdHctbWluLXctNDAgdHctcm91bmRlZC0yeGwgdHctdGV4dC1iYXNlIHR3LXJlbGF0aXZlIHR3LW92ZXJmbG93LWhpZGRlblwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICchdHctcm91bmRlZC1ici1ub25lJzpcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm93bmVyLmlkID09PSB1c2VySWQgJiYgKG5leHRIYXNCYWRnZSB8fCAobmV4dElzU2FtZSAmJiAhbmV4dEhhc0JhZGdlKSB8fCAhbmV4dElzU2FtZSksXHJcbiAgICAgICAgICAgICAgICAnIXR3LXJvdW5kZWQtYmwtbm9uZSc6XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vd25lci5pZCAhPT0gdXNlcklkICYmIChuZXh0SGFzQmFkZ2UgfHwgKG5leHRJc1NhbWUgJiYgIW5leHRIYXNCYWRnZSkgfHwgIW5leHRJc1NhbWUpLFxyXG4gICAgICAgICAgICAgICAgJyF0dy1yb3VuZGVkLXRyLW5vbmUnOiBtZXNzYWdlLm93bmVyLmlkID09PSB1c2VySWQgJiYgcGVydklzU2FtZSAmJiAhYmFkZ2UsXHJcbiAgICAgICAgICAgICAgICAnIXR3LXJvdW5kZWQtdGwtbm9uZSc6IG1lc3NhZ2Uub3duZXIuaWQgIT09IHVzZXJJZCAmJiBwZXJ2SXNTYW1lICYmICFiYWRnZVxyXG4gICAgICAgICAgICB9XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIEBpZiAoc2hvd1NlbmRlciAmJiAoIXBlcnZJc1NhbWUgfHwgYmFkZ2UpKSB7XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuJ3R3LWJnLWJ1YmJsZS1taW5lJzogbWVzc2FnZS5vd25lci5pZCA9PT0gdXNlcklkICYmICFtZXNzYWdlLmltYWdlLFxyXG4ndHctYmctZGVmYXVsdCc6IG1lc3NhZ2Uub3duZXIuaWQgIT09IHVzZXJJZCAmJiAhbWVzc2FnZS5pbWFnZSxcclxuJ3R3LWFic29sdXRlIHR3LXRvcC0wIHR3LXJpZ2h0LTAgdHctcGItOCB0dy13LWZ1bGwgdHctcm91bmRlZC10ci0yeGwgdHctYmctZ3JhZGllbnQtdG8tYiB0dy10by10cmFuc3BhcmVudCc6IG1lc3NhZ2UuaW1hZ2UsXHJcbid0dy1mcm9tLWJ1YmJsZS1taW5lJzogbWVzc2FnZS5vd25lci5pZCA9PT0gdXNlcklkICYmIG1lc3NhZ2UuaW1hZ2UsXHJcbid0dy1mcm9tLWRlZmF1bHQnOiBtZXNzYWdlLm93bmVyLmlkICE9PSB1c2VySWQgJiYgbWVzc2FnZS5pbWFnZSxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHctZm9udC1ib2xkIHR3LXRleHQtYmFzZSB0dy1weC0zIHR3LXB0LTIgdHctei0xMFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7IG1lc3NhZ2Uub3duZXIubmFtZSB9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfSBAaWYgKG1lc3NhZ2UuaW1hZ2UpIHsgQGlmIChpbWFnZVJhdGlvKG1lc3NhZ2UuaW1hZ2UpOyBhcyBpbWFnZSkge1xyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbid0dy1iZy1idWJibGUtbWluZS9bLjNdJzogbWVzc2FnZS5vd25lci5pZCA9PT0gdXNlcklkLFxyXG4ndHctYmctZGVmYXVsdC9bLjNdJzogbWVzc2FnZS5vd25lci5pZCAhPT0gdXNlcklkLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1mbGV4IHR3LWp1c3RpZnktY2VudGVyIHR3LWl0ZW1zLWNlbnRlciB0dy1iZy16aW5jLTUwMC9bLjNdIHR3LXJlbGF0aXZlXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGFcclxuICAgICAgICAgICAgICAgICAgICBbZG93bmxvYWRdPVwibWVzc2FnZS5pbWFnZS5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBocmVmPVwiYXNzZXRzL2JnLWNoYXQuanBnXCJcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHctYWJzb2x1dGUgdHctdy1mdWxsIHR3LWgtZnVsbCB0dy1iZy1ibGFjay9bLjRdIGRhcms6dHctYmctd2hpdGUvWy40XSB0dy1vcGFjaXR5LTAgaG92ZXI6dHctb3BhY2l0eS0xMDAgdHctdHJhbnNpdGlvbi1hbGwgdHctY3Vyc29yLXBvaW50ZXIgdHctZmxleCB0dy1qdXN0aWZ5LWNlbnRlciB0dy1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmZC1pY29uIGNsYXNzPVwiIXR3LXRleHQtZGVmYXVsdCAhdHctdGV4dC0zeGxcIiBnbHlwaD1cImRvd25sb2FkXCI+PC9mZC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGltYWdlLmRpc3BsYXlXaWR0aCArICdweCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaW1hZ2UuZGlzcGxheUhlaWdodCArICdweCdcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImltYWdlLnVybFwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfSB9IEBmb3IoZmlsZSBvZiBtZXNzYWdlLmZpbGVzO3RyYWNrIGZpbGUuSWQpIHtcclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4ndHctYmctYnViYmxlLW1pbmUnOiBtZXNzYWdlLm93bmVyLmlkID09PSB1c2VySWQsXHJcbid0dy1iZy1kZWZhdWx0JzogbWVzc2FnZS5vd25lci5pZCAhPT0gdXNlcklkLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1weC0yIHR3LXB0LTIgdy1mdWxsIHR3LWZsZXggdHctZ2FwLTJcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8YVxyXG4gICAgICAgICAgICAgICAgICAgIGRvd25sb2FkRmlsZXNcclxuICAgICAgICAgICAgICAgICAgICBbZmlsZXNdPVwiW2ZpbGVdXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInR3LXNocmluay0wIHR3LXJvdy0wIHR3LXNpemUtMTIgdHctcm91bmRlZC1sZyB0dy1iZy1vcmFuZ2UtNDAwIHR3LWZsZXggdHctanVzdGlmeS1jZW50ZXIgdHctaXRlbXMtY2VudGVyIHR3LWN1cnNvci1wb2ludGVyIHR3LXRyYW5zaXRpb24tYWxsIGhvdmVyOnR3LWJnLW9yYW5nZS02MDBcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHctZm9udC1ib2xkIGxlYWRpbmctNiB0dy10ZXh0LWxnIHR3LXRleHQtd2hpdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsZS5UeXBlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctZmxleC1jb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInR3LWZvbnQtYm9sZCB0dy10ZXh0LW1kIHR3LXRleHQtYmFzZSB0dy13LWZ1bGwgdHctdHJ1bmNhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJmaWxlLkZpbGVOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpbGUuRmlsZU5hbWUgfX08L3NwYW5cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0dy10ZXh0LXNtIHR3LXRleHQtZ3JheS01MDAgZGFyazp0dy10ZXh0LWdyYXktNDAwIHR3LXctZnVsbCB0dy10cnVuY2F0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWxlLlNpemUgfX1LQjwvc3BhblxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfSBAaWYgKG1lc3NhZ2UudGV4dCkge1xyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbid0dy1iZy1idWJibGUtbWluZSc6IG1lc3NhZ2Uub3duZXIuaWQgPT09IHVzZXJJZCxcclxuJ3R3LWJnLWRlZmF1bHQnOiBtZXNzYWdlLm93bmVyLmlkICE9PSB1c2VySWQsXHJcbiAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInR3LXdoaXRlc3BhY2UtcHJlLWxpbmUgdHctcHgtMyB0dy1wdC0xXCJcclxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwibWVzc2FnZS50ZXh0XCJcclxuICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHctZmxleCB0dy13LWZ1bGwgdHctcHgtMiB0dy1wdC0xIHR3LXBiLTIgdHctaXRlbXMtY2VudGVyIHR3LWdhcC0yIHR3LWp1c3RpZnktZW5kXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuJ3R3LWJnLWJ1YmJsZS1taW5lJzogbWVzc2FnZS5vd25lci5pZCA9PT0gdXNlcklkLFxyXG4ndHctYmctZGVmYXVsdCB0dy1mbGV4LXJvdy1yZXZlcnNlJzogbWVzc2FnZS5vd25lci5pZCAhPT0gdXNlcklkLFxyXG59XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0dy10ZXh0LXhzIHR3LXRleHQtZ3JheS01MDAgZGFyazp0dy10ZXh0LWdyYXktMzAwXCI+e3tcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNyZWF0ZWRBdCB8IHV0aWxEYXRlVG9IaE1tXHJcbiAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPG5nLXRlbXBsYXRlICNtb3JlQWN0aW9ucz5cclxuICAgIDxmZC1wb3BvdmVyIHBsYWNlbWVudD1cImJvdHRvbS1lbmRcIiB0aXRsZT1cImJvdHRvbS1lbmRcIj5cclxuICAgICAgICA8ZmQtcG9wb3Zlci1jb250cm9sPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBmZC1idXR0b25cclxuICAgICAgICAgICAgICAgIGZkVHlwZT1cInRyYW5zcGFyZW50XCJcclxuICAgICAgICAgICAgICAgIFtmZENvbXBhY3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBnbHlwaD1cIm5hdmlnYXRpb24tZG93bi1hcnJvd1wiXHJcbiAgICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICA8L2ZkLXBvcG92ZXItY29udHJvbD5cclxuICAgICAgICA8ZmQtcG9wb3Zlci1ib2R5IG1pbldpZHRoPVwiMTByZW1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctZmxleC1jb2wgdHctYmctZGVmYXVsdCB0dy13LWZ1bGxcIiBib2R5Q2xpY2s+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInR3LXB4LTQgdHctcHktMiB0dy1mbGV4IHR3LWdhcC0yIHR3LXctZnVsbCBob3Zlcjp0dy1iZy1iYXNlL1suMV0gdHctdHJhbnNpdGlvbi1hbGwgdHctY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXBseS5lbWl0KG1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZmQtaWNvbiBjbGFzcz1cIiF0dy10ZXh0LWJhc2UgIXR3LXRleHQtM3hsXCIgZ2x5cGg9XCJ1bmRvXCI+PC9mZC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIXR3LXRleHQtYmFzZVwiPtm+2KfYs9iuINiv2KfYr9mGPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHctcHgtNCB0dy1weS0yIHR3LWZsZXggdHctZ2FwLTIgdHctdy1mdWxsIGhvdmVyOnR3LWJnLWJhc2UvWy4xXSB0dy10cmFuc2l0aW9uLWFsbCB0dy1jdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZkLWljb24gY2xhc3M9XCIhdHctdGV4dC1iYXNlICF0dy10ZXh0LTN4bFwiIGdseXBoPVwiZm9yd2FyZFwiPjwvZmQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiF0dy10ZXh0LWJhc2VcIj7Yp9ix2LPYp9mEINqp2LHYr9mGPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHctcHgtNCB0dy1weS0yIHR3LWZsZXggdHctZ2FwLTIgdHctdy1mdWxsIGhvdmVyOnR3LWJnLWJhc2UvWy4xXSB0dy10cmFuc2l0aW9uLWFsbCB0dy1jdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZkLWljb24gY2xhc3M9XCIhdHctdGV4dC1iYXNlICF0dy10ZXh0LTN4bFwiIGdseXBoPVwiZGVsZXRlXCI+PC9mZC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiIXR3LXRleHQtYmFzZVwiPtit2LDZgTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZmQtcG9wb3Zlci1ib2R5PlxyXG4gICAgPC9mZC1wb3BvdmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
@@ -114,6 +114,12 @@ export class BarsaTableHeaderComponent extends BaseComponent {
114
114
  this.columns[i].$Width = `${th.offsetWidth}px`;
115
115
  });
116
116
  }
117
+ SetColumnWidthToResizedTh(arr) {
118
+ this.thArr.forEach((th, i) => {
119
+ this.columns[i].Width = arr[i].width;
120
+ this.columns[i].$Width = `${arr[i].width}px`;
121
+ });
122
+ }
117
123
  SetColumnWidthToPercent() {
118
124
  const allWidth = this.theadRef.nativeElement.clientWidth;
119
125
  this.thArr.forEach((th, i) => {
@@ -131,11 +137,11 @@ export class BarsaTableHeaderComponent extends BaseComponent {
131
137
  return `${column.Name}${index}`;
132
138
  }
133
139
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BarsaTableHeaderComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
134
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: BarsaTableHeaderComponent, selector: "bsu-barsa-table-header", inputs: { allChecked: "allChecked", isCheckList: "isCheckList", attachmentViewType: "attachmentViewType", columns: "columns", fitWidth: "fitWidth", contextMenuItems: "contextMenuItems", contextMenuWidth: "contextMenuWidth", showViewButton: "showViewButton", hasSelected: "hasSelected", hideOpenIcon: "hideOpenIcon", disableOverflowContextMenu: "disableOverflowContextMenu", inlineEditMode: "inlineEditMode", hideHeader: "hideHeader", showDetailsInRow: "showDetailsInRow", viewSetting: "viewSetting", tableWidth: "tableWidth", resizedByUser: "resizedByUser", disableResponsive: "disableResponsive", actionList: "actionList", rowIndicator: "rowIndicator", rtl: "rtl", sticky: "sticky", showRowNumber: "showRowNumber", hasSecondaryColumns: "hasSecondaryColumns", disableResize: "disableResize", disableHeaderContextMenu: "disableHeaderContextMenu", deviceSize: "deviceSize", tableHeaderMode: "tableHeaderMode" }, outputs: { allCheckbox: "allCheckbox", columnResize: "columnResize", columnResizing: "columnResizing", fitToContent: "fitToContent", fitToContainer: "fitToContainer", freeColumnSize: "freeColumnSize", sortAscending: "sortAscending", sortDescending: "sortDescending", filter: "filter", resetGridSettings: "resetGridSettings", headerRender: "headerRender" }, viewQueries: [{ propertyName: "theadRef", first: true, predicate: ["theadRef"], descendants: true, read: ElementRef, static: true }, { propertyName: "thList", predicate: ["thRef"], descendants: true, read: ElementRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<thead\r\n fd-table-header\r\n [class.inline-edit]=\"inlineEditMode\"\r\n [class.smallColumns]=\"columnsSmallerThanTableWidth\"\r\n [style.position]=\"sticky ? 'sticky' : null\"\r\n #theadRef\r\n>\r\n <tr fd-table-row>\r\n @if (!hideHeader) { @if (rowIndicator) {\r\n <th fd-table-cell fd-table-status-indicator #rowIndicator></th>\r\n } @if (showRowNumber) {\r\n <th fd-table-cell style=\"width: 40px; max-width: 40px\"></th>\r\n } @if (isCheckList) {\r\n <th fd-table-cell>\r\n <fd-checkbox\r\n name=\"allCheckbox\"\r\n [ngModel]=\"allChecked\"\r\n (ngModelChange)=\"onAllCheckbox($event)\"\r\n ></fd-checkbox>\r\n </th>\r\n } @if (!isCheckList && !showRowNumber) {\r\n <th fd-table-cell class=\"single-select\"></th>\r\n } @for (column of columns; track _trackByColumn(i, column); let i = $index; let last = $last) {\r\n <th\r\n #thRef\r\n tableth\r\n fd-table-cell\r\n resizable\r\n [index]=\"i\"\r\n [last]=\"last\"\r\n [columnsLength]=\"columns.length\"\r\n [column]=\"column\"\r\n [tableHeaderMode]=\"tableHeaderMode\"\r\n [fieldTypeId]=\"+column.FieldTypeId\"\r\n [rtl]=\"rtl\"\r\n [caption]=\"column.Caption | bbbTranslate\"\r\n [name]=\"column.Name\"\r\n [icon]=\"column.Icon\"\r\n [colClass]=\"column.$CSSClassName + ' column__' + column.Caption\"\r\n [displayType]=\"column.Extra?.IconDisplayTypeEnum\"\r\n [isImageOrIcon]=\"(column | thImageOrIcon) === true\"\r\n [disableResize]=\"\r\n hasSecondaryColumns ||\r\n disableResize ||\r\n (tableHeaderMode === 2 && last) ||\r\n (column | thImageOrIcon) === true\r\n \"\r\n [disableHeaderContextMenu]=\"disableHeaderContextMenu\"\r\n [disableResponsive]=\"disableResponsive\"\r\n (sortAscending)=\"sortAscending.emit(column)\"\r\n (sortDescending)=\"sortDescending.emit(column)\"\r\n (filter)=\"filter.emit(column)\"\r\n (resetGridSettings)=\"resetGridSettings.emit()\"\r\n (widthChange)=\"onColumnWidthChange(column)\"\r\n (widthChanging)=\"onColumnWidthChanging(i, column, $event)\"\r\n [style.width]=\"hasSecondaryColumns && last ? '100% !important' : null\"\r\n >\r\n @if(!disableHeaderContextMenu){\r\n <fd-popover #menu>\r\n <fd-popover-control>\r\n <ng-container *ngTemplateOutlet=\"headerValue; context: { $implicit: column }\"></ng-container>\r\n </fd-popover-control>\r\n <fd-popover-body>\r\n <ul fd-list>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onSortAscending(column, menu)\">\r\n <fd-menu-addon position=\"before\" glyph=\"sort-ascending\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title\r\n >{{ ('Sort' | bbbTranslate) + ' ' }} {{ 'Ascending' | bbbTranslate }}</span\r\n >\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onSortDescending(column, menu)\" bodyClick>\r\n <fd-menu-addon position=\"before\" glyph=\"sort-descending\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title\r\n >{{ ('Sort' | bbbTranslate) + ' ' }} {{ 'Descending' | bbbTranslate }}</span\r\n >\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onFitToContent(column, i)\" bodyClick>\r\n <fd-menu-addon position=\"before\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ ('Fit Column To Content' | bbbTranslate) + ' ' }}</span>\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"fitToContainer.emit()\" bodyClick>\r\n <fd-menu-addon position=\"before\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ ('All Columns In Page' | bbbTranslate) + ' ' }}</span>\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"freeColumnSize.emit()\" bodyClick>\r\n <fd-menu-addon position=\"before\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ ('Free Columns Size' | bbbTranslate) + ' ' }}</span>\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onResetColumnsSettings()\" bodyClick>\r\n <fd-menu-addon position=\"before\" glyph=\"reset\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ 'GridSettingBase' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </fd-popover-body>\r\n </fd-popover>\r\n } @else{\r\n <ng-container *ngTemplateOutlet=\"headerValue; context: { $implicit: column }\"></ng-container>\r\n }\r\n </th>\r\n } @if (contextMenuItems && contextMenuItems.length > 0) {\r\n <th\r\n class=\"col-header col-context-menu\"\r\n fd-table-cell\r\n [fitContent]=\"disableOverflowContextMenu\"\r\n [style.width.px]=\"contextMenuWidth\"\r\n ></th>\r\n } @if (showDetailsInRow && !inlineEditMode) {\r\n <th class=\"col-header col-details\" [style.width]=\"deviceSize === 's' ? '44px' : '120px'\" fd-table-cell></th>\r\n } @if (showViewButton) {\r\n <th class=\"col-header col-view\" [style.width.px]=\"36 * (actionList?.length ?? 0) + 8\" fd-table-cell></th>\r\n } }\r\n </tr>\r\n</thead>\r\n<ng-template #headerValue let-column>\r\n <div style=\"display: flex\" [attr.title]=\"column.Caption | bbbTranslate\">\r\n @if ( (column.Extra?.IconDisplayTypeEnum === 'Image' || column.FieldTypeId === 42) && column.Icon) {\r\n <img [src]=\"column.Icon\" />\r\n } @else {\r\n {{ column.Caption | bbbTranslate }}\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{display:contents;width:100%}:host.has-toolbar thead{border-top:none!important}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.BodyClickDirective, selector: "[bodyClick]", inputs: ["disableBodyClick"] }, { kind: "component", type: i4.CheckboxComponent, selector: "fd-checkbox", inputs: ["wrapLabel", "valignLabel", "ariaLabel", "role", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "readonly", "tristate", "tristateSelectable", "labelClass", "required", "displayOnly", "values", "standalone"], outputs: ["focusChange"] }, { kind: "component", type: i5.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator", "role"], outputs: ["focusEscapeList"] }, { kind: "component", type: i5.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "unread", "byline", "ariaRole", "id", "preventClick"], outputs: ["keyDown"] }, { kind: "directive", type: i5.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }, { kind: "directive", type: i5.ListIconDirective, selector: "[fdListIcon], [fd-list-icon]", inputs: ["glyph", "glyphFont", "class", "role", "ariaHidden"] }, { kind: "directive", type: i5.ListLinkDirective, selector: "[fd-list-link], [fdListLink]", inputs: ["navigationIndicator", "navigated", "focusable"] }, { kind: "component", type: i6.MenuAddonDirective, selector: "fd-menu-addon", inputs: ["position", "submenuIndicator", "ariaHidden"] }, { kind: "component", type: i7.PopoverControlComponent, selector: "fd-popover-control, [fdPopoverControl]" }, { kind: "component", type: i7.PopoverBodyComponent, selector: "fd-popover-body", inputs: ["minWidth", "maxWidth", "minHeight", "maxHeight"] }, { kind: "component", type: i7.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll"] }, { kind: "directive", type: i8.TableHeaderDirective, selector: "[fdTableHeader], [fd-table-header]", inputs: ["noBorderX", "noBorderY", "nonInteractive"] }, { kind: "directive", type: i8.TableRowDirective, selector: "[fdTableRow], [fd-table-row]", inputs: ["activable", "highlightActive", "hoverable", "focusable", "main", "secondary", "active"] }, { kind: "directive", type: i8.TableCellDirective, selector: "[fdTableCell], [fd-table-cell]", inputs: ["noBorderX", "noBorderY", "activable", "focusable", "hoverable", "fitContent", "noPadding", "noData", "nonInteractive", "key"] }, { kind: "directive", type: i8.TableStatusIndicatorDirective, selector: "[fdTableStatusIndicator], [fd-table-status-indicator]", inputs: ["status"] }, { kind: "component", type: i3.ResizableComponent, selector: "th[resizable]", inputs: ["disableResize", "rtl"], outputs: ["widthChange", "widthChanging"] }, { kind: "directive", type: i9.TableThDirective, selector: "[tableth]", inputs: ["fieldTypeId", "caption", "icon", "inlineEditMode", "isImageOrIcon", "columnsLength", "tableWidth", "last", "rtl", "column", "disableResponsive", "disableResize", "disableHeaderContextMenu", "tableHeaderMode", "colClass", "displayType", "name", "index"] }, { kind: "pipe", type: i3.BbbTranslatePipe, name: "bbbTranslate" }, { kind: "pipe", type: i3.ThImageOrIconePipe, name: "thImageOrIcon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
140
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: BarsaTableHeaderComponent, selector: "bsu-barsa-table-header", inputs: { allChecked: "allChecked", isCheckList: "isCheckList", attachmentViewType: "attachmentViewType", columns: "columns", fitWidth: "fitWidth", contextMenuItems: "contextMenuItems", contextMenuWidth: "contextMenuWidth", showViewButton: "showViewButton", hasSelected: "hasSelected", hideOpenIcon: "hideOpenIcon", disableOverflowContextMenu: "disableOverflowContextMenu", inlineEditMode: "inlineEditMode", hideHeader: "hideHeader", showDetailsInRow: "showDetailsInRow", viewSetting: "viewSetting", tableWidth: "tableWidth", resizedByUser: "resizedByUser", disableResponsive: "disableResponsive", actionList: "actionList", rowIndicator: "rowIndicator", rtl: "rtl", sticky: "sticky", showRowNumber: "showRowNumber", hasSecondaryColumns: "hasSecondaryColumns", disableResize: "disableResize", disableHeaderContextMenu: "disableHeaderContextMenu", deviceSize: "deviceSize", tableHeaderMode: "tableHeaderMode" }, outputs: { allCheckbox: "allCheckbox", columnResize: "columnResize", columnResizing: "columnResizing", fitToContent: "fitToContent", fitToContainer: "fitToContainer", freeColumnSize: "freeColumnSize", sortAscending: "sortAscending", sortDescending: "sortDescending", filter: "filter", resetGridSettings: "resetGridSettings", headerRender: "headerRender" }, viewQueries: [{ propertyName: "theadRef", first: true, predicate: ["theadRef"], descendants: true, read: ElementRef, static: true }, { propertyName: "thList", predicate: ["thRef"], descendants: true, read: ElementRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<thead\r\n fd-table-header\r\n [class.inline-edit]=\"inlineEditMode\"\r\n [class.smallColumns]=\"columnsSmallerThanTableWidth\"\r\n [style.position]=\"sticky ? 'sticky' : null\"\r\n #theadRef\r\n>\r\n <tr fd-table-row>\r\n @if (!hideHeader) { @if (rowIndicator) {\r\n <th fd-table-cell fd-table-status-indicator #rowIndicator></th>\r\n } @if (showRowNumber) {\r\n <th fd-table-cell style=\"width: 40px; max-width: 40px\"></th>\r\n } @if (isCheckList) {\r\n <th fd-table-cell>\r\n <fd-checkbox\r\n name=\"allCheckbox\"\r\n [ngModel]=\"allChecked\"\r\n (ngModelChange)=\"onAllCheckbox($event)\"\r\n ></fd-checkbox>\r\n </th>\r\n } @if (!isCheckList && !showRowNumber) {\r\n <th fd-table-cell class=\"single-select\"></th>\r\n } @for (column of columns; track _trackByColumn(i, column); let i = $index; let last = $last) {\r\n <th\r\n #thRef\r\n tableth\r\n fd-table-cell\r\n resizable\r\n [index]=\"i\"\r\n [last]=\"last\"\r\n [columnsLength]=\"columns.length\"\r\n [column]=\"column\"\r\n [tableHeaderMode]=\"tableHeaderMode\"\r\n [fieldTypeId]=\"+column.FieldTypeId\"\r\n [rtl]=\"rtl\"\r\n [caption]=\"column.Caption | bbbTranslate\"\r\n [name]=\"column.Name\"\r\n [icon]=\"column.Icon\"\r\n [colClass]=\"column.$CSSClassName + ' column__' + column.Caption\"\r\n [displayType]=\"column.Extra?.IconDisplayTypeEnum\"\r\n [isImageOrIcon]=\"(column | thImageOrIcon) === true\"\r\n [disableResize]=\"\r\n hasSecondaryColumns ||\r\n disableResize ||\r\n (tableHeaderMode === 2 && last) ||\r\n (column | thImageOrIcon) === true\r\n \"\r\n [disableHeaderContextMenu]=\"disableHeaderContextMenu\"\r\n [disableResponsive]=\"disableResponsive\"\r\n (sortAscending)=\"sortAscending.emit(column)\"\r\n (sortDescending)=\"sortDescending.emit(column)\"\r\n (filter)=\"filter.emit(column)\"\r\n (resetGridSettings)=\"resetGridSettings.emit()\"\r\n (widthChange)=\"onColumnWidthChange(column)\"\r\n (widthChanging)=\"onColumnWidthChanging(i, column, $event)\"\r\n [style.width]=\"hasSecondaryColumns && last ? '100% !important' : null\"\r\n >\r\n @if(!disableHeaderContextMenu){\r\n <fd-popover #menu>\r\n <fd-popover-control>\r\n <ng-container *ngTemplateOutlet=\"headerValue; context: { $implicit: column }\"></ng-container>\r\n </fd-popover-control>\r\n <fd-popover-body>\r\n <ul fd-list>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onSortAscending(column, menu)\">\r\n <fd-menu-addon position=\"before\" glyph=\"sort-ascending\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title\r\n >{{ ('Sort' | bbbTranslate) + ' ' }} {{ 'Ascending' | bbbTranslate }}</span\r\n >\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onSortDescending(column, menu)\" bodyClick>\r\n <fd-menu-addon position=\"before\" glyph=\"sort-descending\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title\r\n >{{ ('Sort' | bbbTranslate) + ' ' }} {{ 'Descending' | bbbTranslate }}</span\r\n >\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onFitToContent(column, i)\" bodyClick>\r\n <fd-menu-addon position=\"before\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ ('Fit Column To Content' | bbbTranslate) + ' ' }}</span>\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"fitToContainer.emit()\" bodyClick>\r\n <fd-menu-addon position=\"before\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ ('All Columns In Page' | bbbTranslate) + ' ' }}</span>\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"freeColumnSize.emit()\" bodyClick>\r\n <fd-menu-addon position=\"before\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ ('Free Columns Size' | bbbTranslate) + ' ' }}</span>\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onResetColumnsSettings()\" bodyClick>\r\n <fd-menu-addon position=\"before\" glyph=\"reset\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ 'GridSettingBase' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </fd-popover-body>\r\n </fd-popover>\r\n } @else{\r\n <ng-container *ngTemplateOutlet=\"headerValue; context: { $implicit: column }\"></ng-container>\r\n }\r\n </th>\r\n } @if (contextMenuItems && contextMenuItems.length > 0) {\r\n <th\r\n class=\"col-header col-context-menu\"\r\n fd-table-cell\r\n [fitContent]=\"disableOverflowContextMenu\"\r\n [style.width.px]=\"contextMenuWidth\"\r\n ></th>\r\n } @if (showDetailsInRow && !inlineEditMode) {\r\n <th class=\"col-header col-details\" [style.width]=\"deviceSize === 's' ? '44px' : '120px'\" fd-table-cell></th>\r\n } @if (showViewButton) {\r\n <th class=\"col-header col-view\" [style.width.px]=\"36 * (actionList?.length ?? 0) + 8\" fd-table-cell></th>\r\n } }\r\n </tr>\r\n</thead>\r\n<ng-template #headerValue let-column>\r\n <div style=\"display: flex\" [attr.title]=\"column.Caption | bbbTranslate\">\r\n @if ( (column.Extra?.IconDisplayTypeEnum === 'Image' || column.FieldTypeId === 42) && column.Icon) {\r\n <img [src]=\"column.Icon\" />\r\n } @else if(column.FieldTypeId!==38) {\r\n {{ column.Caption | bbbTranslate }}\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{display:contents;width:100%}:host.has-toolbar thead{border-top:none!important}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.BodyClickDirective, selector: "[bodyClick]", inputs: ["disableBodyClick"] }, { kind: "component", type: i4.CheckboxComponent, selector: "fd-checkbox", inputs: ["wrapLabel", "valignLabel", "ariaLabel", "role", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "readonly", "tristate", "tristateSelectable", "labelClass", "required", "displayOnly", "values", "standalone"], outputs: ["focusChange"] }, { kind: "component", type: i5.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator", "role"], outputs: ["focusEscapeList"] }, { kind: "component", type: i5.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "unread", "byline", "ariaRole", "id", "preventClick"], outputs: ["keyDown"] }, { kind: "directive", type: i5.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }, { kind: "directive", type: i5.ListIconDirective, selector: "[fdListIcon], [fd-list-icon]", inputs: ["glyph", "glyphFont", "class", "role", "ariaHidden"] }, { kind: "directive", type: i5.ListLinkDirective, selector: "[fd-list-link], [fdListLink]", inputs: ["navigationIndicator", "navigated", "focusable"] }, { kind: "component", type: i6.MenuAddonDirective, selector: "fd-menu-addon", inputs: ["position", "submenuIndicator", "ariaHidden"] }, { kind: "component", type: i7.PopoverControlComponent, selector: "fd-popover-control, [fdPopoverControl]" }, { kind: "component", type: i7.PopoverBodyComponent, selector: "fd-popover-body", inputs: ["minWidth", "maxWidth", "minHeight", "maxHeight"] }, { kind: "component", type: i7.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll"] }, { kind: "directive", type: i8.TableHeaderDirective, selector: "[fdTableHeader], [fd-table-header]", inputs: ["noBorderX", "noBorderY", "nonInteractive"] }, { kind: "directive", type: i8.TableRowDirective, selector: "[fdTableRow], [fd-table-row]", inputs: ["activable", "highlightActive", "hoverable", "focusable", "main", "secondary", "active"] }, { kind: "directive", type: i8.TableCellDirective, selector: "[fdTableCell], [fd-table-cell]", inputs: ["noBorderX", "noBorderY", "activable", "focusable", "hoverable", "fitContent", "noPadding", "noData", "nonInteractive", "key"] }, { kind: "directive", type: i8.TableStatusIndicatorDirective, selector: "[fdTableStatusIndicator], [fd-table-status-indicator]", inputs: ["status"] }, { kind: "component", type: i3.ResizableComponent, selector: "th[resizable]", inputs: ["disableResize", "rtl"], outputs: ["widthChange", "widthChanging"] }, { kind: "directive", type: i9.TableThDirective, selector: "[tableth]", inputs: ["fieldTypeId", "caption", "icon", "inlineEditMode", "isImageOrIcon", "columnsLength", "tableWidth", "last", "rtl", "column", "disableResponsive", "disableResize", "disableHeaderContextMenu", "tableHeaderMode", "colClass", "displayType", "name", "index"] }, { kind: "pipe", type: i3.BbbTranslatePipe, name: "bbbTranslate" }, { kind: "pipe", type: i3.ThImageOrIconePipe, name: "thImageOrIcon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
135
141
  }
136
142
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BarsaTableHeaderComponent, decorators: [{
137
143
  type: Component,
138
- args: [{ selector: 'bsu-barsa-table-header', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<thead\r\n fd-table-header\r\n [class.inline-edit]=\"inlineEditMode\"\r\n [class.smallColumns]=\"columnsSmallerThanTableWidth\"\r\n [style.position]=\"sticky ? 'sticky' : null\"\r\n #theadRef\r\n>\r\n <tr fd-table-row>\r\n @if (!hideHeader) { @if (rowIndicator) {\r\n <th fd-table-cell fd-table-status-indicator #rowIndicator></th>\r\n } @if (showRowNumber) {\r\n <th fd-table-cell style=\"width: 40px; max-width: 40px\"></th>\r\n } @if (isCheckList) {\r\n <th fd-table-cell>\r\n <fd-checkbox\r\n name=\"allCheckbox\"\r\n [ngModel]=\"allChecked\"\r\n (ngModelChange)=\"onAllCheckbox($event)\"\r\n ></fd-checkbox>\r\n </th>\r\n } @if (!isCheckList && !showRowNumber) {\r\n <th fd-table-cell class=\"single-select\"></th>\r\n } @for (column of columns; track _trackByColumn(i, column); let i = $index; let last = $last) {\r\n <th\r\n #thRef\r\n tableth\r\n fd-table-cell\r\n resizable\r\n [index]=\"i\"\r\n [last]=\"last\"\r\n [columnsLength]=\"columns.length\"\r\n [column]=\"column\"\r\n [tableHeaderMode]=\"tableHeaderMode\"\r\n [fieldTypeId]=\"+column.FieldTypeId\"\r\n [rtl]=\"rtl\"\r\n [caption]=\"column.Caption | bbbTranslate\"\r\n [name]=\"column.Name\"\r\n [icon]=\"column.Icon\"\r\n [colClass]=\"column.$CSSClassName + ' column__' + column.Caption\"\r\n [displayType]=\"column.Extra?.IconDisplayTypeEnum\"\r\n [isImageOrIcon]=\"(column | thImageOrIcon) === true\"\r\n [disableResize]=\"\r\n hasSecondaryColumns ||\r\n disableResize ||\r\n (tableHeaderMode === 2 && last) ||\r\n (column | thImageOrIcon) === true\r\n \"\r\n [disableHeaderContextMenu]=\"disableHeaderContextMenu\"\r\n [disableResponsive]=\"disableResponsive\"\r\n (sortAscending)=\"sortAscending.emit(column)\"\r\n (sortDescending)=\"sortDescending.emit(column)\"\r\n (filter)=\"filter.emit(column)\"\r\n (resetGridSettings)=\"resetGridSettings.emit()\"\r\n (widthChange)=\"onColumnWidthChange(column)\"\r\n (widthChanging)=\"onColumnWidthChanging(i, column, $event)\"\r\n [style.width]=\"hasSecondaryColumns && last ? '100% !important' : null\"\r\n >\r\n @if(!disableHeaderContextMenu){\r\n <fd-popover #menu>\r\n <fd-popover-control>\r\n <ng-container *ngTemplateOutlet=\"headerValue; context: { $implicit: column }\"></ng-container>\r\n </fd-popover-control>\r\n <fd-popover-body>\r\n <ul fd-list>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onSortAscending(column, menu)\">\r\n <fd-menu-addon position=\"before\" glyph=\"sort-ascending\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title\r\n >{{ ('Sort' | bbbTranslate) + ' ' }} {{ 'Ascending' | bbbTranslate }}</span\r\n >\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onSortDescending(column, menu)\" bodyClick>\r\n <fd-menu-addon position=\"before\" glyph=\"sort-descending\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title\r\n >{{ ('Sort' | bbbTranslate) + ' ' }} {{ 'Descending' | bbbTranslate }}</span\r\n >\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onFitToContent(column, i)\" bodyClick>\r\n <fd-menu-addon position=\"before\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ ('Fit Column To Content' | bbbTranslate) + ' ' }}</span>\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"fitToContainer.emit()\" bodyClick>\r\n <fd-menu-addon position=\"before\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ ('All Columns In Page' | bbbTranslate) + ' ' }}</span>\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"freeColumnSize.emit()\" bodyClick>\r\n <fd-menu-addon position=\"before\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ ('Free Columns Size' | bbbTranslate) + ' ' }}</span>\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onResetColumnsSettings()\" bodyClick>\r\n <fd-menu-addon position=\"before\" glyph=\"reset\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ 'GridSettingBase' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </fd-popover-body>\r\n </fd-popover>\r\n } @else{\r\n <ng-container *ngTemplateOutlet=\"headerValue; context: { $implicit: column }\"></ng-container>\r\n }\r\n </th>\r\n } @if (contextMenuItems && contextMenuItems.length > 0) {\r\n <th\r\n class=\"col-header col-context-menu\"\r\n fd-table-cell\r\n [fitContent]=\"disableOverflowContextMenu\"\r\n [style.width.px]=\"contextMenuWidth\"\r\n ></th>\r\n } @if (showDetailsInRow && !inlineEditMode) {\r\n <th class=\"col-header col-details\" [style.width]=\"deviceSize === 's' ? '44px' : '120px'\" fd-table-cell></th>\r\n } @if (showViewButton) {\r\n <th class=\"col-header col-view\" [style.width.px]=\"36 * (actionList?.length ?? 0) + 8\" fd-table-cell></th>\r\n } }\r\n </tr>\r\n</thead>\r\n<ng-template #headerValue let-column>\r\n <div style=\"display: flex\" [attr.title]=\"column.Caption | bbbTranslate\">\r\n @if ( (column.Extra?.IconDisplayTypeEnum === 'Image' || column.FieldTypeId === 42) && column.Icon) {\r\n <img [src]=\"column.Icon\" />\r\n } @else {\r\n {{ column.Caption | bbbTranslate }}\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{display:contents;width:100%}:host.has-toolbar thead{border-top:none!important}\n"] }]
144
+ args: [{ selector: 'bsu-barsa-table-header', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<thead\r\n fd-table-header\r\n [class.inline-edit]=\"inlineEditMode\"\r\n [class.smallColumns]=\"columnsSmallerThanTableWidth\"\r\n [style.position]=\"sticky ? 'sticky' : null\"\r\n #theadRef\r\n>\r\n <tr fd-table-row>\r\n @if (!hideHeader) { @if (rowIndicator) {\r\n <th fd-table-cell fd-table-status-indicator #rowIndicator></th>\r\n } @if (showRowNumber) {\r\n <th fd-table-cell style=\"width: 40px; max-width: 40px\"></th>\r\n } @if (isCheckList) {\r\n <th fd-table-cell>\r\n <fd-checkbox\r\n name=\"allCheckbox\"\r\n [ngModel]=\"allChecked\"\r\n (ngModelChange)=\"onAllCheckbox($event)\"\r\n ></fd-checkbox>\r\n </th>\r\n } @if (!isCheckList && !showRowNumber) {\r\n <th fd-table-cell class=\"single-select\"></th>\r\n } @for (column of columns; track _trackByColumn(i, column); let i = $index; let last = $last) {\r\n <th\r\n #thRef\r\n tableth\r\n fd-table-cell\r\n resizable\r\n [index]=\"i\"\r\n [last]=\"last\"\r\n [columnsLength]=\"columns.length\"\r\n [column]=\"column\"\r\n [tableHeaderMode]=\"tableHeaderMode\"\r\n [fieldTypeId]=\"+column.FieldTypeId\"\r\n [rtl]=\"rtl\"\r\n [caption]=\"column.Caption | bbbTranslate\"\r\n [name]=\"column.Name\"\r\n [icon]=\"column.Icon\"\r\n [colClass]=\"column.$CSSClassName + ' column__' + column.Caption\"\r\n [displayType]=\"column.Extra?.IconDisplayTypeEnum\"\r\n [isImageOrIcon]=\"(column | thImageOrIcon) === true\"\r\n [disableResize]=\"\r\n hasSecondaryColumns ||\r\n disableResize ||\r\n (tableHeaderMode === 2 && last) ||\r\n (column | thImageOrIcon) === true\r\n \"\r\n [disableHeaderContextMenu]=\"disableHeaderContextMenu\"\r\n [disableResponsive]=\"disableResponsive\"\r\n (sortAscending)=\"sortAscending.emit(column)\"\r\n (sortDescending)=\"sortDescending.emit(column)\"\r\n (filter)=\"filter.emit(column)\"\r\n (resetGridSettings)=\"resetGridSettings.emit()\"\r\n (widthChange)=\"onColumnWidthChange(column)\"\r\n (widthChanging)=\"onColumnWidthChanging(i, column, $event)\"\r\n [style.width]=\"hasSecondaryColumns && last ? '100% !important' : null\"\r\n >\r\n @if(!disableHeaderContextMenu){\r\n <fd-popover #menu>\r\n <fd-popover-control>\r\n <ng-container *ngTemplateOutlet=\"headerValue; context: { $implicit: column }\"></ng-container>\r\n </fd-popover-control>\r\n <fd-popover-body>\r\n <ul fd-list>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onSortAscending(column, menu)\">\r\n <fd-menu-addon position=\"before\" glyph=\"sort-ascending\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title\r\n >{{ ('Sort' | bbbTranslate) + ' ' }} {{ 'Ascending' | bbbTranslate }}</span\r\n >\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onSortDescending(column, menu)\" bodyClick>\r\n <fd-menu-addon position=\"before\" glyph=\"sort-descending\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title\r\n >{{ ('Sort' | bbbTranslate) + ' ' }} {{ 'Descending' | bbbTranslate }}</span\r\n >\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onFitToContent(column, i)\" bodyClick>\r\n <fd-menu-addon position=\"before\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ ('Fit Column To Content' | bbbTranslate) + ' ' }}</span>\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"fitToContainer.emit()\" bodyClick>\r\n <fd-menu-addon position=\"before\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ ('All Columns In Page' | bbbTranslate) + ' ' }}</span>\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"freeColumnSize.emit()\" bodyClick>\r\n <fd-menu-addon position=\"before\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ ('Free Columns Size' | bbbTranslate) + ' ' }}</span>\r\n </a>\r\n </li>\r\n <li fd-list-item>\r\n <a fd-list-link (click)=\"onResetColumnsSettings()\" bodyClick>\r\n <fd-menu-addon position=\"before\" glyph=\"reset\" fd-list-icon></fd-menu-addon>\r\n <span fd-list-title>{{ 'GridSettingBase' | bbbTranslate }}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </fd-popover-body>\r\n </fd-popover>\r\n } @else{\r\n <ng-container *ngTemplateOutlet=\"headerValue; context: { $implicit: column }\"></ng-container>\r\n }\r\n </th>\r\n } @if (contextMenuItems && contextMenuItems.length > 0) {\r\n <th\r\n class=\"col-header col-context-menu\"\r\n fd-table-cell\r\n [fitContent]=\"disableOverflowContextMenu\"\r\n [style.width.px]=\"contextMenuWidth\"\r\n ></th>\r\n } @if (showDetailsInRow && !inlineEditMode) {\r\n <th class=\"col-header col-details\" [style.width]=\"deviceSize === 's' ? '44px' : '120px'\" fd-table-cell></th>\r\n } @if (showViewButton) {\r\n <th class=\"col-header col-view\" [style.width.px]=\"36 * (actionList?.length ?? 0) + 8\" fd-table-cell></th>\r\n } }\r\n </tr>\r\n</thead>\r\n<ng-template #headerValue let-column>\r\n <div style=\"display: flex\" [attr.title]=\"column.Caption | bbbTranslate\">\r\n @if ( (column.Extra?.IconDisplayTypeEnum === 'Image' || column.FieldTypeId === 42) && column.Icon) {\r\n <img [src]=\"column.Icon\" />\r\n } @else if(column.FieldTypeId!==38) {\r\n {{ column.Caption | bbbTranslate }}\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{display:contents;width:100%}:host.has-toolbar thead{border-top:none!important}\n"] }]
139
145
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }], propDecorators: { thList: [{
140
146
  type: ViewChildren,
141
147
  args: ['thRef', { read: ElementRef }]
@@ -221,4 +227,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
221
227
  }], headerRender: [{
222
228
  type: Output
223
229
  }] } });
224
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyc2EtdGFibGUtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXNhcC11aS9zcmMvbGliL2JhcnNhLXRhYmxlLWhlYWRlci9iYXJzYS10YWJsZS1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etc2FwLXVpL3NyYy9saWIvYmFyc2EtdGFibGUtaGVhZGVyL2JhcnNhLXRhYmxlLWhlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULHVCQUF1QixFQUN2QixLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFFTixZQUFZLEVBQ1osVUFBVSxFQUVWLFNBQVMsRUFFVCxNQUFNLEVBRVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGFBQWEsRUFJYixvQkFBb0IsRUFDcEIsZUFBZSxFQUNsQixNQUFNLHNCQUFzQixDQUFDOzs7Ozs7Ozs7OztBQVU5QixNQUFNLE9BQU8seUJBQTBCLFNBQVEsYUFBYTtJQStDeEQ7O09BRUc7SUFDSCxZQUFvQixJQUF1QixFQUFVLFVBQXFCO1FBQ3RFLEtBQUssRUFBRSxDQUFDO1FBRFEsU0FBSSxHQUFKLElBQUksQ0FBbUI7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFXO1FBbENqRSxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFleEIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQzFDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFDNUQsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBK0MsQ0FBQztRQUNqRixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUE2RCxDQUFDO1FBQzdGLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUMxQyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFRLENB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IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gICAgSW5wdXQsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIFZpZXdDaGlsZHJlbixcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBRdWVyeUxpc3QsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbiAgICBSZW5kZXJlcjIsXHJcbiAgICBpbmplY3QsXHJcbiAgICBTaW1wbGVDaGFuZ2VzXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgICBCYXNlQ29tcG9uZW50LFxyXG4gICAgUmVwb3J0Vmlld0NvbHVtbixcclxuICAgIEFiYnJldmF0aW9uRGV2aWNlU2l6ZSxcclxuICAgIENvbHVtblJlc2l6ZWRBcmdzLFxyXG4gICAgVGFibGVIZWFkZXJXaWR0aE1vZGUsXHJcbiAgICBzZXRUYWJsZVRoV2lkdGhcclxufSBmcm9tICdiYXJzYS1ub3Zpbi1yYXktY29yZSc7XHJcbmltcG9ydCB7IFVpVGFibGVWaWV3U2V0dGluZyB9IGZyb20gJy4uL21vZGVscy9ncmlkLXZpZXcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2JzdS1iYXJzYS10YWJsZS1oZWFkZXInLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2JhcnNhLXRhYmxlLWhlYWRlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9iYXJzYS10YWJsZS1oZWFkZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgc3RhbmRhbG9uZTogZmFsc2VcclxufSlcclxuZXhwb3J0IGNsYXNzIEJhcnNhVGFibGVIZWFkZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcclxuICAgIEBWaWV3Q2hpbGRyZW4oJ3RoUmVmJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHRoTGlzdDogUXVlcnlMaXN0PEVsZW1lbnRSZWY8YW55Pj47XHJcbiAgICBAVmlld0NoaWxkKCd0aGVhZFJlZicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pIHRoZWFkUmVmOiBFbGVtZW50UmVmO1xyXG4gICAgQElucHV0KCkgYWxsQ2hlY2tlZDogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIGlzQ2hlY2tMaXN0OiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgYXR0YWNobWVudFZpZXdUeXBlOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBjb2x1bW5zOiBSZXBvcnRWaWV3Q29sdW1uW107XHJcbiAgICBASW5wdXQoKSBmaXRXaWR0aDogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIGNvbnRleHRNZW51SXRlbXM6IGFueVtdO1xyXG4gICAgQElucHV0KCkgY29udGV4dE1lbnVXaWR0aDogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgc2hvd1ZpZXdCdXR0b246IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBoYXNTZWxlY3RlZDogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIGhpZGVPcGVuSWNvbjogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVPdmVyZmxvd0NvbnRleHRNZW51OiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgaW5saW5lRWRpdE1vZGU6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBoaWRlSGVhZGVyOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgc2hvd0RldGFpbHNJblJvdyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgdmlld1NldHRpbmc6IFVpVGFibGVWaWV3U2V0dGluZztcclxuICAgIEBJbnB1dCgpIHRhYmxlV2lkdGg6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIHJlc2l6ZWRCeVVzZXI6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBkaXNhYmxlUmVzcG9uc2l2ZTogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIGFjdGlvbkxpc3Q6IGFueVtdO1xyXG4gICAgQElucHV0KCkgcm93SW5kaWNhdG9yOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcnRsOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgc3RpY2t5OiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgc2hvd1Jvd051bWJlcjogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIGhhc1NlY29uZGFyeUNvbHVtbnM6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBkaXNhYmxlUmVzaXplOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgZGlzYWJsZUhlYWRlckNvbnRleHRNZW51OiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgZGV2aWNlU2l6ZTogQWJicmV2YXRpb25EZXZpY2VTaXplO1xyXG4gICAgQElucHV0KCkgdGFibGVIZWFkZXJNb2RlOiBUYWJsZUhlYWRlcldpZHRoTW9kZTtcclxuICAgIEBPdXRwdXQoKSBhbGxDaGVja2JveCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICAgIEBPdXRwdXQoKSBjb2x1bW5SZXNpemUgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PENvbHVtblJlc2l6ZWRBcmdzPj4oKTtcclxuICAgIEBPdXRwdXQoKSBjb2x1bW5SZXNpemluZyA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb2x1bW46IFJlcG9ydFZpZXdDb2x1bW47IHdpZHRoOiBudW1iZXIgfT4oKTtcclxuICAgIEBPdXRwdXQoKSBmaXRUb0NvbnRlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgY29sdW1uOiBSZXBvcnRWaWV3Q29sdW1uOyB0aERvbTogSFRNTFRhYmxlQ2VsbEVsZW1lbnQgfT4oKTtcclxuICAgIEBPdXRwdXQoKSBmaXRUb0NvbnRhaW5lciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICAgIEBPdXRwdXQoKSBmcmVlQ29sdW1uU2l6ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICAgIEBPdXRwdXQoKSBzb3J0QXNjZW5kaW5nID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgc29ydERlc2NlbmRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBmaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPFJlcG9ydFZpZXdDb2x1bW4+KCk7XHJcbiAgICBAT3V0cHV0KCkgcmVzZXRHcmlkU2V0dGluZ3MgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgICBAT3V0cHV0KCkgaGVhZGVyUmVuZGVyID0gbmV3IEV2ZW50RW1pdHRlcjxIVE1MRWxlbWVudD4oKTtcclxuICAgIGNvbHVtbnNTbWFsbGVyVGhhblRhYmxlV2lkdGg6IGJvb2xlYW47XHJcblxyXG4gICAgc3RhcnRJbmRleDogbnVtYmVyO1xyXG4gICAgcmVzaXplSGVhZGVyID0gZmFsc2U7XHJcbiAgICBlbCA9IGluamVjdChFbGVtZW50UmVmKTtcclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBfcmVuZGVyZXIyOiBSZW5kZXJlcjIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHRoQXJyKCk6IEhUTUxUYWJsZUNlbGxFbGVtZW50W10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRoTGlzdC50b0FycmF5KCkubWFwKChjKSA9PiBjLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgfVxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgICAgICB0aGlzLmhlYWRlclJlbmRlci5lbWl0KHRoaXMudGhlYWRSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgLy8gdGhpcy5fcHJlcGFyZUNvbHVtbnNXaWR0aCh0aGlzLnRhYmxlV2lkdGgsIHRoaXMuY29sdW1ucywgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XHJcbiAgICAgICAgY29uc3QgeyB0YWJsZUhlYWRlck1vZGUsIGNvbHVtbnMgfSA9IGNoYW5nZXM7XHJcbiAgICAgICAgaWYgKHRhYmxlSGVhZGVyTW9kZSAmJiAhdGFibGVIZWFkZXJNb2RlLmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgICAgICAgIHNldFRhYmxlVGhXaWR0aCh0YWJsZUhlYWRlck1vZGUuY3VycmVudFZhbHVlLCB0aGlzLmNvbHVtbnMsIHRoaXMudGhBcnIsIHRoaXMuX3JlbmRlcmVyMik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb2x1bW5zICYmICFjb2x1bW5zLmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuUmVmcmVzaFRhYmxlVGhXaWR0aCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblNvcnRBc2NlbmRpbmcoY29sdW1uLCBtZW51KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKG1lbnUpIHtcclxuICAgICAgICAgICAgbWVudS5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNvcnRBc2NlbmRpbmcuZW1pdChjb2x1bW4pO1xyXG4gICAgfVxyXG4gICAgb25Tb3J0RGVzY2VuZGluZyhjb2x1bW4sIG1lbnUpOiB2b2lkIHtcclxuICAgICAgICBpZiAobWVudSkge1xyXG4gICAgICAgICAgICBtZW51LmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc29ydERlc2NlbmRpbmcuZW1pdChjb2x1bW4pO1xyXG4gICAgfVxyXG4gICAgb25GaWx0ZXIobWVudSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChtZW51KSB7XHJcbiAgICAgICAgICAgIG1lbnUuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5maWx0ZXIuZW1pdCgpO1xyXG4gICAgfVxyXG4gICAgb25GaXRUb0NvbnRlbnQoY29sdW1uLCBpOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0aERvbTogSFRNTFRhYmxlQ2VsbEVsZW1lbnQgPSB0aGlzLnRoQXJyW2ldO1xyXG4gICAgICAgIHRoaXMuZml0VG9Db250ZW50LmVtaXQoeyBjb2x1bW4sIHRoRG9tIH0pO1xyXG4gICAgfVxyXG4gICAgb25SZXNldENvbHVtbnNTZXR0aW5ncygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlc2V0R3JpZFNldHRpbmdzLmVtaXQoKTtcclxuICAgIH1cclxuICAgIG9uQ29sdW1uV2lkdGhDaGFuZ2luZyhpbmRleDogbnVtYmVyLCBjb2x1bW46IFJlcG9ydFZpZXdDb2x1bW4sIHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlc2l6ZUhlYWRlciA9IHRydWU7XHJcbiAgICAgICAgY29sdW1uLldpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgY29uc3QgdGhMaXN0ID0gdGhpcy50aEFycjtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4IDwgdGhMaXN0Lmxlbmd0aCAtIDEgJiYgdGhpcy50YWJsZUhlYWRlck1vZGUgPT09IFRhYmxlSGVhZGVyV2lkdGhNb2RlLkZyZWVDb2x1bW5TaXplKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhc3RUaCA9IHRoTGlzdFt0aExpc3QubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyMi5zZXRTdHlsZShsYXN0VGgsICd3aWR0aCcsIGAke2xhc3RUaC5vZmZzZXRXaWR0aH1weGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbHVtblJlc2l6aW5nLmVtaXQoeyBjb2x1bW4sIHdpZHRoIH0pO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdjb2x1bW5XaWR0aENoYW5naW5nIG51bWJlcjonLCB3aWR0aCwgaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ29sdW1uV2lkdGhDaGFuZ2UoY29sdW1uOiBSZXBvcnRWaWV3Q29sdW1uKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2x1bW5zLmZpbmQoKGMpID0+IGMuTmFtZSA9PT0gY29sdW1uLk5hbWUpO1xyXG4gICAgICAgIGlmICghY29sKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgd2l0aDIgPSBNYXRoLnJvdW5kKGNvbHVtbi5XaWR0aCk7XHJcbiAgICAgICAgY29sLldpZHRoID0gd2l0aDI7XHJcbiAgICAgICAgY29uc3QgdGhMaXN0ID0gdGhpcy50aEFycjtcclxuXHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGMsIGkpID0+IHtcclxuICAgICAgICAgICAgYy5XaWR0aCA9IHRoTGlzdFtpXS5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgaWYgKGkgIT09IHRoaXMuY29sdW1ucy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJlcjIuc2V0U3R5bGUodGhMaXN0W2ldLCAnd2lkdGgnLCBgJHtjLldpZHRofXB4YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlcjIuc2V0U3R5bGUodGhMaXN0W3RoTGlzdC5sZW5ndGggLSAxXSwgJ3dpZHRoJywgJzEwMCUnKTtcclxuICAgICAgICB0aGlzLmNvbHVtblJlc2l6ZS5lbWl0KHRoaXMuY29sdW1ucy5tYXAoKGMsIGkpID0+ICh7IG5hbWU6IGMuTmFtZSwgd2lkdGg6IGMuV2lkdGgsIHRoRG9tOiB0aExpc3RbaV0gfSkpKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnY29sdW1uV2lkdGhDaGFuZ2UnKTtcclxuICAgIH1cclxuICAgIG9uQWxsQ2hlY2tib3goY2hlY2tlZCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWxsQ2hlY2tib3guZW1pdChjaGVja2VkKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBTZXRDb2x1bW5XaWR0aFRvVGhXaWR0aCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRoQXJyLmZvckVhY2goKHRoLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc1tpXS5XaWR0aCA9IHRoLm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnNbaV0uJFdpZHRoID0gYCR7dGgub2Zmc2V0V2lkdGh9cHhgO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIFNldENvbHVtbldpZHRoVG9QZXJjZW50KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGFsbFdpZHRoID0gdGhpcy50aGVhZFJlZi5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gICAgICAgIHRoaXMudGhBcnIuZm9yRWFjaCgodGgsIGkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgeCA9ICh0aC5vZmZzZXRXaWR0aCAqIDEwMCkgLyBhbGxXaWR0aDtcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zW2ldLiRGaXRDb250YWluZXJXaWR0aCA9IGAke3h9JWA7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgUmVmcmVzaFRhYmxlVGhXaWR0aCgpOiB2b2lkIHtcclxuICAgICAgICBzZXRUYWJsZVRoV2lkdGgodGhpcy50YWJsZUhlYWRlck1vZGUsIHRoaXMuY29sdW1ucywgdGhpcy50aEFyciwgdGhpcy5fcmVuZGVyZXIyKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBUYWJsZVRoRml0VG9DYXB0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIHNldFRhYmxlVGhXaWR0aChUYWJsZUhlYWRlcldpZHRoTW9kZS5Db2x1bW5XaWR0aCwgdGhpcy5jb2x1bW5zLCB0aGlzLnRoQXJyLCB0aGlzLl9yZW5kZXJlcjIpO1xyXG4gICAgfVxyXG4gICAgX3RyYWNrQnlDb2x1bW4oaW5kZXg6IG51bWJlciwgY29sdW1uOiBSZXBvcnRWaWV3Q29sdW1uKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gYCR7Y29sdW1uLk5hbWV9JHtpbmRleH1gO1xyXG4gICAgfVxyXG59XHJcbiIsIjx0aGVhZFxyXG4gICAgZmQtdGFibGUtaGVhZGVyXHJcbiAgICBbY2xhc3MuaW5saW5lLWVkaXRdPVwiaW5saW5lRWRpdE1vZGVcIlxyXG4gICAgW2NsYXNzLnNtYWxsQ29sdW1uc109XCJjb2x1bW5zU21hbGxlclRoYW5UYWJsZVdpZHRoXCJcclxuICAgIFtzdHlsZS5wb3NpdGlvbl09XCJzdGlja3kgPyAnc3RpY2t5JyA6IG51bGxcIlxyXG4gICAgI3RoZWFkUmVmXHJcbj5cclxuICAgIDx0ciBmZC10YWJsZS1yb3c+XHJcbiAgICAgICAgQGlmICghaGlkZUhlYWRlcikgeyBAaWYgKHJvd0luZGljYXRvcikge1xyXG4gICAgICAgIDx0aCBmZC10YWJsZS1jZWxsIGZkLXRhYmxlLXN0YXR1cy1pbmRpY2F0b3IgI3Jvd0luZGljYXRvcj48L3RoPlxyXG4gICAgICAgIH0gQGlmIChzaG93Um93TnVtYmVyKSB7XHJcbiAgICAgICAgPHRoIGZkLXRhYmxlLWNlbGwgc3R5bGU9XCJ3aWR0aDogNDBweDsgbWF4LXdpZHRoOiA0MHB4XCI+PC90aD5cclxuICAgICAgICB9IEBpZiAoaXNDaGVja0xpc3QpIHtcclxuICAgICAgICA8dGggZmQtdGFibGUtY2VsbD5cclxuICAgICAgICAgICAgPGZkLWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICBuYW1lPVwiYWxsQ2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYWxsQ2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkFsbENoZWNrYm94KCRldmVudClcIlxyXG4gICAgICAgICAgICA+PC9mZC1jaGVja2JveD5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIH0gQGlmICghaXNDaGVja0xpc3QgJiYgIXNob3dSb3dOdW1iZXIpIHtcclxuICAgICAgICA8dGggZmQtdGFibGUtY2VsbCBjbGFzcz1cInNpbmdsZS1zZWxlY3RcIj48L3RoPlxyXG4gICAgICAgIH0gQGZvciAoY29sdW1uIG9mIGNvbHVtbnM7IHRyYWNrIF90cmFja0J5Q29sdW1uKGksIGNvbHVtbik7IGxldCBpID0gJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICN0aFJlZlxyXG4gICAgICAgICAgICB0YWJsZXRoXHJcbiAgICAgICAgICAgIGZkLXRhYmxlLWNlbGxcclxuICAgICAgICAgICAgcmVzaXphYmxlXHJcbiAgICAgICAgICAgIFtpbmRleF09XCJpXCJcclxuICAgICAgICAgICAgW2xhc3RdPVwibGFzdFwiXHJcbiAgICAgICAgICAgIFtjb2x1bW5zTGVuZ3RoXT1cImNvbHVtbnMubGVuZ3RoXCJcclxuICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxyXG4gICAgICAgICAgICBbdGFibGVIZWFkZXJNb2RlXT1cInRhYmxlSGVhZGVyTW9kZVwiXHJcbiAgICAgICAgICAgIFtmaWVsZFR5cGVJZF09XCIrY29sdW1uLkZpZWxkVHlwZUlkXCJcclxuICAgICAgICAgICAgW3J0bF09XCJydGxcIlxyXG4gICAgICAgICAgICBbY2FwdGlvbl09XCJjb2x1bW4uQ2FwdGlvbiB8IGJiYlRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgIFtuYW1lXT1cImNvbHVtbi5OYW1lXCJcclxuICAgICAgICAgICAgW2ljb25dPVwiY29sdW1uLkljb25cIlxyXG4gICAgICAgICAgICBbY29sQ2xhc3NdPVwiY29sdW1uLiRDU1NDbGFzc05hbWUgKyAnIGNvbHVtbl9fJyArIGNvbHVtbi5DYXB0aW9uXCJcclxuICAgICAgICAgICAgW2Rpc3BsYXlUeXBlXT1cImNvbHVtbi5FeHRyYT8uSWNvbkRpc3BsYXlUeXBlRW51bVwiXHJcbiAgICAgICAgICAgIFtpc0ltYWdlT3JJY29uXT1cIihjb2x1bW4gfCB0aEltYWdlT3JJY29uKSA9PT0gdHJ1ZVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlUmVzaXplXT1cIlxyXG4gICAgICAgICAgICAgICAgaGFzU2Vjb25kYXJ5Q29sdW1ucyB8fFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZVJlc2l6ZSB8fFxyXG4gICAgICAgICAgICAgICAgKHRhYmxlSGVhZGVyTW9kZSA9PT0gMiAmJiBsYXN0KSB8fFxyXG4gICAgICAgICAgICAgICAgKGNvbHVtbiB8IHRoSW1hZ2VPckljb24pID09PSB0cnVlXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlSGVhZGVyQ29udGV4dE1lbnVdPVwiZGlzYWJsZUhlYWRlckNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgW2Rpc2FibGVSZXNwb25zaXZlXT1cImRpc2FibGVSZXNwb25zaXZlXCJcclxuICAgICAgICAgICAgKHNvcnRBc2NlbmRpbmcpPVwic29ydEFzY2VuZGluZy5lbWl0KGNvbHVtbilcIlxyXG4gICAgICAgICAgICAoc29ydERlc2NlbmRpbmcpPVwic29ydERlc2NlbmRpbmcuZW1pdChjb2x1bW4pXCJcclxuICAgICAgICAgICAgKGZpbHRlcik9XCJmaWx0ZXIuZW1pdChjb2x1bW4pXCJcclxuICAgICAgICAgICAgKHJlc2V0R3JpZFNldHRpbmdzKT1cInJlc2V0R3JpZFNldHRpbmdzLmVtaXQoKVwiXHJcbiAgICAgICAgICAgICh3aWR0aENoYW5nZSk9XCJvbkNvbHVtbldpZHRoQ2hhbmdlKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAod2lkdGhDaGFuZ2luZyk9XCJvbkNvbHVtbldpZHRoQ2hhbmdpbmcoaSwgY29sdW1uLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImhhc1NlY29uZGFyeUNvbHVtbnMgJiYgbGFzdCA/ICcxMDAlICFpbXBvcnRhbnQnIDogbnVsbFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICBAaWYoIWRpc2FibGVIZWFkZXJDb250ZXh0TWVudSl7XHJcbiAgICAgICAgICAgIDxmZC1wb3BvdmVyICNtZW51PlxyXG4gICAgICAgICAgICAgICAgPGZkLXBvcG92ZXItY29udHJvbD5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVmFsdWU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBjb2x1bW4gfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9mZC1wb3BvdmVyLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgICA8ZmQtcG9wb3Zlci1ib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bCBmZC1saXN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgZmQtbGlzdC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgZmQtbGlzdC1saW5rIChjbGljayk9XCJvblNvcnRBc2NlbmRpbmcoY29sdW1uLCBtZW51KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZC1tZW51LWFkZG9uIHBvc2l0aW9uPVwiYmVmb3JlXCIgZ2x5cGg9XCJzb3J0LWFzY2VuZGluZ1wiIGZkLWxpc3QtaWNvbj48L2ZkLW1lbnUtYWRkb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZmQtbGlzdC10aXRsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3sgKCdTb3J0JyB8IGJiYlRyYW5zbGF0ZSkgKyAnICcgfX0ge3sgJ0FzY2VuZGluZycgfCBiYmJUcmFuc2xhdGUgfX08L3NwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBmZC1saXN0LWl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBmZC1saXN0LWxpbmsgKGNsaWNrKT1cIm9uU29ydERlc2NlbmRpbmcoY29sdW1uLCBtZW51KVwiIGJvZHlDbGljaz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmQtbWVudS1hZGRvbiBwb3NpdGlvbj1cImJlZm9yZVwiIGdseXBoPVwic29ydC1kZXNjZW5kaW5nXCIgZmQtbGlzdC1pY29uPjwvZmQtbWVudS1hZGRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBmZC1saXN0LXRpdGxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID57eyAoJ1NvcnQnIHwgYmJiVHJhbnNsYXRlKSArICcgJyB9fSB7eyAnRGVzY2VuZGluZycgfCBiYmJUcmFuc2xhdGUgfX08L3NwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBmZC1saXN0LWl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBmZC1saXN0LWxpbmsgKGNsaWNrKT1cIm9uRml0VG9Db250ZW50KGNvbHVtbiwgaSlcIiBib2R5Q2xpY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZkLW1lbnUtYWRkb24gcG9zaXRpb249XCJiZWZvcmVcIiBmZC1saXN0LWljb24+PC9mZC1tZW51LWFkZG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGZkLWxpc3QtdGl0bGU+e3sgKCdGaXQgQ29sdW1uIFRvIENvbnRlbnQnIHwgYmJiVHJhbnNsYXRlKSArICcgJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGZkLWxpc3QtaXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGZkLWxpc3QtbGluayAoY2xpY2spPVwiZml0VG9Db250YWluZXIuZW1pdCgpXCIgYm9keUNsaWNrPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZC1tZW51LWFkZG9uIHBvc2l0aW9uPVwiYmVmb3JlXCIgZmQtbGlzdC1pY29uPjwvZmQtbWVudS1hZGRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBmZC1saXN0LXRpdGxlPnt7ICgnQWxsIENvbHVtbnMgSW4gUGFnZScgfCBiYmJUcmFuc2xhdGUpICsgJyAnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgZmQtbGlzdC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgZmQtbGlzdC1saW5rIChjbGljayk9XCJmcmVlQ29sdW1uU2l6ZS5lbWl0KClcIiBib2R5Q2xpY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZkLW1lbnUtYWRkb24gcG9zaXRpb249XCJiZWZvcmVcIiBmZC1saXN0LWljb24+PC9mZC1tZW51LWFkZG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGZkLWxpc3QtdGl0bGU+e3sgKCdGcmVlIENvbHVtbnMgU2l6ZScgfCBiYmJUcmFuc2xhdGUpICsgJyAnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgZmQtbGlzdC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgZmQtbGlzdC1saW5rIChjbGljayk9XCJvblJlc2V0Q29sdW1uc1NldHRpbmdzKClcIiBib2R5Q2xpY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZkLW1lbnUtYWRkb24gcG9zaXRpb249XCJiZWZvcmVcIiBnbHlwaD1cInJlc2V0XCIgZmQtbGlzdC1pY29uPjwvZmQtbWVudS1hZGRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBmZC1saXN0LXRpdGxlPnt7ICdHcmlkU2V0dGluZ0Jhc2UnIHwgYmJiVHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICA8L2ZkLXBvcG92ZXItYm9keT5cclxuICAgICAgICAgICAgPC9mZC1wb3BvdmVyPlxyXG4gICAgICAgICAgICB9IEBlbHNle1xyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVmFsdWU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBjb2x1bW4gfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICB9IEBpZiAoY29udGV4dE1lbnVJdGVtcyAmJiBjb250ZXh0TWVudUl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICA8dGhcclxuICAgICAgICAgICAgY2xhc3M9XCJjb2wtaGVhZGVyIGNvbC1jb250ZXh0LW1lbnVcIlxyXG4gICAgICAgICAgICBmZC10YWJsZS1jZWxsXHJcbiAgICAgICAgICAgIFtmaXRDb250ZW50XT1cImRpc2FibGVPdmVyZmxvd0NvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbnRleHRNZW51V2lkdGhcIlxyXG4gICAgICAgID48L3RoPlxyXG4gICAgICAgIH0gQGlmIChzaG93RGV0YWlsc0luUm93ICYmICFpbmxpbmVFZGl0TW9kZSkge1xyXG4gICAgICAgIDx0aCBjbGFzcz1cImNvbC1oZWFkZXIgY29sLWRldGFpbHNcIiBbc3R5bGUud2lkdGhdPVwiZGV2aWNlU2l6ZSA9PT0gJ3MnID8gJzQ0cHgnIDogJzEyMHB4J1wiIGZkLXRhYmxlLWNlbGw+PC90aD5cclxuICAgICAgICB9IEBpZiAoc2hvd1ZpZXdCdXR0b24pIHtcclxuICAgICAgICA8dGggY2xhc3M9XCJjb2wtaGVhZGVyIGNvbC12aWV3XCIgW3N0eWxlLndpZHRoLnB4XT1cIjM2ICogKGFjdGlvbkxpc3Q/Lmxlbmd0aCA/PyAwKSArIDhcIiBmZC10YWJsZS1jZWxsPjwvdGg+XHJcbiAgICAgICAgfSB9XHJcbiAgICA8L3RyPlxyXG48L3RoZWFkPlxyXG48bmctdGVtcGxhdGUgI2hlYWRlclZhbHVlIGxldC1jb2x1bW4+XHJcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleFwiIFthdHRyLnRpdGxlXT1cImNvbHVtbi5DYXB0aW9uIHwgYmJiVHJhbnNsYXRlXCI+XHJcbiAgICAgICAgQGlmICggKGNvbHVtbi5FeHRyYT8uSWNvbkRpc3BsYXlUeXBlRW51bSA9PT0gJ0ltYWdlJyB8fCBjb2x1bW4uRmllbGRUeXBlSWQgPT09IDQyKSAmJiBjb2x1bW4uSWNvbikge1xyXG4gICAgICAgIDxpbWcgW3NyY109XCJjb2x1bW4uSWNvblwiIC8+XHJcbiAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAge3sgY29sdW1uLkNhcHRpb24gfCBiYmJUcmFuc2xhdGUgfX1cclxuICAgICAgICB9XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19
230
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyc2EtdGFibGUtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXNhcC11aS9zcmMvbGliL2JhcnNhLXRhYmxlLWhlYWRlci9iYXJzYS10YWJsZS1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etc2FwLXVpL3NyYy9saWIvYmFyc2EtdGFibGUtaGVhZGVyL2JhcnNhLXRhYmxlLWhlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULHVCQUF1QixFQUN2QixLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFFTixZQUFZLEVBQ1osVUFBVSxFQUVWLFNBQVMsRUFFVCxNQUFNLEVBRVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGFBQWEsRUFJYixvQkFBb0IsRUFDcEIsZUFBZSxFQUNsQixNQUFNLHNCQUFzQixDQUFDOzs7Ozs7Ozs7OztBQVU5QixNQUFNLE9BQU8seUJBQTBCLFNBQVEsYUFBYTtJQStDeEQ7O09BRUc7SUFDSCxZQUFvQixJQUF1QixFQUFVLFVBQXFCO1FBQ3RFLEtBQUssRUFBRSxDQUFDO1FBRFEsU0FBSSxHQUFKLElBQUksQ0FBbUI7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFXO1FBbENqRSxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFleEIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQzFDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFDNUQsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBK0MsQ0FBQztRQUNqRixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUE2RCxDQUFDO1FBQzdGLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUMxQyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFRLENB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LFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgICBJbnB1dCxcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIE91dHB1dCxcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgVmlld0NoaWxkcmVuLFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIFF1ZXJ5TGlzdCxcclxuICAgIFZpZXdDaGlsZCxcclxuICAgIFJlbmRlcmVyMixcclxuICAgIGluamVjdCxcclxuICAgIFNpbXBsZUNoYW5nZXNcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICAgIEJhc2VDb21wb25lbnQsXHJcbiAgICBSZXBvcnRWaWV3Q29sdW1uLFxyXG4gICAgQWJicmV2YXRpb25EZXZpY2VTaXplLFxyXG4gICAgQ29sdW1uUmVzaXplZEFyZ3MsXHJcbiAgICBUYWJsZUhlYWRlcldpZHRoTW9kZSxcclxuICAgIHNldFRhYmxlVGhXaWR0aFxyXG59IGZyb20gJ2JhcnNhLW5vdmluLXJheS1jb3JlJztcclxuaW1wb3J0IHsgVWlUYWJsZVZpZXdTZXR0aW5nIH0gZnJvbSAnLi4vbW9kZWxzL2dyaWQtdmlldyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYnN1LWJhcnNhLXRhYmxlLWhlYWRlcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vYmFyc2EtdGFibGUtaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2JhcnNhLXRhYmxlLWhlYWRlci5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBzdGFuZGFsb25lOiBmYWxzZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFyc2FUYWJsZUhlYWRlckNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xyXG4gICAgQFZpZXdDaGlsZHJlbigndGhSZWYnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgdGhMaXN0OiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxhbnk+PjtcclxuICAgIEBWaWV3Q2hpbGQoJ3RoZWFkUmVmJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSkgdGhlYWRSZWY6IEVsZW1lbnRSZWY7XHJcbiAgICBASW5wdXQoKSBhbGxDaGVja2VkOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgaXNDaGVja0xpc3Q6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBhdHRhY2htZW50Vmlld1R5cGU6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIGNvbHVtbnM6IFJlcG9ydFZpZXdDb2x1bW5bXTtcclxuICAgIEBJbnB1dCgpIGZpdFdpZHRoOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgY29udGV4dE1lbnVJdGVtczogYW55W107XHJcbiAgICBASW5wdXQoKSBjb250ZXh0TWVudVdpZHRoOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBzaG93Vmlld0J1dHRvbjogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIGhhc1NlbGVjdGVkOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgaGlkZU9wZW5JY29uOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgZGlzYWJsZU92ZXJmbG93Q29udGV4dE1lbnU6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBpbmxpbmVFZGl0TW9kZTogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIGhpZGVIZWFkZXI6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBzaG93RGV0YWlsc0luUm93ID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSB2aWV3U2V0dGluZzogVWlUYWJsZVZpZXdTZXR0aW5nO1xyXG4gICAgQElucHV0KCkgdGFibGVXaWR0aDogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgcmVzaXplZEJ5VXNlcjogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVSZXNwb25zaXZlOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgYWN0aW9uTGlzdDogYW55W107XHJcbiAgICBASW5wdXQoKSByb3dJbmRpY2F0b3I6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBydGw6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBzdGlja3k6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBzaG93Um93TnVtYmVyOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgaGFzU2Vjb25kYXJ5Q29sdW1uczogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVSZXNpemU6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBkaXNhYmxlSGVhZGVyQ29udGV4dE1lbnU6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBkZXZpY2VTaXplOiBBYmJyZXZhdGlvbkRldmljZVNpemU7XHJcbiAgICBASW5wdXQoKSB0YWJsZUhlYWRlck1vZGU6IFRhYmxlSGVhZGVyV2lkdGhNb2RlO1xyXG4gICAgQE91dHB1dCgpIGFsbENoZWNrYm94ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gICAgQE91dHB1dCgpIGNvbHVtblJlc2l6ZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8Q29sdW1uUmVzaXplZEFyZ3M+PigpO1xyXG4gICAgQE91dHB1dCgpIGNvbHVtblJlc2l6aW5nID0gbmV3IEV2ZW50RW1pdHRlcjx7IGNvbHVtbjogUmVwb3J0Vmlld0NvbHVtbjsgd2lkdGg6IG51bWJlciB9PigpO1xyXG4gICAgQE91dHB1dCgpIGZpdFRvQ29udGVudCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb2x1bW46IFJlcG9ydFZpZXdDb2x1bW47IHRoRG9tOiBIVE1MVGFibGVDZWxsRWxlbWVudCB9PigpO1xyXG4gICAgQE91dHB1dCgpIGZpdFRvQ29udGFpbmVyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gICAgQE91dHB1dCgpIGZyZWVDb2x1bW5TaXplID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gICAgQE91dHB1dCgpIHNvcnRBc2NlbmRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBzb3J0RGVzY2VuZGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIGZpbHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8UmVwb3J0Vmlld0NvbHVtbj4oKTtcclxuICAgIEBPdXRwdXQoKSByZXNldEdyaWRTZXR0aW5ncyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICAgIEBPdXRwdXQoKSBoZWFkZXJSZW5kZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEhUTUxFbGVtZW50PigpO1xyXG4gICAgY29sdW1uc1NtYWxsZXJUaGFuVGFibGVXaWR0aDogYm9vbGVhbjtcclxuXHJcbiAgICBzdGFydEluZGV4OiBudW1iZXI7XHJcbiAgICByZXNpemVIZWFkZXIgPSBmYWxzZTtcclxuICAgIGVsID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIF9yZW5kZXJlcjI6IFJlbmRlcmVyMikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgdGhBcnIoKTogSFRNTFRhYmxlQ2VsbEVsZW1lbnRbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGhMaXN0LnRvQXJyYXkoKS5tYXAoKGMpID0+IGMubmF0aXZlRWxlbWVudCk7XHJcbiAgICB9XHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgICAgIHRoaXMuaGVhZGVyUmVuZGVyLmVtaXQodGhpcy50aGVhZFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICAvLyB0aGlzLl9wcmVwYXJlQ29sdW1uc1dpZHRoKHRoaXMudGFibGVXaWR0aCwgdGhpcy5jb2x1bW5zLCB0cnVlKTtcclxuICAgIH1cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcclxuICAgICAgICBjb25zdCB7IHRhYmxlSGVhZGVyTW9kZSwgY29sdW1ucyB9ID0gY2hhbmdlcztcclxuICAgICAgICBpZiAodGFibGVIZWFkZXJNb2RlICYmICF0YWJsZUhlYWRlck1vZGUuZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgICAgICAgc2V0VGFibGVUaFdpZHRoKHRhYmxlSGVhZGVyTW9kZS5jdXJyZW50VmFsdWUsIHRoaXMuY29sdW1ucywgdGhpcy50aEFyciwgdGhpcy5fcmVuZGVyZXIyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbHVtbnMgJiYgIWNvbHVtbnMuZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgICAgICAgdGhpcy5SZWZyZXNoVGFibGVUaFdpZHRoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uU29ydEFzY2VuZGluZyhjb2x1bW4sIG1lbnUpOiB2b2lkIHtcclxuICAgICAgICBpZiAobWVudSkge1xyXG4gICAgICAgICAgICBtZW51LmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc29ydEFzY2VuZGluZy5lbWl0KGNvbHVtbik7XHJcbiAgICB9XHJcbiAgICBvblNvcnREZXNjZW5kaW5nKGNvbHVtbiwgbWVudSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChtZW51KSB7XHJcbiAgICAgICAgICAgIG1lbnUuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zb3J0RGVzY2VuZGluZy5lbWl0KGNvbHVtbik7XHJcbiAgICB9XHJcbiAgICBvbkZpbHRlcihtZW51KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKG1lbnUpIHtcclxuICAgICAgICAgICAgbWVudS5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZpbHRlci5lbWl0KCk7XHJcbiAgICB9XHJcbiAgICBvbkZpdFRvQ29udGVudChjb2x1bW4sIGk6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRoRG9tOiBIVE1MVGFibGVDZWxsRWxlbWVudCA9IHRoaXMudGhBcnJbaV07XHJcbiAgICAgICAgdGhpcy5maXRUb0NvbnRlbnQuZW1pdCh7IGNvbHVtbiwgdGhEb20gfSk7XHJcbiAgICB9XHJcbiAgICBvblJlc2V0Q29sdW1uc1NldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVzZXRHcmlkU2V0dGluZ3MuZW1pdCgpO1xyXG4gICAgfVxyXG4gICAgb25Db2x1bW5XaWR0aENoYW5naW5nKGluZGV4OiBudW1iZXIsIGNvbHVtbjogUmVwb3J0Vmlld0NvbHVtbiwgd2lkdGg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVzaXplSGVhZGVyID0gdHJ1ZTtcclxuICAgICAgICBjb2x1bW4uV2lkdGggPSB3aWR0aDtcclxuICAgICAgICBjb25zdCB0aExpc3QgPSB0aGlzLnRoQXJyO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPCB0aExpc3QubGVuZ3RoIC0gMSAmJiB0aGlzLnRhYmxlSGVhZGVyTW9kZSA9PT0gVGFibGVIZWFkZXJXaWR0aE1vZGUuRnJlZUNvbHVtblNpemUpIHtcclxuICAgICAgICAgICAgY29uc3QgbGFzdFRoID0gdGhMaXN0W3RoTGlzdC5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIyLnNldFN0eWxlKGxhc3RUaCwgJ3dpZHRoJywgYCR7bGFzdFRoLm9mZnNldFdpZHRofXB4YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29sdW1uUmVzaXppbmcuZW1pdCh7IGNvbHVtbiwgd2lkdGggfSk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2NvbHVtbldpZHRoQ2hhbmdpbmcgbnVtYmVyOicsIHdpZHRoLCBpbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Db2x1bW5XaWR0aENoYW5nZShjb2x1bW46IFJlcG9ydFZpZXdDb2x1bW4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHVtbnMuZmluZCgoYykgPT4gYy5OYW1lID09PSBjb2x1bW4uTmFtZSk7XHJcbiAgICAgICAgaWYgKCFjb2wpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB3aXRoMiA9IE1hdGgucm91bmQoY29sdW1uLldpZHRoKTtcclxuICAgICAgICBjb2wuV2lkdGggPSB3aXRoMjtcclxuICAgICAgICBjb25zdCB0aExpc3QgPSB0aGlzLnRoQXJyO1xyXG5cclxuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoYywgaSkgPT4ge1xyXG4gICAgICAgICAgICBjLldpZHRoID0gdGhMaXN0W2ldLm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICBpZiAoaSAhPT0gdGhpcy5jb2x1bW5zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyMi5zZXRTdHlsZSh0aExpc3RbaV0sICd3aWR0aCcsIGAke2MuV2lkdGh9cHhgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyMi5zZXRTdHlsZSh0aExpc3RbdGhMaXN0Lmxlbmd0aCAtIDFdLCAnd2lkdGgnLCAnMTAwJScpO1xyXG4gICAgICAgIHRoaXMuY29sdW1uUmVzaXplLmVtaXQodGhpcy5jb2x1bW5zLm1hcCgoYywgaSkgPT4gKHsgbmFtZTogYy5OYW1lLCB3aWR0aDogYy5XaWR0aCwgdGhEb206IHRoTGlzdFtpXSB9KSkpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdjb2x1bW5XaWR0aENoYW5nZScpO1xyXG4gICAgfVxyXG4gICAgb25BbGxDaGVja2JveChjaGVja2VkKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hbGxDaGVja2JveC5lbWl0KGNoZWNrZWQpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIFNldENvbHVtbldpZHRoVG9UaFdpZHRoKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudGhBcnIuZm9yRWFjaCgodGgsIGkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zW2ldLldpZHRoID0gdGgub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc1tpXS4kV2lkdGggPSBgJHt0aC5vZmZzZXRXaWR0aH1weGA7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgU2V0Q29sdW1uV2lkdGhUb1Jlc2l6ZWRUaChhcnI6IEFycmF5PENvbHVtblJlc2l6ZWRBcmdzPik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudGhBcnIuZm9yRWFjaCgodGgsIGkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zW2ldLldpZHRoID0gYXJyW2ldLndpZHRoO1xyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnNbaV0uJFdpZHRoID0gYCR7YXJyW2ldLndpZHRofXB4YDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBTZXRDb2x1bW5XaWR0aFRvUGVyY2VudCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhbGxXaWR0aCA9IHRoaXMudGhlYWRSZWYubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcclxuICAgICAgICB0aGlzLnRoQXJyLmZvckVhY2goKHRoLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHggPSAodGgub2Zmc2V0V2lkdGggKiAxMDApIC8gYWxsV2lkdGg7XHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc1tpXS4kRml0Q29udGFpbmVyV2lkdGggPSBgJHt4fSVgO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIFJlZnJlc2hUYWJsZVRoV2lkdGgoKTogdm9pZCB7XHJcbiAgICAgICAgc2V0VGFibGVUaFdpZHRoKHRoaXMudGFibGVIZWFkZXJNb2RlLCB0aGlzLmNvbHVtbnMsIHRoaXMudGhBcnIsIHRoaXMuX3JlbmRlcmVyMik7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgVGFibGVUaEZpdFRvQ2FwdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBzZXRUYWJsZVRoV2lkdGgoVGFibGVIZWFkZXJXaWR0aE1vZGUuQ29sdW1uV2lkdGgsIHRoaXMuY29sdW1ucywgdGhpcy50aEFyciwgdGhpcy5fcmVuZGVyZXIyKTtcclxuICAgIH1cclxuICAgIF90cmFja0J5Q29sdW1uKGluZGV4OiBudW1iZXIsIGNvbHVtbjogUmVwb3J0Vmlld0NvbHVtbik6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGAke2NvbHVtbi5OYW1lfSR7aW5kZXh9YDtcclxuICAgIH1cclxufVxyXG4iLCI8dGhlYWRcclxuICAgIGZkLXRhYmxlLWhlYWRlclxyXG4gICAgW2NsYXNzLmlubGluZS1lZGl0XT1cImlubGluZUVkaXRNb2RlXCJcclxuICAgIFtjbGFzcy5zbWFsbENvbHVtbnNdPVwiY29sdW1uc1NtYWxsZXJUaGFuVGFibGVXaWR0aFwiXHJcbiAgICBbc3R5bGUucG9zaXRpb25dPVwic3RpY2t5ID8gJ3N0aWNreScgOiBudWxsXCJcclxuICAgICN0aGVhZFJlZlxyXG4+XHJcbiAgICA8dHIgZmQtdGFibGUtcm93PlxyXG4gICAgICAgIEBpZiAoIWhpZGVIZWFkZXIpIHsgQGlmIChyb3dJbmRpY2F0b3IpIHtcclxuICAgICAgICA8dGggZmQtdGFibGUtY2VsbCBmZC10YWJsZS1zdGF0dXMtaW5kaWNhdG9yICNyb3dJbmRpY2F0b3I+PC90aD5cclxuICAgICAgICB9IEBpZiAoc2hvd1Jvd051bWJlcikge1xyXG4gICAgICAgIDx0aCBmZC10YWJsZS1jZWxsIHN0eWxlPVwid2lkdGg6IDQwcHg7IG1heC13aWR0aDogNDBweFwiPjwvdGg+XHJcbiAgICAgICAgfSBAaWYgKGlzQ2hlY2tMaXN0KSB7XHJcbiAgICAgICAgPHRoIGZkLXRhYmxlLWNlbGw+XHJcbiAgICAgICAgICAgIDxmZC1jaGVja2JveFxyXG4gICAgICAgICAgICAgICAgbmFtZT1cImFsbENoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImFsbENoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25BbGxDaGVja2JveCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgPjwvZmQtY2hlY2tib3g+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICB9IEBpZiAoIWlzQ2hlY2tMaXN0ICYmICFzaG93Um93TnVtYmVyKSB7XHJcbiAgICAgICAgPHRoIGZkLXRhYmxlLWNlbGwgY2xhc3M9XCJzaW5nbGUtc2VsZWN0XCI+PC90aD5cclxuICAgICAgICB9IEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5zOyB0cmFjayBfdHJhY2tCeUNvbHVtbihpLCBjb2x1bW4pOyBsZXQgaSA9ICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCkge1xyXG4gICAgICAgIDx0aFxyXG4gICAgICAgICAgICAjdGhSZWZcclxuICAgICAgICAgICAgdGFibGV0aFxyXG4gICAgICAgICAgICBmZC10YWJsZS1jZWxsXHJcbiAgICAgICAgICAgIHJlc2l6YWJsZVxyXG4gICAgICAgICAgICBbaW5kZXhdPVwiaVwiXHJcbiAgICAgICAgICAgIFtsYXN0XT1cImxhc3RcIlxyXG4gICAgICAgICAgICBbY29sdW1uc0xlbmd0aF09XCJjb2x1bW5zLmxlbmd0aFwiXHJcbiAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcclxuICAgICAgICAgICAgW3RhYmxlSGVhZGVyTW9kZV09XCJ0YWJsZUhlYWRlck1vZGVcIlxyXG4gICAgICAgICAgICBbZmllbGRUeXBlSWRdPVwiK2NvbHVtbi5GaWVsZFR5cGVJZFwiXHJcbiAgICAgICAgICAgIFtydGxdPVwicnRsXCJcclxuICAgICAgICAgICAgW2NhcHRpb25dPVwiY29sdW1uLkNhcHRpb24gfCBiYmJUcmFuc2xhdGVcIlxyXG4gICAgICAgICAgICBbbmFtZV09XCJjb2x1bW4uTmFtZVwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cImNvbHVtbi5JY29uXCJcclxuICAgICAgICAgICAgW2NvbENsYXNzXT1cImNvbHVtbi4kQ1NTQ2xhc3NOYW1lICsgJyBjb2x1bW5fXycgKyBjb2x1bW4uQ2FwdGlvblwiXHJcbiAgICAgICAgICAgIFtkaXNwbGF5VHlwZV09XCJjb2x1bW4uRXh0cmE/Lkljb25EaXNwbGF5VHlwZUVudW1cIlxyXG4gICAgICAgICAgICBbaXNJbWFnZU9ySWNvbl09XCIoY29sdW1uIHwgdGhJbWFnZU9ySWNvbikgPT09IHRydWVcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZVJlc2l6ZV09XCJcclxuICAgICAgICAgICAgICAgIGhhc1NlY29uZGFyeUNvbHVtbnMgfHxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVSZXNpemUgfHxcclxuICAgICAgICAgICAgICAgICh0YWJsZUhlYWRlck1vZGUgPT09IDIgJiYgbGFzdCkgfHxcclxuICAgICAgICAgICAgICAgIChjb2x1bW4gfCB0aEltYWdlT3JJY29uKSA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZUhlYWRlckNvbnRleHRNZW51XT1cImRpc2FibGVIZWFkZXJDb250ZXh0TWVudVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlUmVzcG9uc2l2ZV09XCJkaXNhYmxlUmVzcG9uc2l2ZVwiXHJcbiAgICAgICAgICAgIChzb3J0QXNjZW5kaW5nKT1cInNvcnRBc2NlbmRpbmcuZW1pdChjb2x1bW4pXCJcclxuICAgICAgICAgICAgKHNvcnREZXNjZW5kaW5nKT1cInNvcnREZXNjZW5kaW5nLmVtaXQoY29sdW1uKVwiXHJcbiAgICAgICAgICAgIChmaWx0ZXIpPVwiZmlsdGVyLmVtaXQoY29sdW1uKVwiXHJcbiAgICAgICAgICAgIChyZXNldEdyaWRTZXR0aW5ncyk9XCJyZXNldEdyaWRTZXR0aW5ncy5lbWl0KClcIlxyXG4gICAgICAgICAgICAod2lkdGhDaGFuZ2UpPVwib25Db2x1bW5XaWR0aENoYW5nZShjb2x1bW4pXCJcclxuICAgICAgICAgICAgKHdpZHRoQ2hhbmdpbmcpPVwib25Db2x1bW5XaWR0aENoYW5naW5nKGksIGNvbHVtbiwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJoYXNTZWNvbmRhcnlDb2x1bW5zICYmIGxhc3QgPyAnMTAwJSAhaW1wb3J0YW50JyA6IG51bGxcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgQGlmKCFkaXNhYmxlSGVhZGVyQ29udGV4dE1lbnUpe1xyXG4gICAgICAgICAgICA8ZmQtcG9wb3ZlciAjbWVudT5cclxuICAgICAgICAgICAgICAgIDxmZC1wb3BvdmVyLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlclZhbHVlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogY29sdW1uIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZmQtcG9wb3Zlci1jb250cm9sPlxyXG4gICAgICAgICAgICAgICAgPGZkLXBvcG92ZXItYm9keT5cclxuICAgICAgICAgICAgICAgICAgICA8dWwgZmQtbGlzdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGZkLWxpc3QtaXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGZkLWxpc3QtbGluayAoY2xpY2spPVwib25Tb3J0QXNjZW5kaW5nKGNvbHVtbiwgbWVudSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmQtbWVudS1hZGRvbiBwb3NpdGlvbj1cImJlZm9yZVwiIGdseXBoPVwic29ydC1hc2NlbmRpbmdcIiBmZC1saXN0LWljb24+PC9mZC1tZW51LWFkZG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGZkLWxpc3QtdGl0bGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPnt7ICgnU29ydCcgfCBiYmJUcmFuc2xhdGUpICsgJyAnIH19IHt7ICdBc2NlbmRpbmcnIHwgYmJiVHJhbnNsYXRlIH19PC9zcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgZmQtbGlzdC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgZmQtbGlzdC1saW5rIChjbGljayk9XCJvblNvcnREZXNjZW5kaW5nKGNvbHVtbiwgbWVudSlcIiBib2R5Q2xpY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZkLW1lbnUtYWRkb24gcG9zaXRpb249XCJiZWZvcmVcIiBnbHlwaD1cInNvcnQtZGVzY2VuZGluZ1wiIGZkLWxpc3QtaWNvbj48L2ZkLW1lbnUtYWRkb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZmQtbGlzdC10aXRsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3sgKCdTb3J0JyB8IGJiYlRyYW5zbGF0ZSkgKyAnICcgfX0ge3sgJ0Rlc2NlbmRpbmcnIHwgYmJiVHJhbnNsYXRlIH19PC9zcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgZmQtbGlzdC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgZmQtbGlzdC1saW5rIChjbGljayk9XCJvbkZpdFRvQ29udGVudChjb2x1bW4sIGkpXCIgYm9keUNsaWNrPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZC1tZW51LWFkZG9uIHBvc2l0aW9uPVwiYmVmb3JlXCIgZmQtbGlzdC1pY29uPjwvZmQtbWVudS1hZGRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBmZC1saXN0LXRpdGxlPnt7ICgnRml0IENvbHVtbiBUbyBDb250ZW50JyB8IGJiYlRyYW5zbGF0ZSkgKyAnICcgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBmZC1saXN0LWl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBmZC1saXN0LWxpbmsgKGNsaWNrKT1cImZpdFRvQ29udGFpbmVyLmVtaXQoKVwiIGJvZHlDbGljaz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmQtbWVudS1hZGRvbiBwb3NpdGlvbj1cImJlZm9yZVwiIGZkLWxpc3QtaWNvbj48L2ZkLW1lbnUtYWRkb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZmQtbGlzdC10aXRsZT57eyAoJ0FsbCBDb2x1bW5zIEluIFBhZ2UnIHwgYmJiVHJhbnNsYXRlKSArICcgJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGZkLWxpc3QtaXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGZkLWxpc3QtbGluayAoY2xpY2spPVwiZnJlZUNvbHVtblNpemUuZW1pdCgpXCIgYm9keUNsaWNrPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZC1tZW51LWFkZG9uIHBvc2l0aW9uPVwiYmVmb3JlXCIgZmQtbGlzdC1pY29uPjwvZmQtbWVudS1hZGRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBmZC1saXN0LXRpdGxlPnt7ICgnRnJlZSBDb2x1bW5zIFNpemUnIHwgYmJiVHJhbnNsYXRlKSArICcgJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGZkLWxpc3QtaXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGZkLWxpc3QtbGluayAoY2xpY2spPVwib25SZXNldENvbHVtbnNTZXR0aW5ncygpXCIgYm9keUNsaWNrPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZC1tZW51LWFkZG9uIHBvc2l0aW9uPVwiYmVmb3JlXCIgZ2x5cGg9XCJyZXNldFwiIGZkLWxpc3QtaWNvbj48L2ZkLW1lbnUtYWRkb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZmQtbGlzdC10aXRsZT57eyAnR3JpZFNldHRpbmdCYXNlJyB8IGJiYlRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgPC9mZC1wb3BvdmVyLWJvZHk+XHJcbiAgICAgICAgICAgIDwvZmQtcG9wb3Zlcj5cclxuICAgICAgICAgICAgfSBAZWxzZXtcclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlclZhbHVlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogY29sdW1uIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgICAgfSBAaWYgKGNvbnRleHRNZW51SXRlbXMgJiYgY29udGV4dE1lbnVJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgPHRoXHJcbiAgICAgICAgICAgIGNsYXNzPVwiY29sLWhlYWRlciBjb2wtY29udGV4dC1tZW51XCJcclxuICAgICAgICAgICAgZmQtdGFibGUtY2VsbFxyXG4gICAgICAgICAgICBbZml0Q29udGVudF09XCJkaXNhYmxlT3ZlcmZsb3dDb250ZXh0TWVudVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb250ZXh0TWVudVdpZHRoXCJcclxuICAgICAgICA+PC90aD5cclxuICAgICAgICB9IEBpZiAoc2hvd0RldGFpbHNJblJvdyAmJiAhaW5saW5lRWRpdE1vZGUpIHtcclxuICAgICAgICA8dGggY2xhc3M9XCJjb2wtaGVhZGVyIGNvbC1kZXRhaWxzXCIgW3N0eWxlLndpZHRoXT1cImRldmljZVNpemUgPT09ICdzJyA/ICc0NHB4JyA6ICcxMjBweCdcIiBmZC10YWJsZS1jZWxsPjwvdGg+XHJcbiAgICAgICAgfSBAaWYgKHNob3dWaWV3QnV0dG9uKSB7XHJcbiAgICAgICAgPHRoIGNsYXNzPVwiY29sLWhlYWRlciBjb2wtdmlld1wiIFtzdHlsZS53aWR0aC5weF09XCIzNiAqIChhY3Rpb25MaXN0Py5sZW5ndGggPz8gMCkgKyA4XCIgZmQtdGFibGUtY2VsbD48L3RoPlxyXG4gICAgICAgIH0gfVxyXG4gICAgPC90cj5cclxuPC90aGVhZD5cclxuPG5nLXRlbXBsYXRlICNoZWFkZXJWYWx1ZSBsZXQtY29sdW1uPlxyXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXhcIiBbYXR0ci50aXRsZV09XCJjb2x1bW4uQ2FwdGlvbiB8IGJiYlRyYW5zbGF0ZVwiPlxyXG4gICAgICAgIEBpZiAoIChjb2x1bW4uRXh0cmE/Lkljb25EaXNwbGF5VHlwZUVudW0gPT09ICdJbWFnZScgfHwgY29sdW1uLkZpZWxkVHlwZUlkID09PSA0MikgJiYgY29sdW1uLkljb24pIHtcclxuICAgICAgICA8aW1nIFtzcmNdPVwiY29sdW1uLkljb25cIiAvPlxyXG4gICAgICAgIH0gQGVsc2UgaWYoY29sdW1uLkZpZWxkVHlwZUlkIT09MzgpIHtcclxuICAgICAgICB7eyBjb2x1bW4uQ2FwdGlvbiB8IGJiYlRyYW5zbGF0ZSB9fVxyXG4gICAgICAgIH1cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=