@hestia-earth/ui-components 0.27.15 → 0.27.17

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.
@@ -19,10 +19,10 @@ export class ShelfDialogComponent {
19
19
  this.showContent.set(false);
20
20
  }
21
21
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: ShelfDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
22
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.8", type: ShelfDialogComponent, isStandalone: true, selector: "he-shelf-dialog", inputs: { headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, bottom: { classPropertyName: "bottom", publicName: "bottom", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, ngImport: i0, template: "<div [style.bottom]=\"bottom()\" class=\"shelf-dialog | is-fixed\">\n <header class=\"shelf-dialog__header | px-4 py-2 is-flex is-rounded has-text-white is-align-items-center\">\n <div class=\"is-flex-grow-1\">\n <ng-container [ngTemplateOutlet]=\"headerTemplate() ?? defaultTemplate\"/>\n </div>\n <button (click)=\"showContent.set(!showContent())\" class=\"ml-3 dialog-btn has-text-white\">\n <svg-icon class=\"is-size-4\" [name]=\"toggleIcon()\"/>\n </button>\n <button (click)=\"closed.emit()\" class=\"ml-3 dialog-btn has-text-white\">\n <svg-icon class=\"is-size-4\" name=\"far-close\"/>\n </button>\n </header>\n <div [class.max-h-0]=\"!showContent()\" class=\"shelf-dialog__content | has-background-white\">\n <div>\n <div class=\"p-4\">\n <ng-content/>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #defaultTemplate>\n {{ title() }}\n</ng-template>\n", styles: [".shelf-dialog{min-width:360px;right:10%;border-radius:.5em .5em 0 0;overflow:hidden;box-shadow:0 8px 8px #00000026;z-index:9}.shelf-dialog__header{background:#4c7194}.shelf-dialog__content{overflow:hidden;display:grid;grid-template-rows:1fr;transition:grid-template-rows 125ms}.shelf-dialog__content>*{overflow:hidden}.shelf-dialog .dialog-btn{background:transparent;border:none;cursor:pointer;width:1.5rem;height:1.5rem}.shelf-dialog .dialog-btn fa-icon{font-size:1.5rem}.max-h-0{grid-template-rows:0fr}@media screen and (max-width: 767px){.shelf-dialog{width:100dvw;right:0;border-radius:0}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SvgIconComponent, selector: "svg-icon", inputs: ["src", "name", "stretch", "applyClass", "applyCss", "svgClass", "class", "viewBox", "svgAriaLabel", "svgStyle"] }, { kind: "ngmodule", type: HeSvgIconsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
22
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.8", type: ShelfDialogComponent, isStandalone: true, selector: "he-shelf-dialog", inputs: { headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, bottom: { classPropertyName: "bottom", publicName: "bottom", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, ngImport: i0, template: "<div [style.bottom]=\"bottom()\" class=\"shelf-dialog | is-fixed\">\n <header class=\"shelf-dialog__header | px-4 py-2 is-flex is-rounded has-text-white is-align-items-center\">\n <div class=\"is-flex-grow-1\">\n <ng-container [ngTemplateOutlet]=\"headerTemplate() ?? defaultTemplate\"/>\n </div>\n <button (click)=\"showContent.set(!showContent())\" class=\"ml-3 dialog-btn has-text-white\">\n <svg-icon class=\"is-size-4\" [name]=\"toggleIcon()\"/>\n </button>\n <button (click)=\"closed.emit()\" class=\"ml-3 dialog-btn has-text-white\">\n <svg-icon class=\"is-size-4\" name=\"far-close\"/>\n </button>\n </header>\n <div [class.max-h-0]=\"!showContent()\" class=\"shelf-dialog__content | has-background-white\">\n <div>\n <div class=\"p-4\">\n <ng-content/>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #defaultTemplate>\n {{ title() }}\n</ng-template>\n", styles: [".shelf-dialog{min-width:360px;right:10%;border-radius:.5em .5em 0 0;overflow:hidden;box-shadow:0 8px 8px #00000026;z-index:99}.shelf-dialog__header{background:#4c7194}.shelf-dialog__content{overflow:hidden;display:grid;grid-template-rows:1fr;transition:grid-template-rows 125ms}.shelf-dialog__content>*{overflow:hidden}.shelf-dialog .dialog-btn{background:transparent;border:none;cursor:pointer;width:1.5rem;height:1.5rem}.shelf-dialog .dialog-btn fa-icon{font-size:1.5rem}.max-h-0{grid-template-rows:0fr}@media screen and (max-width: 767px){.shelf-dialog{width:100dvw;right:0;border-radius:0}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SvgIconComponent, selector: "svg-icon", inputs: ["src", "name", "stretch", "applyClass", "applyCss", "svgClass", "class", "viewBox", "svgAriaLabel", "svgStyle"] }, { kind: "ngmodule", type: HeSvgIconsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23
23
  }
24
24
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: ShelfDialogComponent, decorators: [{
25
25
  type: Component,
26
- args: [{ selector: 'he-shelf-dialog', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgTemplateOutlet, SvgIconComponent, HeSvgIconsModule], template: "<div [style.bottom]=\"bottom()\" class=\"shelf-dialog | is-fixed\">\n <header class=\"shelf-dialog__header | px-4 py-2 is-flex is-rounded has-text-white is-align-items-center\">\n <div class=\"is-flex-grow-1\">\n <ng-container [ngTemplateOutlet]=\"headerTemplate() ?? defaultTemplate\"/>\n </div>\n <button (click)=\"showContent.set(!showContent())\" class=\"ml-3 dialog-btn has-text-white\">\n <svg-icon class=\"is-size-4\" [name]=\"toggleIcon()\"/>\n </button>\n <button (click)=\"closed.emit()\" class=\"ml-3 dialog-btn has-text-white\">\n <svg-icon class=\"is-size-4\" name=\"far-close\"/>\n </button>\n </header>\n <div [class.max-h-0]=\"!showContent()\" class=\"shelf-dialog__content | has-background-white\">\n <div>\n <div class=\"p-4\">\n <ng-content/>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #defaultTemplate>\n {{ title() }}\n</ng-template>\n", styles: [".shelf-dialog{min-width:360px;right:10%;border-radius:.5em .5em 0 0;overflow:hidden;box-shadow:0 8px 8px #00000026;z-index:9}.shelf-dialog__header{background:#4c7194}.shelf-dialog__content{overflow:hidden;display:grid;grid-template-rows:1fr;transition:grid-template-rows 125ms}.shelf-dialog__content>*{overflow:hidden}.shelf-dialog .dialog-btn{background:transparent;border:none;cursor:pointer;width:1.5rem;height:1.5rem}.shelf-dialog .dialog-btn fa-icon{font-size:1.5rem}.max-h-0{grid-template-rows:0fr}@media screen and (max-width: 767px){.shelf-dialog{width:100dvw;right:0;border-radius:0}}\n"] }]
26
+ args: [{ selector: 'he-shelf-dialog', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgTemplateOutlet, SvgIconComponent, HeSvgIconsModule], template: "<div [style.bottom]=\"bottom()\" class=\"shelf-dialog | is-fixed\">\n <header class=\"shelf-dialog__header | px-4 py-2 is-flex is-rounded has-text-white is-align-items-center\">\n <div class=\"is-flex-grow-1\">\n <ng-container [ngTemplateOutlet]=\"headerTemplate() ?? defaultTemplate\"/>\n </div>\n <button (click)=\"showContent.set(!showContent())\" class=\"ml-3 dialog-btn has-text-white\">\n <svg-icon class=\"is-size-4\" [name]=\"toggleIcon()\"/>\n </button>\n <button (click)=\"closed.emit()\" class=\"ml-3 dialog-btn has-text-white\">\n <svg-icon class=\"is-size-4\" name=\"far-close\"/>\n </button>\n </header>\n <div [class.max-h-0]=\"!showContent()\" class=\"shelf-dialog__content | has-background-white\">\n <div>\n <div class=\"p-4\">\n <ng-content/>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #defaultTemplate>\n {{ title() }}\n</ng-template>\n", styles: [".shelf-dialog{min-width:360px;right:10%;border-radius:.5em .5em 0 0;overflow:hidden;box-shadow:0 8px 8px #00000026;z-index:99}.shelf-dialog__header{background:#4c7194}.shelf-dialog__content{overflow:hidden;display:grid;grid-template-rows:1fr;transition:grid-template-rows 125ms}.shelf-dialog__content>*{overflow:hidden}.shelf-dialog .dialog-btn{background:transparent;border:none;cursor:pointer;width:1.5rem;height:1.5rem}.shelf-dialog .dialog-btn fa-icon{font-size:1.5rem}.max-h-0{grid-template-rows:0fr}@media screen and (max-width: 767px){.shelf-dialog{width:100dvw;right:0;border-radius:0}}\n"] }]
27
27
  }] });
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGYtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21tb24vc2hlbGYtZGlhbG9nL3NoZWxmLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL3NoZWxmLWRpYWxvZy9zaGVsZi1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQWUsTUFBTSxlQUFlLENBQUM7QUFDakgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBVW5ELE1BQU0sT0FBTyxvQkFBb0I7SUFSakM7UUFTcUIsbUJBQWMsR0FBRyxLQUFLLEVBQW9CLENBQUM7UUFFM0MsVUFBSyxHQUFHLEtBQUssRUFBVSxDQUFDO1FBRXhCLFdBQU0sR0FBRyxLQUFLLENBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBRXJDLFdBQU0sR0FBRyxNQUFNLEVBQVEsQ0FBQztRQUV4QixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzQixlQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0tBUzlHO0lBUFEsTUFBTTtRQUNYLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQzs4R0FuQlUsb0JBQW9CO2tHQUFwQixvQkFBb0IsNGZDYmpDLCs1QkF3QkEsNm9CRGJZLGdCQUFnQixvSkFBRSxnQkFBZ0IsOEtBQUUsZ0JBQWdCOzsyRkFFbkQsb0JBQW9CO2tCQVJoQyxTQUFTOytCQUNFLGlCQUFpQixtQkFHVix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUCxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU3ZnSWNvbkNvbXBvbmVudCB9IGZyb20gJ2FuZ3VsYXItc3ZnLWljb24nO1xuaW1wb3J0IHsgSGVTdmdJY29uc01vZHVsZSB9IGZyb20gJy4uLy4uL3N2Zy1pY29ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLXNoZWxmLWRpYWxvZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaGVsZi1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zaGVsZi1kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtOZ1RlbXBsYXRlT3V0bGV0LCBTdmdJY29uQ29tcG9uZW50LCBIZVN2Z0ljb25zTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBTaGVsZkRpYWxvZ0NvbXBvbmVudCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBoZWFkZXJUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPGFueT4+KCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpdGxlID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBib3R0b20gPSBpbnB1dDxzdHJpbmcgfCBudW1iZXI+KCcwJyk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsb3NlZCA9IG91dHB1dDx2b2lkPigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93Q29udGVudCA9IHNpZ25hbCh0cnVlKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG9nZ2xlSWNvbiA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLnNob3dDb250ZW50KCkgPyAnZmFyLWNoZXZyb24tZG93bicgOiAnZmFyLWNoZXZyb24tdXAnKSk7XG5cbiAgcHVibGljIGV4cGFuZCgpIHtcbiAgICB0aGlzLnNob3dDb250ZW50LnNldCh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBjb2xsYXBzZSgpIHtcbiAgICB0aGlzLnNob3dDb250ZW50LnNldChmYWxzZSk7XG4gIH1cbn1cbiIsIjxkaXYgW3N0eWxlLmJvdHRvbV09XCJib3R0b20oKVwiIGNsYXNzPVwic2hlbGYtZGlhbG9nIHwgaXMtZml4ZWRcIj5cbiAgPGhlYWRlciBjbGFzcz1cInNoZWxmLWRpYWxvZ19faGVhZGVyIHwgcHgtNCBweS0yIGlzLWZsZXggaXMtcm91bmRlZCBoYXMtdGV4dC13aGl0ZSBpcy1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtZmxleC1ncm93LTFcIj5cbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVhZGVyVGVtcGxhdGUoKSA/PyBkZWZhdWx0VGVtcGxhdGVcIi8+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwic2hvd0NvbnRlbnQuc2V0KCFzaG93Q29udGVudCgpKVwiIGNsYXNzPVwibWwtMyBkaWFsb2ctYnRuIGhhcy10ZXh0LXdoaXRlXCI+XG4gICAgICA8c3ZnLWljb24gY2xhc3M9XCJpcy1zaXplLTRcIiBbbmFtZV09XCJ0b2dnbGVJY29uKClcIi8+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiY2xvc2VkLmVtaXQoKVwiIGNsYXNzPVwibWwtMyBkaWFsb2ctYnRuIGhhcy10ZXh0LXdoaXRlXCI+XG4gICAgICA8c3ZnLWljb24gY2xhc3M9XCJpcy1zaXplLTRcIiBuYW1lPVwiZmFyLWNsb3NlXCIvPlxuICAgIDwvYnV0dG9uPlxuICA8L2hlYWRlcj5cbiAgPGRpdiBbY2xhc3MubWF4LWgtMF09XCIhc2hvd0NvbnRlbnQoKVwiIGNsYXNzPVwic2hlbGYtZGlhbG9nX19jb250ZW50IHwgaGFzLWJhY2tncm91bmQtd2hpdGVcIj5cbiAgICA8ZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInAtNFwiPlxuICAgICAgICA8bmctY29udGVudC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0VGVtcGxhdGU+XG4gIHt7IHRpdGxlKCkgfX1cbjwvbmctdGVtcGxhdGU+XG4iXX0=
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGYtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21tb24vc2hlbGYtZGlhbG9nL3NoZWxmLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL3NoZWxmLWRpYWxvZy9zaGVsZi1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQWUsTUFBTSxlQUFlLENBQUM7QUFDakgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBVW5ELE1BQU0sT0FBTyxvQkFBb0I7SUFSakM7UUFTcUIsbUJBQWMsR0FBRyxLQUFLLEVBQW9CLENBQUM7UUFFM0MsVUFBSyxHQUFHLEtBQUssRUFBVSxDQUFDO1FBRXhCLFdBQU0sR0FBRyxLQUFLLENBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBRXJDLFdBQU0sR0FBRyxNQUFNLEVBQVEsQ0FBQztRQUV4QixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzQixlQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0tBUzlHO0lBUFEsTUFBTTtRQUNYLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQzs4R0FuQlUsb0JBQW9CO2tHQUFwQixvQkFBb0IsNGZDYmpDLCs1QkF3QkEsOG9CRGJZLGdCQUFnQixvSkFBRSxnQkFBZ0IsOEtBQUUsZ0JBQWdCOzsyRkFFbkQsb0JBQW9CO2tCQVJoQyxTQUFTOytCQUNFLGlCQUFpQixtQkFHVix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUCxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU3ZnSWNvbkNvbXBvbmVudCB9IGZyb20gJ2FuZ3VsYXItc3ZnLWljb24nO1xuaW1wb3J0IHsgSGVTdmdJY29uc01vZHVsZSB9IGZyb20gJy4uLy4uL3N2Zy1pY29ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLXNoZWxmLWRpYWxvZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaGVsZi1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zaGVsZi1kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtOZ1RlbXBsYXRlT3V0bGV0LCBTdmdJY29uQ29tcG9uZW50LCBIZVN2Z0ljb25zTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBTaGVsZkRpYWxvZ0NvbXBvbmVudCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBoZWFkZXJUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPGFueT4+KCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpdGxlID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBib3R0b20gPSBpbnB1dDxzdHJpbmcgfCBudW1iZXI+KCcwJyk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsb3NlZCA9IG91dHB1dDx2b2lkPigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93Q29udGVudCA9IHNpZ25hbCh0cnVlKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG9nZ2xlSWNvbiA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLnNob3dDb250ZW50KCkgPyAnZmFyLWNoZXZyb24tZG93bicgOiAnZmFyLWNoZXZyb24tdXAnKSk7XG5cbiAgcHVibGljIGV4cGFuZCgpIHtcbiAgICB0aGlzLnNob3dDb250ZW50LnNldCh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBjb2xsYXBzZSgpIHtcbiAgICB0aGlzLnNob3dDb250ZW50LnNldChmYWxzZSk7XG4gIH1cbn1cbiIsIjxkaXYgW3N0eWxlLmJvdHRvbV09XCJib3R0b20oKVwiIGNsYXNzPVwic2hlbGYtZGlhbG9nIHwgaXMtZml4ZWRcIj5cbiAgPGhlYWRlciBjbGFzcz1cInNoZWxmLWRpYWxvZ19faGVhZGVyIHwgcHgtNCBweS0yIGlzLWZsZXggaXMtcm91bmRlZCBoYXMtdGV4dC13aGl0ZSBpcy1hbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtZmxleC1ncm93LTFcIj5cbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVhZGVyVGVtcGxhdGUoKSA/PyBkZWZhdWx0VGVtcGxhdGVcIi8+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwic2hvd0NvbnRlbnQuc2V0KCFzaG93Q29udGVudCgpKVwiIGNsYXNzPVwibWwtMyBkaWFsb2ctYnRuIGhhcy10ZXh0LXdoaXRlXCI+XG4gICAgICA8c3ZnLWljb24gY2xhc3M9XCJpcy1zaXplLTRcIiBbbmFtZV09XCJ0b2dnbGVJY29uKClcIi8+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiY2xvc2VkLmVtaXQoKVwiIGNsYXNzPVwibWwtMyBkaWFsb2ctYnRuIGhhcy10ZXh0LXdoaXRlXCI+XG4gICAgICA8c3ZnLWljb24gY2xhc3M9XCJpcy1zaXplLTRcIiBuYW1lPVwiZmFyLWNsb3NlXCIvPlxuICAgIDwvYnV0dG9uPlxuICA8L2hlYWRlcj5cbiAgPGRpdiBbY2xhc3MubWF4LWgtMF09XCIhc2hvd0NvbnRlbnQoKVwiIGNsYXNzPVwic2hlbGYtZGlhbG9nX19jb250ZW50IHwgaGFzLWJhY2tncm91bmQtd2hpdGVcIj5cbiAgICA8ZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInAtNFwiPlxuICAgICAgICA8bmctY29udGVudC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0VGVtcGxhdGU+XG4gIHt7IHRpdGxlKCkgfX1cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -50,7 +50,7 @@ const viewIcon = {
50
50
  [View.timeline]: faListAlt
51
51
  };
52
52
  const nodeKeyViews = {
53
- [BlankNodesKey.animals]: [View.table],
53
+ [BlankNodesKey.animals]: [View.table, View.logs],
54
54
  [BlankNodesKey.emissions]: [View.table, View.chart, View.logs],
55
55
  [BlankNodesKey.inputs]: [View.table, View.chart, View.logs],
56
56
  [BlankNodesKey.products]: [View.table, View.chart, View.logs],
@@ -65,13 +65,17 @@ export var CycleNodesKeyGroup;
65
65
  CycleNodesKeyGroup["animals"] = "animals";
66
66
  CycleNodesKeyGroup["transformations"] = "transformations";
67
67
  })(CycleNodesKeyGroup || (CycleNodesKeyGroup = {}));
68
- const cycleGroupNode = (cycle) => (node) => ({
69
- ...node,
70
- name: cycle?.name,
71
- '@id': cycle?.['@id'] // set @id so we can fetch the logs from the Cycle
72
- });
73
- const cycleGroupNodes = (groupKey, cycle) => (cycle?.[groupKey] || []).map(cycleGroupNode(cycle));
74
- const filterGroupNodesByTerm = (groupKey, cycles, term) => cycles.map(cycle => cycleGroupNode(cycle)((cycle?.[groupKey] || []).filter(Boolean).find(node => node.term?.name === term?.name)));
68
+ const cycleGroupNode = (cycle) => (node) => node
69
+ ? {
70
+ ...node,
71
+ name: cycle?.name,
72
+ '@id': cycle?.['@id'] // set @id so we can fetch the logs from the Cycle
73
+ }
74
+ : null;
75
+ const cycleGroupNodes = (groupKey, cycle) => (cycle?.[groupKey] || []).map(cycleGroupNode(cycle)).filter(Boolean);
76
+ const filterGroupNodesByTerm = (groupKey, cycles, term) => cycles
77
+ .map(cycle => cycleGroupNode(cycle)((cycle?.[groupKey] || []).filter(Boolean).find(node => node.term?.name === term?.name)))
78
+ .filter(Boolean);
75
79
  export class CyclesNodesComponent {
76
80
  constructor() {
77
81
  this.nodeStoreService = inject(HeNodeStoreService);
@@ -136,7 +140,7 @@ export class CyclesNodesComponent {
136
140
  this.timelineValues = computed(() => filterValuesTimeline(this.selectedCycle()?.[this.selectedNodeKey()] || []));
137
141
  this.enableTimeline = computed(() => this.timelineValues().length > 0);
138
142
  this.isNodeKeyAllowed = computed(() => nodeKeyViews[this.firstNodeKey()].includes(this.selectedView()));
139
- this.groupedNodes = computed(() => cycleGroupNodes(this.nodeKeyGroup(), this.originalNodes()?.[0]));
143
+ this.groupedNodes = computed(() => this.originalNodes().flatMap(cycle => cycleGroupNodes(this.nodeKeyGroup(), cycle)));
140
144
  this.groupNodeTerms = computed(() => unique(this.groupedNodes().map(({ term }) => term)));
141
145
  this.isGroupNode = computed(() => this.nodeKeyGroup() && this.groupedNodes()?.length > 0);
142
146
  this.isEmission = computed(() => this.selectedNodeKey() === BlankNodesKey.emissions);
@@ -192,7 +196,7 @@ export class CyclesNodesComponent {
192
196
  return 'term' in cycle ? cycle.term : cycle;
193
197
  }
194
198
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: CyclesNodesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
195
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: CyclesNodesComponent, isStandalone: true, selector: "he-cycles-nodes", inputs: { dataState: { classPropertyName: "dataState", publicName: "dataState", isSignal: true, isRequired: false, transformFunction: null }, nodeKeys: { classPropertyName: "nodeKeys", publicName: "nodeKeys", isSignal: true, isRequired: true, transformFunction: null }, nodeKeyGroup: { classPropertyName: "nodeKeyGroup", publicName: "nodeKeyGroup", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (isGroupNode()) {\n <div class=\"tabs is-mb-1\">\n <ul>\n @for (term of groupNodeTerms(); track term) {\n <li [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n }\n </ul>\n </div>\n}\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\">\n <div class=\"column\">\n @if (hasData() && selectedView() === View.table) {\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n [disableTooltip]=\"showDownload\"\n placement=\"bottom\">\n <fa-icon [icon]=\"faDownload\" size=\"lg\"></fa-icon>\n </button>\n }\n </div>\n @if (hasData() && selectedView() === View.table) {\n <div class=\"column is-narrow\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n }\n @if (views()?.length > 1) {\n <div class=\"column is-narrow\">\n <div class=\"field has-addons\">\n @for (view of views(); track view) {\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView() === view\"\n (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n@if (isNodeKeyAllowed()) {\n @switch (selectedView()) {\n @case (View.table) {\n <div class=\"is-px-3 is-pb-3\">\n @if (hasData()) {\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n @if (dataKeys().length > 1) {\n <tr class=\"has-text-weight-bold\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @if (data()[dataKey]?.length) {\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n }\n }\n </tr>\n }\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span [innerHtml]=\"node.value.term.name | ellipsis: 30 | compound\"></span>\n </he-node-link>\n </th>\n }\n }\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"baseUrl + '/schema/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"node.value.term\"></he-terms-units-description>\n </th>\n }\n }\n </tr>\n </thead>\n <tbody>\n @for (cycle of cycles(); track trackById(cycleIndex, cycle); let cycleIndex = $index) {\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycleNode(cycle)\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycle\"></he-cycles-functional-unit-measure>\n </td>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node; let nodeLast = $last) {\n <td\n class=\"is-nowrap\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n @if (node.value.values[cycle['@id']]) {\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n [popoverContext]=\"{ data: node.value.values[cycle['@id']], cycle, key: dataKey }\">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\"></he-blank-node-state>\n </span>\n } @else {\n <span>-</span>\n }\n </td>\n }\n }\n </tr>\n }\n </tbody>\n </table>\n </he-data-table>\n <he-blank-node-state-notice\n [dataState]=\"dataState()\"\n [showDeleted]=\"firstNodeKey() === BlankNodesKey.emissions\"></he-blank-node-state-notice>\n } @else {\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n @if (showSwitchToRecalculated()) {\n <span>\n Switch to\n <code>recalculated</code>\n version.\n </span>\n }\n </div>\n }\n </div>\n }\n @case (View.chart) {\n @switch (firstNodeKey()) {\n @case (BlankNodesKey.inputs) {\n <he-cycles-result [cycles]=\"cycles()\"></he-cycles-result>\n }\n @case (BlankNodesKey.emissions) {\n <he-cycles-emissions-chart [cycles]=\"cycles()\"></he-cycles-emissions-chart>\n }\n }\n }\n @case (View.timeline) {\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline\n [recalculatedValues]=\"timelineValues()\"\n [dataState]=\"dataState()\"></he-cycles-nodes-timeline>\n <he-blank-node-state-notice [dataState]=\"dataState()\"></he-blank-node-state-notice>\n </div>\n }\n @case (View.logs) {\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n @if (nodeKeys().length > 1) {\n <div class=\"tabs is-mb-2\">\n <ul>\n @for (nodeKey of nodeKeys(); track nodeKey) {\n <li [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n }\n </ul>\n </div>\n }\n @if (selectedNode()) {\n <he-node-logs-models\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\"></he-node-logs-models>\n }\n }\n }\n}\n\n@if (showDownload) {\n <he-node-csv-export-confirm\n [nodes]=\"cycles()\"\n [filename]=\"csvFilename()\"\n [isUpload]=\"false\"\n [headerKeys]=\"headerKeys()\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n}\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\"></he-node-value-details>\n</ng-template>\n\n<ng-template #selectCycle>\n @if (cycles().length > 1) {\n <div class=\"field has-addons is-py-2 is-px-3\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n @for (value of cycles(); track value; let cycleIndex = $index) {\n <option [value]=\"cycleIndex\">{{ cycleIndex + 1 }}. {{ defaultLabel(value) }}</option>\n }\n </select>\n </div>\n </div>\n </div>\n }\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"], dependencies: [{ kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "component", type: SearchExtendComponent, selector: "he-search-extend", inputs: ["value", "disabled", "placeholder", "class"], outputs: ["search"] }, { kind: "component", type: DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "component", type: NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "component", type: TermsUnitsDescriptionComponent, selector: "he-terms-units-description", inputs: ["term", "iconTemplate"] }, { kind: "component", type: CyclesFunctionalUnitMeasureComponent, selector: "he-cycles-functional-unit-measure", inputs: ["cycle"] }, { kind: "directive", type: NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["dataState", "nodeType", "dataKey", "key", "node", "state", "linkClass"] }, { kind: "component", type: BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showDeleted"] }, { kind: "component", type: CyclesResultComponent, selector: "he-cycles-result", inputs: ["cycles"] }, { kind: "component", type: CyclesEmissionsChartComponent, selector: "he-cycles-emissions-chart", inputs: ["cycles"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CyclesNodesTimelineComponent, selector: "he-cycles-nodes-timeline", inputs: ["recalculatedValues", "dataState"] }, { kind: "component", type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: ["node", "nodeKey", "originalValues", "recalculatedValues", "terms", "filterTermTypes", "filterTermTypesLabel", "logsKey", "noDataMessage"] }, { kind: "component", type: NodeCsvExportConfirmComponent, selector: "he-node-csv-export-confirm", inputs: ["nodes", "filename", "headerKeys", "extension", "isUpload"], outputs: ["closed"] }, { kind: "component", type: NodeValueDetailsComponent, selector: "he-node-value-details", inputs: ["data", "nodeType", "dataState", "dataKey"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "pipe", type: CompoundPipe, name: "compound" }, { kind: "pipe", type: DefaultPipe, name: "default" }, { kind: "pipe", type: EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: KeyToLabelPipe, name: "keyToLabel" }, { kind: "pipe", type: PrecisionPipe, name: "precision" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
199
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: CyclesNodesComponent, isStandalone: true, selector: "he-cycles-nodes", inputs: { dataState: { classPropertyName: "dataState", publicName: "dataState", isSignal: true, isRequired: false, transformFunction: null }, nodeKeys: { classPropertyName: "nodeKeys", publicName: "nodeKeys", isSignal: true, isRequired: true, transformFunction: null }, nodeKeyGroup: { classPropertyName: "nodeKeyGroup", publicName: "nodeKeyGroup", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (isGroupNode()) {\n <div class=\"tabs is-mb-1\">\n <ul>\n @for (term of groupNodeTerms(); track term) {\n <li [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n }\n </ul>\n </div>\n}\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\">\n <div class=\"column\">\n @if (hasData() && selectedView() === View.table) {\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n [disableTooltip]=\"showDownload\"\n placement=\"bottom\">\n <fa-icon [icon]=\"faDownload\" size=\"lg\"></fa-icon>\n </button>\n }\n </div>\n @if (hasData() && selectedView() === View.table) {\n <div class=\"column is-narrow\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n }\n @if (views()?.length > 1) {\n <div class=\"column is-narrow\">\n <div class=\"field has-addons\">\n @for (view of views(); track view) {\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView() === view\"\n (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n@if (isNodeKeyAllowed()) {\n @switch (selectedView()) {\n @case (View.table) {\n <div class=\"is-px-3 is-pb-3\">\n @if (hasData()) {\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n @if (dataKeys().length > 1) {\n <tr class=\"has-text-weight-bold\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @if (data()[dataKey]?.length) {\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n }\n }\n </tr>\n }\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span\n [innerHtml]=\"\n node.value.term.name | ellipsis: 30 | compound: node.value.term.termType\n \"></span>\n </he-node-link>\n </th>\n }\n }\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"baseUrl + '/schema/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound: node.value.term.termType\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"node.value.term\"></he-terms-units-description>\n </th>\n }\n }\n </tr>\n </thead>\n <tbody>\n @for (cycle of cycles(); track trackById(cycleIndex, cycle); let cycleIndex = $index) {\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycleNode(cycle)\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycle\"></he-cycles-functional-unit-measure>\n </td>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node; let nodeLast = $last) {\n <td\n class=\"is-nowrap\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n @if (node.value.values[cycle['@id']]) {\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n [popoverContext]=\"{ data: node.value.values[cycle['@id']], cycle, key: dataKey }\">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\"></he-blank-node-state>\n </span>\n } @else {\n <span>-</span>\n }\n </td>\n }\n }\n </tr>\n }\n </tbody>\n </table>\n </he-data-table>\n <he-blank-node-state-notice\n [dataState]=\"dataState()\"\n [showDeleted]=\"firstNodeKey() === BlankNodesKey.emissions\"></he-blank-node-state-notice>\n } @else {\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n @if (showSwitchToRecalculated()) {\n <span>\n Switch to\n <code>recalculated</code>\n version.\n </span>\n }\n </div>\n }\n </div>\n }\n @case (View.chart) {\n @switch (firstNodeKey()) {\n @case (BlankNodesKey.inputs) {\n <he-cycles-result [cycles]=\"cycles()\"></he-cycles-result>\n }\n @case (BlankNodesKey.emissions) {\n <he-cycles-emissions-chart [cycles]=\"cycles()\"></he-cycles-emissions-chart>\n }\n }\n }\n @case (View.timeline) {\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline\n [recalculatedValues]=\"timelineValues()\"\n [dataState]=\"dataState()\"></he-cycles-nodes-timeline>\n <he-blank-node-state-notice [dataState]=\"dataState()\"></he-blank-node-state-notice>\n </div>\n }\n @case (View.logs) {\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n @if (nodeKeys().length > 1) {\n <div class=\"tabs is-mb-2\">\n <ul>\n @for (nodeKey of nodeKeys(); track nodeKey) {\n <li [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n }\n </ul>\n </div>\n }\n @if (selectedNode()) {\n <he-node-logs-models\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\"></he-node-logs-models>\n }\n }\n }\n}\n\n@if (showDownload) {\n <he-node-csv-export-confirm\n [nodes]=\"cycles()\"\n [filename]=\"csvFilename()\"\n [isUpload]=\"false\"\n [headerKeys]=\"headerKeys()\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n}\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\"></he-node-value-details>\n</ng-template>\n\n<ng-template #selectCycle>\n @if (cycles().length > 1) {\n <div class=\"field has-addons is-py-2 is-px-3\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n @for (value of cycles(); track value; let cycleIndex = $index) {\n <option [value]=\"cycleIndex\">{{ cycleIndex + 1 }}. {{ defaultLabel(value) }}</option>\n }\n </select>\n </div>\n </div>\n </div>\n }\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"], dependencies: [{ kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "component", type: SearchExtendComponent, selector: "he-search-extend", inputs: ["value", "disabled", "placeholder", "class"], outputs: ["search"] }, { kind: "component", type: DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "component", type: NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "component", type: TermsUnitsDescriptionComponent, selector: "he-terms-units-description", inputs: ["term", "iconTemplate"] }, { kind: "component", type: CyclesFunctionalUnitMeasureComponent, selector: "he-cycles-functional-unit-measure", inputs: ["cycle"] }, { kind: "directive", type: NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["dataState", "nodeType", "dataKey", "key", "node", "state", "linkClass"] }, { kind: "component", type: BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showDeleted"] }, { kind: "component", type: CyclesResultComponent, selector: "he-cycles-result", inputs: ["cycles"] }, { kind: "component", type: CyclesEmissionsChartComponent, selector: "he-cycles-emissions-chart", inputs: ["cycles"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CyclesNodesTimelineComponent, selector: "he-cycles-nodes-timeline", inputs: ["recalculatedValues", "dataState"] }, { kind: "component", type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: ["node", "nodeKey", "originalValues", "recalculatedValues", "terms", "filterTermTypes", "filterTermTypesLabel", "logsKey", "noDataMessage"] }, { kind: "component", type: NodeCsvExportConfirmComponent, selector: "he-node-csv-export-confirm", inputs: ["nodes", "filename", "headerKeys", "extension", "isUpload"], outputs: ["closed"] }, { kind: "component", type: NodeValueDetailsComponent, selector: "he-node-value-details", inputs: ["data", "nodeType", "dataState", "dataKey"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "pipe", type: CompoundPipe, name: "compound" }, { kind: "pipe", type: DefaultPipe, name: "default" }, { kind: "pipe", type: EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: KeyToLabelPipe, name: "keyToLabel" }, { kind: "pipe", type: PrecisionPipe, name: "precision" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
196
200
  }
197
201
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: CyclesNodesComponent, decorators: [{
198
202
  type: Component,
@@ -220,6 +224,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImpor
220
224
  EllipsisPipe,
221
225
  KeyToLabelPipe,
222
226
  PrecisionPipe
223
- ], template: "@if (isGroupNode()) {\n <div class=\"tabs is-mb-1\">\n <ul>\n @for (term of groupNodeTerms(); track term) {\n <li [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n }\n </ul>\n </div>\n}\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\">\n <div class=\"column\">\n @if (hasData() && selectedView() === View.table) {\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n [disableTooltip]=\"showDownload\"\n placement=\"bottom\">\n <fa-icon [icon]=\"faDownload\" size=\"lg\"></fa-icon>\n </button>\n }\n </div>\n @if (hasData() && selectedView() === View.table) {\n <div class=\"column is-narrow\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n }\n @if (views()?.length > 1) {\n <div class=\"column is-narrow\">\n <div class=\"field has-addons\">\n @for (view of views(); track view) {\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView() === view\"\n (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n@if (isNodeKeyAllowed()) {\n @switch (selectedView()) {\n @case (View.table) {\n <div class=\"is-px-3 is-pb-3\">\n @if (hasData()) {\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n @if (dataKeys().length > 1) {\n <tr class=\"has-text-weight-bold\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @if (data()[dataKey]?.length) {\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n }\n }\n </tr>\n }\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span [innerHtml]=\"node.value.term.name | ellipsis: 30 | compound\"></span>\n </he-node-link>\n </th>\n }\n }\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"baseUrl + '/schema/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"node.value.term\"></he-terms-units-description>\n </th>\n }\n }\n </tr>\n </thead>\n <tbody>\n @for (cycle of cycles(); track trackById(cycleIndex, cycle); let cycleIndex = $index) {\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycleNode(cycle)\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycle\"></he-cycles-functional-unit-measure>\n </td>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node; let nodeLast = $last) {\n <td\n class=\"is-nowrap\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n @if (node.value.values[cycle['@id']]) {\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n [popoverContext]=\"{ data: node.value.values[cycle['@id']], cycle, key: dataKey }\">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\"></he-blank-node-state>\n </span>\n } @else {\n <span>-</span>\n }\n </td>\n }\n }\n </tr>\n }\n </tbody>\n </table>\n </he-data-table>\n <he-blank-node-state-notice\n [dataState]=\"dataState()\"\n [showDeleted]=\"firstNodeKey() === BlankNodesKey.emissions\"></he-blank-node-state-notice>\n } @else {\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n @if (showSwitchToRecalculated()) {\n <span>\n Switch to\n <code>recalculated</code>\n version.\n </span>\n }\n </div>\n }\n </div>\n }\n @case (View.chart) {\n @switch (firstNodeKey()) {\n @case (BlankNodesKey.inputs) {\n <he-cycles-result [cycles]=\"cycles()\"></he-cycles-result>\n }\n @case (BlankNodesKey.emissions) {\n <he-cycles-emissions-chart [cycles]=\"cycles()\"></he-cycles-emissions-chart>\n }\n }\n }\n @case (View.timeline) {\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline\n [recalculatedValues]=\"timelineValues()\"\n [dataState]=\"dataState()\"></he-cycles-nodes-timeline>\n <he-blank-node-state-notice [dataState]=\"dataState()\"></he-blank-node-state-notice>\n </div>\n }\n @case (View.logs) {\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n @if (nodeKeys().length > 1) {\n <div class=\"tabs is-mb-2\">\n <ul>\n @for (nodeKey of nodeKeys(); track nodeKey) {\n <li [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n }\n </ul>\n </div>\n }\n @if (selectedNode()) {\n <he-node-logs-models\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\"></he-node-logs-models>\n }\n }\n }\n}\n\n@if (showDownload) {\n <he-node-csv-export-confirm\n [nodes]=\"cycles()\"\n [filename]=\"csvFilename()\"\n [isUpload]=\"false\"\n [headerKeys]=\"headerKeys()\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n}\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\"></he-node-value-details>\n</ng-template>\n\n<ng-template #selectCycle>\n @if (cycles().length > 1) {\n <div class=\"field has-addons is-py-2 is-px-3\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n @for (value of cycles(); track value; let cycleIndex = $index) {\n <option [value]=\"cycleIndex\">{{ cycleIndex + 1 }}. {{ defaultLabel(value) }}</option>\n }\n </select>\n </div>\n </div>\n </div>\n }\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"] }]
227
+ ], template: "@if (isGroupNode()) {\n <div class=\"tabs is-mb-1\">\n <ul>\n @for (term of groupNodeTerms(); track term) {\n <li [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n }\n </ul>\n </div>\n}\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\">\n <div class=\"column\">\n @if (hasData() && selectedView() === View.table) {\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n [disableTooltip]=\"showDownload\"\n placement=\"bottom\">\n <fa-icon [icon]=\"faDownload\" size=\"lg\"></fa-icon>\n </button>\n }\n </div>\n @if (hasData() && selectedView() === View.table) {\n <div class=\"column is-narrow\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n }\n @if (views()?.length > 1) {\n <div class=\"column is-narrow\">\n <div class=\"field has-addons\">\n @for (view of views(); track view) {\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView() === view\"\n (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n@if (isNodeKeyAllowed()) {\n @switch (selectedView()) {\n @case (View.table) {\n <div class=\"is-px-3 is-pb-3\">\n @if (hasData()) {\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n @if (dataKeys().length > 1) {\n <tr class=\"has-text-weight-bold\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @if (data()[dataKey]?.length) {\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n }\n }\n </tr>\n }\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span\n [innerHtml]=\"\n node.value.term.name | ellipsis: 30 | compound: node.value.term.termType\n \"></span>\n </he-node-link>\n </th>\n }\n }\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"baseUrl + '/schema/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound: node.value.term.termType\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"node.value.term\"></he-terms-units-description>\n </th>\n }\n }\n </tr>\n </thead>\n <tbody>\n @for (cycle of cycles(); track trackById(cycleIndex, cycle); let cycleIndex = $index) {\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycleNode(cycle)\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycle\"></he-cycles-functional-unit-measure>\n </td>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node; let nodeLast = $last) {\n <td\n class=\"is-nowrap\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n @if (node.value.values[cycle['@id']]) {\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n [popoverContext]=\"{ data: node.value.values[cycle['@id']], cycle, key: dataKey }\">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\"></he-blank-node-state>\n </span>\n } @else {\n <span>-</span>\n }\n </td>\n }\n }\n </tr>\n }\n </tbody>\n </table>\n </he-data-table>\n <he-blank-node-state-notice\n [dataState]=\"dataState()\"\n [showDeleted]=\"firstNodeKey() === BlankNodesKey.emissions\"></he-blank-node-state-notice>\n } @else {\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n @if (showSwitchToRecalculated()) {\n <span>\n Switch to\n <code>recalculated</code>\n version.\n </span>\n }\n </div>\n }\n </div>\n }\n @case (View.chart) {\n @switch (firstNodeKey()) {\n @case (BlankNodesKey.inputs) {\n <he-cycles-result [cycles]=\"cycles()\"></he-cycles-result>\n }\n @case (BlankNodesKey.emissions) {\n <he-cycles-emissions-chart [cycles]=\"cycles()\"></he-cycles-emissions-chart>\n }\n }\n }\n @case (View.timeline) {\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline\n [recalculatedValues]=\"timelineValues()\"\n [dataState]=\"dataState()\"></he-cycles-nodes-timeline>\n <he-blank-node-state-notice [dataState]=\"dataState()\"></he-blank-node-state-notice>\n </div>\n }\n @case (View.logs) {\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n @if (nodeKeys().length > 1) {\n <div class=\"tabs is-mb-2\">\n <ul>\n @for (nodeKey of nodeKeys(); track nodeKey) {\n <li [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n }\n </ul>\n </div>\n }\n @if (selectedNode()) {\n <he-node-logs-models\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\"></he-node-logs-models>\n }\n }\n }\n}\n\n@if (showDownload) {\n <he-node-csv-export-confirm\n [nodes]=\"cycles()\"\n [filename]=\"csvFilename()\"\n [isUpload]=\"false\"\n [headerKeys]=\"headerKeys()\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n}\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\"></he-node-value-details>\n</ng-template>\n\n<ng-template #selectCycle>\n @if (cycles().length > 1) {\n <div class=\"field has-addons is-py-2 is-px-3\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n @for (value of cycles(); track value; let cycleIndex = $index) {\n <option [value]=\"cycleIndex\">{{ cycleIndex + 1 }}. {{ defaultLabel(value) }}</option>\n }\n </select>\n </div>\n </div>\n </div>\n }\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"] }]
224
228
  }], ctorParameters: () => [] });
225
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ljbGVzLW5vZGVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jeWNsZXMvY3ljbGVzLW5vZGVzL2N5Y2xlcy1ub2Rlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvY3ljbGVzL2N5Y2xlcy1ub2Rlcy9jeWNsZXMtbm9kZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFJTCxRQUFRLEVBSVIsWUFBWSxFQUlaLGFBQWEsRUFFZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sT0FBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFn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RkFHSixvQkFBb0I7a0JBaENoQyxTQUFTOytCQUNFLGlCQUFpQixtQkFHVix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxVQUFVO3dCQUNWLGVBQWU7d0JBQ2YscUJBQXFCO3dCQUNyQixrQkFBa0I7d0JBQ2xCLGlCQUFpQjt3QkFDakIsOEJBQThCO3dCQUM5QixvQ0FBb0M7d0JBQ3BDLFVBQVU7d0JBQ1YsdUJBQXVCO3dCQUN2Qiw2QkFBNkI7d0JBQzdCLHFCQUFxQjt3QkFDckIsNkJBQTZCO3dCQUM3QixnQkFBZ0I7d0JBQ2hCLDRCQUE0Qjt3QkFDNUIsdUJBQXVCO3dCQUN2Qiw2QkFBNkI7d0JBQzdCLHlCQUF5Qjt3QkFDekIsV0FBVzt3QkFDWCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsWUFBWTt3QkFDWixjQUFjO3dCQUNkLGFBQWE7cUJBQ2QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEYXRhU3RhdGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2FwaSc7XG5pbXBvcnQge1xuICBJQ3ljbGVKU09OTEQsXG4gIElucHV0IGFzIEhlc3RpYUlucHV0LFxuICBQcm9kdWN0LFxuICBOb2RlVHlwZSxcbiAgQW5pbWFsLFxuICBFbWlzc2lvbixcbiAgUHJhY3RpY2UsXG4gIFRlcm1UZXJtVHlwZSxcbiAgRW1pc3Npb25NZXRob2RUaWVyLFxuICBUZXJtLFxuICBUcmFuc2Zvcm1hdGlvbixcbiAgQmxhbmtOb2Rlc0tleSxcbiAgYmxhbmtOb2Rlc1R5cGVcbn0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEnO1xuaW1wb3J0IG9yZGVyQnkgZnJvbSAnbG9kYXNoLm9yZGVyYnknO1xuaW1wb3J0IHsgcHJvcGVydHlWYWx1ZSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvdXRpbHMvZGlzdC90ZXJtJztcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvdXRpbHMnO1xuaW1wb3J0IHsgRmFJY29uQ29tcG9uZW50IH0gZnJvbSAnQGZvcnRhd2Vzb21lL2FuZ3VsYXItZm9udGF3ZXNvbWUnO1xuaW1wb3J0IHsgTmdiVG9vbHRpcCwgTmdiUG9wb3ZlciB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IEljb25EZWZpbml0aW9uIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZvbnRhd2Vzb21lLXN2Zy1jb3JlJztcblxuaW1wb3J0IHsgZmlsdGVyQmxhbmtOb2RlLCBtZXRob2RUaWVyT3JkZXIgfSBmcm9tICcuLi8uLi9jb21tb24vbm9kZS11dGlscyc7XG5pbXBvcnQgeyBsb2dzS2V5IH0gZnJvbSAnLi4vY3ljbGVzLm1vZGVsJztcbmltcG9ydCB7IEhlTm9kZVN0b3JlU2VydmljZSB9IGZyb20gJy4uLy4uL25vZGUvbm9kZS1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IGdyb3VwTm9kZXNCeVRlcm0sIElHcm91cGVkS2V5cywgZ3JvdXBwZWRLZXlzIH0gZnJvbSAnLi4vLi4vY29tbW9uL25vZGUtdXRpbHMnO1xuaW1wb3J0IHsgYmFzZVVybCwgZGVmYXVsdExhYmVsIH0gZnJvbSAnLi4vLi4vY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IFByZWNpc2lvblBpcGUgfSBmcm9tICcuLi8uLi9jb21tb24vcHJlY2lzaW9uLnBpcGUnO1xuaW1wb3J0IHsgS2V5VG9MYWJlbFBpcGUgfSBmcm9tICcuLi8uLi9jb21tb24va2V5LXRvLWxhYmVsLnBpcGUnO1xuaW1wb3J0IHsgRWxsaXBzaXNQaXBlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2VsbGlwc2lzLnBpcGUnO1xuaW1wb3J0IHsgRGVmYXVsdFBpcGUgfSBmcm9tICcuLi8uLi9jb21tb24vZGVmYXVsdC5waXBlJztcbmltcG9ydCB7IENvbXBvdW5kUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9jb21wb3VuZC5waXBlJztcbmltcG9ydCB7IE5vZGVWYWx1ZURldGFpbHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9ub2RlL25vZGUtdmFsdWUtZGV0YWlscy9ub2RlLXZhbHVlLWRldGFpbHMuY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVDc3ZFeHBvcnRDb25maXJtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbm9kZS9ub2RlLWNzdi1leHBvcnQtY29uZmlybS9ub2RlLWNzdi1leHBvcnQtY29uZmlybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZUxvZ3NNb2RlbHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9ub2RlL25vZGUtbG9ncy1tb2RlbHMvbm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3ljbGVzTm9kZXNUaW1lbGluZUNvbXBvbmVudCB9IGZyb20gJy4uL2N5Y2xlcy1ub2Rlcy10aW1lbGluZS9jeWNsZXMtbm9kZXMtdGltZWxpbmUuY29tcG9uZW50JztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ3ljbGVzRW1pc3Npb25zQ2hhcnRDb21wb25lbnQgfSBmcm9tICcuLi9jeWNsZXMtZW1pc3Npb25zLWNoYXJ0L2N5Y2xlcy1lbWlzc2lvbnMtY2hhcnQuY29tcG9uZW50JztcbmltcG9ydCB7IEN5Y2xlc1Jlc3VsdENvbXBvbmVudCB9IGZyb20gJy4uL2N5Y2xlcy1yZXN1bHQvY3ljbGVzLXJlc3VsdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmxhbmtOb2RlU3RhdGVOb3RpY2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2UvYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2UuY29tcG9uZW50JztcbmltcG9ydCB7IEJsYW5rTm9kZVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tbW9uL2JsYW5rLW5vZGUtc3RhdGUvYmxhbmstbm9kZS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3ljbGVzRnVuY3Rpb25hbFVuaXRNZWFzdXJlQ29tcG9uZW50IH0gZnJvbSAnLi4vY3ljbGVzLWZ1bmN0aW9uYWwtdW5pdC1tZWFzdXJlL2N5Y2xlcy1mdW5jdGlvbmFsLXVuaXQtbWVhc3VyZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGVybXNVbml0c0Rlc2NyaXB0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vdGVybXMvdGVybXMtdW5pdHMtZGVzY3JpcHRpb24vdGVybXMtdW5pdHMtZGVzY3JpcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbm9kZS9ub2RlLWxpbmsvbm9kZS1saW5rLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRhVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hFeHRlbmRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vc2VhcmNoLWV4dGVuZC9zZWFyY2gtZXh0ZW5kLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBmYUNhbGN1bGF0b3IsIGZhQ2hhcnRCYXIsIGZhRG93bmxvYWQsIGZhTGlzdCwgZmFMaXN0QWx0IH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJztcblxuZW51bSBWaWV3IHtcbiAgdGFibGUgPSAnVGFibGUgdmlldycsXG4gIGNoYXJ0ID0gJ0NoYXJ0IHZpZXcnLFxuICB0aW1lbGluZSA9ICdPcGVyYXRpb25zIFRpbWVsaW5lJyxcbiAgbG9ncyA9ICdSZWNhbGN1bGF0aW9ucyBsb2dzJ1xufVxuXG5jb25zdCB0aW1lbGluZVRlcm1UeXBlID0gW1Rlcm1UZXJtVHlwZS5vcGVyYXRpb25dO1xuXG5pbnRlcmZhY2UgSUN5Y2xlQ29uZmlnIHtcbiAgbm9kZUtleTogQmxhbmtOb2Rlc0tleTtcbn1cblxuaW50ZXJmYWNlIElDeWNsZUNvbmZpZ0FuaW1hbCBleHRlbmRzIElDeWNsZUNvbmZpZyB7XG4gIG5vZGVLZXk6IEJsYW5rTm9kZXNLZXkuYW5pbWFscztcbn1cblxuaW50ZXJmYWNlIElDeWNsZUNvbmZpZ0VtaXNzaW9uIGV4dGVuZHMgSUN5Y2xlQ29uZmlnIHtcbiAgbm9kZUtleTogQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnM7XG59XG5cbmludGVyZmFjZSBJQ3ljbGVDb25maWdJbnB1dCBleHRlbmRzIElDeWNsZUNvbmZpZyB7XG4gIG5vZGVLZXk6IEJsYW5rTm9kZXNLZXkuaW5wdXRzO1xufVxuXG5pbnRlcmZhY2UgSUN5Y2xlQ29uZmlnUHJhY3RpY2UgZXh0ZW5kcyBJQ3ljbGVDb25maWcge1xuICBub2RlS2V5OiBCbGFua05vZGVzS2V5LnByYWN0aWNlcztcbn1cblxuY29uc3Qgdmlld0ljb246IHtcbiAgW3ZpZXcgaW4gVmlld106IEljb25EZWZpbml0aW9uO1xufSA9IHtcbiAgW1ZpZXcuY2hhcnRdOiBmYUNoYXJ0QmFyLFxuICBbVmlldy5sb2dzXTogZmFDYWxjdWxhdG9yLFxuICBbVmlldy50YWJsZV06IGZhTGlzdCxcbiAgW1ZpZXcudGltZWxpbmVdOiBmYUxpc3RBbHRcbn07XG5cbmNvbnN0IG5vZGVLZXlWaWV3czoge1xuICBbdHlwZSBpbiBCbGFua05vZGVzS2V5XT86IFZpZXdbXTtcbn0gPSB7XG4gIFtCbGFua05vZGVzS2V5LmFuaW1hbHNdOiBbVmlldy50YWJsZV0sXG4gIFtCbGFua05vZGVzS2V5LmVtaXNzaW9uc106IFtWaWV3LnRhYmxlLCBWaWV3LmNoYXJ0LCBWaWV3LmxvZ3NdLFxuICBbQmxhbmtOb2Rlc0tleS5pbnB1dHNdOiBbVmlldy50YWJsZSwgVmlldy5jaGFydCwgVmlldy5sb2dzXSxcbiAgW0JsYW5rTm9kZXNLZXkucHJvZHVjdHNdOiBbVmlldy50YWJsZSwgVmlldy5jaGFydCwgVmlldy5sb2dzXSxcbiAgW0JsYW5rTm9kZXNLZXkucHJhY3RpY2VzXTogW1ZpZXcudGFibGUsIFZpZXcudGltZWxpbmUsIFZpZXcubG9nc11cbn07XG5cbmNvbnN0IG5vZGVLZXlGaWx0ZXJUZXJtVHlwZXM6IHtcbiAgW3R5cGUgaW4gQmxhbmtOb2Rlc0tleV0/OiBUZXJtVGVybVR5cGVbXTtcbn0gPSB7XG4gIFtCbGFua05vZGVzS2V5LmVtaXNzaW9uc106IFtUZXJtVGVybVR5cGUuZW1pc3Npb25dXG59O1xuXG5jb25zdCBmaWx0ZXJWYWx1ZXNUaW1lbGluZSA9ICh2YWx1ZXM6IGJsYW5rTm9kZXNUeXBlW10pID0+XG4gIHZhbHVlcy5maWx0ZXIocCA9PiB0aW1lbGluZVRlcm1UeXBlLmluY2x1ZGVzKHAudGVybT8udGVybVR5cGUpKTtcblxudHlwZSBncm91cGVkRW1pc3Npb25zID0ge1xuICBbbWV0aG9kVGllciBpbiBFbWlzc2lvbk1ldGhvZFRpZXJdOiBJR3JvdXBlZEtleXM8RW1pc3Npb24+W107XG59O1xuXG5leHBvcnQgZW51bSBDeWNsZU5vZGVzS2V5R3JvdXAge1xuICBhbmltYWxzID0gJ2FuaW1hbHMnLFxuICB0cmFuc2Zvcm1hdGlvbnMgPSAndHJhbnNmb3JtYXRpb25zJ1xufVxuXG50eXBlIGdyb3VwZWROb2RlID0gQW5pbWFsIHwgVHJhbnNmb3JtYXRpb247XG5cbmNvbnN0IGN5Y2xlR3JvdXBOb2RlID1cbiAgKGN5Y2xlPzogSUN5Y2xlSlNPTkxEKSA9PlxuICAobm9kZT86IGdyb3VwZWROb2RlKTogZ3JvdXBlZE5vZGUgJiB7IG5hbWU6IHN0cmluZzsgJ0BpZCc6IHN0cmluZyB9ID0+ICh7XG4gICAgLi4ubm9kZSxcbiAgICBuYW1lOiBjeWNsZT8ubmFtZSxcbiAgICAnQGlkJzogY3ljbGU/LlsnQGlkJ10gLy8gc2V0IEBpZCBzbyB3ZSBjYW4gZmV0Y2ggdGhlIGxvZ3MgZnJvbSB0aGUgQ3ljbGVcbiAgfSk7XG5cbmNvbnN0IGN5Y2xlR3JvdXBOb2RlcyA9IChncm91cEtleTogQ3ljbGVOb2Rlc0tleUdyb3VwLCBjeWNsZT86IElDeWNsZUpTT05MRCk6IGdyb3VwZWROb2RlW10gPT5cbiAgKGN5Y2xlPy5bZ3JvdXBLZXldIHx8IFtdKS5tYXAoY3ljbGVHcm91cE5vZGUoY3ljbGUpKTtcblxuY29uc3QgZmlsdGVyR3JvdXBOb2Rlc0J5VGVybSA9IChncm91cEtleTogQ3ljbGVOb2Rlc0tleUdyb3VwLCBjeWNsZXM6IElDeWNsZUpTT05MRFtdLCB0ZXJtPzogVGVybSk6IGdyb3VwZWROb2RlW10gPT5cbiAgY3ljbGVzLm1hcChjeWNsZSA9PlxuICAgIGN5Y2xlR3JvdXBOb2RlKGN5Y2xlKShcbiAgICAgICgoY3ljbGU/Lltncm91cEtleV0gYXMgZ3JvdXBlZE5vZGVbXSkgfHwgW10pLmZpbHRlcihCb29sZWFuKS5maW5kKG5vZGUgPT4gbm9kZS50ZXJtPy5uYW1lID09PSB0ZXJtPy5uYW1lKVxuICAgIClcbiAgKTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGUtY3ljbGVzLW5vZGVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N5Y2xlcy1ub2Rlcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2N5Y2xlcy1ub2Rlcy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE5nYlRvb2x0aXAsXG4gICAgRmFJY29uQ29tcG9uZW50LFxuICAgIFNlYXJjaEV4dGVuZENvbXBvbmVudCxcbiAgICBEYXRhVGFibGVDb21wb25lbnQsXG4gICAgTm9kZUxpbmtDb21wb25lbnQsXG4gICAgVGVybXNVbml0c0Rlc2NyaXB0aW9uQ29tcG9uZW50LFxuICAgIEN5Y2xlc0Z1bmN0aW9uYWxVbml0TWVhc3VyZUNvbXBvbmVudCxcbiAgICBOZ2JQb3BvdmVyLFxuICAgIEJsYW5rTm9kZVN0YXRlQ29tcG9uZW50LFxuICAgIEJsYW5rTm9kZVN0YXRlTm90aWNlQ29tcG9uZW50LFxuICAgIEN5Y2xlc1Jlc3VsdENvbXBvbmVudCxcbiAgICBDeWNsZXNFbWlzc2lvbnNDaGFydENvbXBvbmVudCxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIEN5Y2xlc05vZGVzVGltZWxpbmVDb21wb25lbnQsXG4gICAgTm9kZUxvZ3NNb2RlbHNDb21wb25lbnQsXG4gICAgTm9kZUNzdkV4cG9ydENvbmZpcm1Db21wb25lbnQsXG4gICAgTm9kZVZhbHVlRGV0YWlsc0NvbXBvbmVudCxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBDb21wb3VuZFBpcGUsXG4gICAgRGVmYXVsdFBpcGUsXG4gICAgRWxsaXBzaXNQaXBlLFxuICAgIEtleVRvTGFiZWxQaXBlLFxuICAgIFByZWNpc2lvblBpcGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBDeWNsZXNOb2Rlc0NvbXBvbmVudCB7XG4gIHByaXZhdGUgbm9kZVN0b3JlU2VydmljZSA9IGluamVjdChIZU5vZGVTdG9yZVNlcnZpY2UpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBmYURvd25sb2FkID0gZmFEb3dubG9hZDtcblxuICBwcm90ZWN0ZWQgZGF0YVN0YXRlID0gaW5wdXQoRGF0YVN0YXRlLm9yaWdpbmFsKTtcbiAgcHJvdGVjdGVkIG5vZGVLZXlzID0gaW5wdXQucmVxdWlyZWQ8QmxhbmtOb2Rlc0tleVtdPigpO1xuICBwcm90ZWN0ZWQgbm9kZUtleUdyb3VwID0gaW5wdXQ8Q3ljbGVOb2Rlc0tleUdyb3VwPigpO1xuXG4gIHByb3RlY3RlZCBCbGFua05vZGVzS2V5ID0gQmxhbmtOb2Rlc0tleTtcbiAgcHJvdGVjdGVkIGZpcnN0Tm9kZUtleSA9IGNvbXB1dGVkKCgpID0+IHRoaXMubm9kZUtleXMoKT8uWzBdKTtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkTm9kZUtleSA9IHNpZ25hbCh1bmRlZmluZWQgYXMgQmxhbmtOb2Rlc0tleSk7XG5cbiAgcHJvdGVjdGVkIHNlbGVjdGVkR3JvdXBUZXJtID0gc2lnbmFsKHVuZGVmaW5lZCBhcyBUZXJtKTtcblxuICBwcm90ZWN0ZWQgYmFzZVVybCA9IGJhc2VVcmwoKTtcbiAgcHJvdGVjdGVkIHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlO1xuICBwcm90ZWN0ZWQgZGVmYXVsdExhYmVsID0gZGVmYXVsdExhYmVsO1xuICBwcm90ZWN0ZWQgc2hvd0Rvd25sb2FkID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGhlYWRlcktleXMgPSBjb21wdXRlZCgoKSA9PiBbXG4gICAgJ2N5Y2xlLmlkJyxcbiAgICAnY3ljbGUuQGlkJyxcbiAgICAndHJhbnNmb3JtYXRpb24uaWQnLFxuICAgICd0cmFuc2Zvcm1hdGlvbi5AaWQnLFxuICAgIC4uLnRoaXMubm9kZUtleXMoKS5mbGF0TWFwKGtleSA9PiBbYGN5Y2xlLiR7a2V5fS5gLCBgdHJhbnNmb3JtYXRpb24uJHtrZXl9LmBdKVxuICBdKTtcblxuICBwcm90ZWN0ZWQgVmlldyA9IFZpZXc7XG4gIHByb3RlY3RlZCB2aWV3SWNvbiA9IHZpZXdJY29uO1xuICBwcml2YXRlIHNob3dWaWV3ID0gY29tcHV0ZWQoXG4gICAgKCkgPT5cbiAgICAgICh7XG4gICAgICAgIFtWaWV3LmNoYXJ0XTogdGhpcy5zZWxlY3RlZE5vZGVLZXkoKSA9PT0gQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnMgPyB0aGlzLmN5Y2xlcygpLmxlbmd0aCA+IDEgOiB0aGlzLmhhc0RhdGEoKSxcbiAgICAgICAgW1ZpZXcubG9nc106ICF0aGlzLmlzT3JpZ2luYWwoKSxcbiAgICAgICAgW1ZpZXcudGFibGVdOiB0cnVlLFxuICAgICAgICBbVmlldy50aW1lbGluZV06IHRoaXMuZW5hYmxlVGltZWxpbmUoKVxuICAgICAgfSkgYXMgeyBbdmlldyBpbiBWaWV3XTogYm9vbGVhbiB9XG4gICk7XG4gIHByb3RlY3RlZCB2aWV3cyA9IGNvbXB1dGVkKCgpID0+IG5vZGVLZXlWaWV3c1t0aGlzLnNlbGVjdGVkTm9kZUtleSgpXT8uZmlsdGVyKHZpZXcgPT4gdGhpcy5zaG93VmlldygpW3ZpZXddKSA/PyBbXSk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFZpZXcgPSBzaWduYWwoVmlldy50YWJsZSk7XG5cbiAgcHJpdmF0ZSBfYWxsTm9kZXMgPSB0b1NpZ25hbCh0aGlzLm5vZGVTdG9yZVNlcnZpY2UuZmluZCQ8SUN5Y2xlSlNPTkxEPihOb2RlVHlwZS5DeWNsZSkpO1xuICBwcml2YXRlIG9yaWdpbmFsTm9kZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9hbGxOb2RlcygpPy5tYXAoZGF0YSA9PiBkYXRhW0RhdGFTdGF0ZS5vcmlnaW5hbF0pIHx8IFtdKTtcbiAgcHJpdmF0ZSBjdXJyZW50Tm9kZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9hbGxOb2RlcygpPy5tYXAoZGF0YSA9PiBkYXRhW3RoaXMuZGF0YVN0YXRlKCldKSB8fCBbXSk7XG5cbiAgLy8gY2FuIGJlIEN5Y2xlIG9yIFRyYW5zZm9ybWF0aW9uXG4gIHByb3RlY3RlZCBvcmlnaW5hbEN5Y2xlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5ub2RlS2V5R3JvdXAoKVxuICAgICAgPyBmaWx0ZXJHcm91cE5vZGVzQnlUZXJtKHRoaXMubm9kZUtleUdyb3VwKCksIHRoaXMub3JpZ2luYWxOb2RlcygpLCB0aGlzLnNlbGVjdGVkR3JvdXBUZXJtKCkpXG4gICAgICA6IHRoaXMub3JpZ2luYWxOb2RlcygpXG4gICk7XG4gIHByb3RlY3RlZCBjeWNsZXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMubm9kZUtleUdyb3VwKClcbiAgICAgID8gZmlsdGVyR3JvdXBOb2Rlc0J5VGVybSh0aGlzLm5vZGVLZXlHcm91cCgpLCB0aGlzLmN1cnJlbnROb2RlcygpLCB0aGlzLnNlbGVjdGVkR3JvdXBUZXJtKCkpXG4gICAgICA6IHRoaXMuY3VycmVudE5vZGVzKClcbiAgKTtcblxuICBwcml2YXRlIHNlbGVjdGVkSW5kZXggPSBzaWduYWwoMCk7XG4gIHByaXZhdGUgb2dpcmluYWxTZWxlY3RlZEN5Y2xlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcmlnaW5hbEN5Y2xlcygpPy5bdGhpcy5zZWxlY3RlZEluZGV4KCldKTtcbiAgcHJpdmF0ZSBzZWxlY3RlZEN5Y2xlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jeWNsZXMoKT8uW3RoaXMuc2VsZWN0ZWRJbmRleCgpXSk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZExvZ3NLZXkgPSBjb21wdXRlZCgoKSA9PiBsb2dzS2V5KHRoaXMuc2VsZWN0ZWRDeWNsZSgpKSk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZE9yaWdpbmFsVmFsdWVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vZ2lyaW5hbFNlbGVjdGVkQ3ljbGUoKT8uW3RoaXMuc2VsZWN0ZWROb2RlS2V5KCldIHx8IFtdKTtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkUmVjYWxjdWxhdGVkVmFsdWVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWxlY3RlZEN5Y2xlKCk/Llt0aGlzLnNlbGVjdGVkTm9kZUtleSgpXSB8fCBbXSk7XG4gIC8vIFRPRE86IGhhbmRsZSB0cmFuc2Zvcm1hdGlvbiBhbmQgbm9uLWluZGV4ZWQgbm9kZXMgb24gQ0VcbiAgcHJvdGVjdGVkIHNlbGVjdGVkTm9kZSA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5zZWxlY3RlZEN5Y2xlKClcbiAgICAgID8ge1xuICAgICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRDeWNsZSgpLFxuICAgICAgICAgICdAdHlwZSc6IE5vZGVUeXBlLkN5Y2xlLFxuICAgICAgICAgIHR5cGU6IE5vZGVUeXBlLkN5Y2xlLFxuICAgICAgICAgIGRhdGFTdGF0ZTogRGF0YVN0YXRlLnJlY2FsY3VsYXRlZFxuICAgICAgICB9XG4gICAgICA6IG51bGxcbiAgKTtcblxuICBwcml2YXRlIGlzT3JpZ2luYWwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRhdGFTdGF0ZSgpID09PSBEYXRhU3RhdGUub3JpZ2luYWwpO1xuICBwcml2YXRlIG9yaWdpbmFsVmFsdWVzID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuaXNPcmlnaW5hbCgpID8gbnVsbCA6IHRoaXMub3JpZ2luYWxDeWNsZXMoKSkgfHwgW10pO1xuXG4gIHByaXZhdGUgaGFzUmVjYWxjdWxhdGVkTm9kZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN5Y2xlcygpLnNvbWUoY3ljbGUgPT4gIWN5Y2xlLmFnZ3JlZ2F0ZWQpKTtcbiAgcHJvdGVjdGVkIHNob3dTd2l0Y2hUb1JlY2FsY3VsYXRlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaXNPcmlnaW5hbCgpICYmIHRoaXMuaGFzUmVjYWxjdWxhdGVkTm9kZXMoKSk7XG5cbiAgcHJvdGVjdGVkIHRpbWVsaW5lVmFsdWVzID0gY29tcHV0ZWQoKCkgPT4gZmlsdGVyVmFsdWVzVGltZWxpbmUodGhpcy5zZWxlY3RlZEN5Y2xlKCk/Llt0aGlzLnNlbGVjdGVkTm9kZUtleSgpXSB8fCBbXSkpO1xuICBwcml2YXRlIGVuYWJsZVRpbWVsaW5lID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50aW1lbGluZVZhbHVlcygpLmxlbmd0aCA+IDApO1xuXG4gIHByb3RlY3RlZCBpc05vZGVLZXlBbGxvd2VkID0gY29tcHV0ZWQoKCkgPT4gbm9kZUtleVZpZXdzW3RoaXMuZmlyc3ROb2RlS2V5KCldLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRWaWV3KCkpKTtcblxuICBwcml2YXRlIGdyb3VwZWROb2RlcyA9IGNvbXB1dGVkKCgpID0+IGN5Y2xlR3JvdXBOb2Rlcyh0aGlzLm5vZGVLZXlHcm91cCgpLCB0aGlzLm9yaWdpbmFsTm9kZXMoKT8uWzBdKSk7XG4gIHByb3RlY3RlZCBncm91cE5vZGVUZXJtcyA9IGNvbXB1dGVkKCgpID0+IHVuaXF1ZSh0aGlzLmdyb3VwZWROb2RlcygpLm1hcCgoeyB0ZXJtIH0pID0+IHRlcm0pKSk7XG4gIHByb3RlY3RlZCBpc0dyb3VwTm9kZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMubm9kZUtleUdyb3VwKCkgJiYgdGhpcy5ncm91cGVkTm9kZXMoKT8ubGVuZ3RoID4gMCk7XG5cbiAgcHJvdGVjdGVkIGlzRW1pc3Npb24gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNlbGVjdGVkTm9kZUtleSgpID09PSBCbGFua05vZGVzS2V5LmVtaXNzaW9ucyk7XG5cbiAgcHJvdGVjdGVkIGRhdGEgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuaXNFbWlzc2lvbigpXG4gICAgICA/IHRoaXMuZ3JvdXBFbWlzc2lvbnMoKVxuICAgICAgOiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5ub2RlS2V5cygpLm1hcChub2RlS2V5ID0+IFtub2RlS2V5LCB0aGlzLmdyb3VwTm9kZXNCeUtleSh7IG5vZGVLZXkgfSldKSlcbiAgKTtcbiAgcHJvdGVjdGVkIGRhdGFLZXlzID0gY29tcHV0ZWQoKCkgPT4gT2JqZWN0LmtleXModGhpcy5kYXRhKCkpKTtcblxuICBwcm90ZWN0ZWQgaGFzRGF0YSA9IGNvbXB1dGVkKCgpID0+IE9iamVjdC52YWx1ZXModGhpcy5kYXRhKCkpLmZsYXQoKS5sZW5ndGggPiAwKTtcblxuICBwcm90ZWN0ZWQgZmlsdGVyVGVybVR5cGVzID0gY29tcHV0ZWQoKCkgPT4gbm9kZUtleUZpbHRlclRlcm1UeXBlc1t0aGlzLnNlbGVjdGVkTm9kZUtleSgpXSk7XG4gIHByb3RlY3RlZCBmaWx0ZXJUZXJtID0gc2lnbmFsKCcnKTtcblxuICBwcm90ZWN0ZWQgY3N2RmlsZW5hbWUgPSBjb21wdXRlZCgoKSA9PiBgJHt0aGlzLm5vZGVLZXlzKCkuam9pbignLScpfS5jc3ZgKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSBsb2dzIGRvZXMgbm90IHJlbWFpbiBkaXNwbGF5ZWRcbiAgICAgICAgaWYgKCh0aGlzLmlzT3JpZ2luYWwoKSAmJiB0aGlzLnNlbGVjdGVkVmlldygpID09PSBWaWV3LmxvZ3MpIHx8ICF0aGlzLnZpZXdzKCkuaW5jbHVkZXModGhpcy5zZWxlY3RlZFZpZXcoKSkpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVmlldy5zZXQoVmlldy50YWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWROb2RlS2V5KCkgfHwgIXRoaXMubm9kZUtleXMoKS5pbmNsdWRlcyh0aGlzLnNlbGVjdGVkTm9kZUtleSgpKSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlS2V5LnNldCh0aGlzLmZpcnN0Tm9kZUtleSgpKTtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVmlldy5zZXQoVmlldy50YWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRHcm91cFRlcm0oKSB8fCAhdGhpcy5ncm91cE5vZGVUZXJtcygpLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRHcm91cFRlcm0oKSkpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkR3JvdXBUZXJtLnNldCh0aGlzLmdyb3VwTm9kZVRlcm1zKClbMF0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ3JvdXBOb2Rlc0J5S2V5PFxuICAgIFQgZXh0ZW5kcyBJQ3ljbGVDb25maWcsXG4gICAgUiA9IFQgZXh0ZW5kcyBJQ3ljbGVDb25maWdBbmltYWxcbiAgICAgID8gQW5pbWFsXG4gICAgICA6IFQgZXh0ZW5kcyBJQ3ljbGVDb25maWdFbWlzc2lvblxuICAgICAgICA/IEVtaXNzaW9uXG4gICAgICAgIDogVCBleHRlbmRzIElDeWNsZUNvbmZpZ0lucHV0XG4gICAgICAgICAgPyBIZXN0aWFJbnB1dFxuICAgICAgICAgIDogVCBleHRlbmRzIElDeWNsZUNvbmZpZ1ByYWN0aWNlXG4gICAgICAgICAgICA/IFByYWN0aWNlXG4gICAgICAgICAgICA6IFByb2R1Y3RcbiAgPih7IG5vZGVLZXkgfTogVCk6IElHcm91cGVkS2V5czxSPltdIHtcbiAgICBjb25zdCBub2Rlc1BlckN5Y2xlID0gZ3JvdXBOb2Rlc0J5VGVybTxJQ3ljbGVKU09OTEQgfCBncm91cGVkTm9kZSwgUj4oXG4gICAgICB0aGlzLmN5Y2xlcygpLFxuICAgICAgbm9kZUtleSxcbiAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZXMoKSxcbiAgICAgIGZpbHRlckJsYW5rTm9kZSh0aGlzLmZpbHRlclRlcm0oKSlcbiAgICApO1xuICAgIHJldHVybiBvcmRlckJ5KGdyb3VwcGVkS2V5cyhub2Rlc1BlckN5Y2xlKSwgWydrZXknXSwgWydhc2MnXSk7XG4gIH1cblxuICBwcml2YXRlIGdyb3VwRW1pc3Npb25zKCkge1xuICAgIGNvbnN0IGVtaXNzaW9uc1BlckN5Y2xlID0gZ3JvdXBOb2Rlc0J5VGVybTxJQ3ljbGVKU09OTEQgfCBncm91cGVkTm9kZSwgRW1pc3Npb24+KFxuICAgICAgdGhpcy5jeWNsZXMoKSxcbiAgICAgIEJsYW5rTm9kZXNLZXkuZW1pc3Npb25zLFxuICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlcygpLFxuICAgICAgZmlsdGVyQmxhbmtOb2RlKHRoaXMuZmlsdGVyVGVybSgpKVxuICAgICk7XG4gICAgY29uc3QgdmFsdWVzOiBJR3JvdXBlZEtleXM8RW1pc3Npb24+W10gPSBvcmRlckJ5KGdyb3VwcGVkS2V5cyhlbWlzc2lvbnNQZXJDeWNsZSksIFsna2V5J10sIFsnYXNjJ10pO1xuICAgIGNvbnN0IG1ldGhvZFRpZXJzID0gb3JkZXJCeShcbiAgICAgIHVuaXF1ZSh2YWx1ZXMubWFwKCh7IHZhbHVlIH0pID0+IHZhbHVlLm1ldGhvZFRpZXIpKS5tYXAobWV0aG9kVGllciA9PiAoe1xuICAgICAgICBtZXRob2RUaWVyLFxuICAgICAgICBtZXRob2RUaWVyT3JkZXI6IG1ldGhvZFRpZXJPcmRlcihtZXRob2RUaWVyKVxuICAgICAgfSkpLFxuICAgICAgWydtZXRob2RUaWVyT3JkZXInXSxcbiAgICAgIFsnYXNjJ11cbiAgICApO1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBtZXRob2RUaWVycy5tYXAoKHsgbWV0aG9kVGllciB9KSA9PiBbbWV0aG9kVGllciwgdmFsdWVzLmZpbHRlcigoeyB2YWx1ZSB9KSA9PiB2YWx1ZS5tZXRob2RUaWVyID09PSBtZXRob2RUaWVyKV0pXG4gICAgKSBhcyBncm91cGVkRW1pc3Npb25zO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRyYWNrQnlJZChfaW5kZXg6IG51bWJlciwgaXRlbTogSUN5Y2xlSlNPTkxEIHwgZ3JvdXBlZE5vZGUpIHtcbiAgICByZXR1cm4gaXRlbVsnQGlkJ107XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlsdGVyQnlUZXJtKHRlcm06IHN0cmluZykge1xuICAgIHRoaXMuZmlsdGVyVGVybS5zZXQodGVybSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VsZWN0SW5kZXgoeyB0YXJnZXQ6IHsgdmFsdWUgfSB9KSB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4LnNldCgrdmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGN5Y2xlTm9kZShjeWNsZTogSUN5Y2xlSlNPTkxEIHwgZ3JvdXBlZE5vZGUpIHtcbiAgICByZXR1cm4gJ3Rlcm0nIGluIGN5Y2xlID8gY3ljbGUudGVybSA6IGN5Y2xlO1xuICB9XG59XG4iLCJAaWYgKGlzR3JvdXBOb2RlKCkpIHtcbiAgPGRpdiBjbGFzcz1cInRhYnMgaXMtbWItMVwiPlxuICAgIDx1bD5cbiAgICAgIEBmb3IgKHRlcm0gb2YgZ3JvdXBOb2RlVGVybXMoKTsgdHJhY2sgdGVybSkge1xuICAgICAgICA8bGkgW2NsYXNzLmlzLWFjdGl2ZV09XCJzZWxlY3RlZEdyb3VwVGVybSgpID09PSB0ZXJtXCI+XG4gICAgICAgICAgPGEgKGNsaWNrKT1cInNlbGVjdGVkR3JvdXBUZXJtLnNldCh0ZXJtKVwiPnt7IHRlcm0ubmFtZSB9fTwvYT5cbiAgICAgICAgPC9saT5cbiAgICAgIH1cbiAgICA8L3VsPlxuICA8L2Rpdj5cbn1cblxuPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtdmFyaWFibGUgaXMtYWxpZ24taXRlbXMtY2VudGVyIGlzLTIgaXMtbS0wXCI+XG4gIDxkaXYgY2xhc3M9XCJjb2x1bW5cIj5cbiAgICBAaWYgKGhhc0RhdGEoKSAmJiBzZWxlY3RlZFZpZXcoKSA9PT0gVmlldy50YWJsZSkge1xuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbCBpcy1naG9zdFwiXG4gICAgICAgIChjbGljayk9XCJzaG93RG93bmxvYWQgPSB0cnVlXCJcbiAgICAgICAgbmdiVG9vbHRpcD1cIkRvd25sb2FkIGFzIENTVlwiXG4gICAgICAgIFtkaXNhYmxlVG9vbHRpcF09XCJzaG93RG93bmxvYWRcIlxuICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIj5cbiAgICAgICAgPGZhLWljb24gW2ljb25dPVwiZmFEb3dubG9hZFwiIHNpemU9XCJsZ1wiPjwvZmEtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG4gIEBpZiAoaGFzRGF0YSgpICYmIHNlbGVjdGVkVmlldygpID09PSBWaWV3LnRhYmxlKSB7XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3dcIj5cbiAgICAgIDxoZS1zZWFyY2gtZXh0ZW5kXG4gICAgICAgIGNsYXNzPVwiaXMtc2Vjb25kYXJ5IGlzLXNtYWxsXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgdGVybXMgYnkgbmFtZVwiXG4gICAgICAgIChzZWFyY2gpPVwiZmlsdGVyQnlUZXJtKCRldmVudClcIj48L2hlLXNlYXJjaC1leHRlbmQ+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmICh2aWV3cygpPy5sZW5ndGggPiAxKSB7XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zXCI+XG4gICAgICAgIEBmb3IgKHZpZXcgb2Ygdmlld3MoKTsgdHJhY2sgdmlldykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cInNlbGVjdGVkVmlldygpID09PSB2aWV3XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkVmlldy5zZXQodmlldylcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGlzLXNtYWxsXCI+XG4gICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwidmlld0ljb25bdmlld11cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1oaWRkZW4tbW9iaWxlXCI+e3sgdmlldyB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG5cbkBpZiAoaXNOb2RlS2V5QWxsb3dlZCgpKSB7XG4gIEBzd2l0Y2ggKHNlbGVjdGVkVmlldygpKSB7XG4gICAgQGNhc2UgKFZpZXcudGFibGUpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJpcy1weC0zIGlzLXBiLTNcIj5cbiAgICAgICAgQGlmIChoYXNEYXRhKCkpIHtcbiAgICAgICAgICA8aGUtZGF0YS10YWJsZSBjbGFzcz1cIm1iLTEgaXMtc21hbGxcIiBbc21hbGxdPVwidHJ1ZVwiIG1heEhlaWdodD1cIjMyMFwiPlxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZnVsbHdpZHRoIGlzLW5hcnJvdyBpcy1zdHJpcGVkXCI+XG4gICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICBAaWYgKGRhdGFLZXlzKCkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiaGFzLXRleHQtd2VpZ2h0LWJvbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwid2lkdGgtYXV0b1wiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBbY2xhc3MuaXMtaGlkZGVuXT1cImlzR3JvdXBOb2RlKClcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChkYXRhS2V5IG9mIGRhdGFLZXlzKCk7IHRyYWNrIGRhdGFLZXk7IGxldCBkYXRhS2V5TGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChkYXRhKClbZGF0YUtleV0/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIFthdHRyLmNvbHNwYW5dPVwiZGF0YSgpW2RhdGFLZXldLmxlbmd0aFwiIFtjbGFzcy5oYXMtYm9yZGVyLXJpZ2h0XT1cIiFkYXRhS2V5TGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBkYXRhS2V5IHwga2V5VG9MYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJoYXMtdGV4dC13ZWlnaHQtc2VtaWJvbGRcIj5cbiAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtYm9yZGVyLXJpZ2h0XCIgW2NsYXNzLmlzLWhpZGRlbl09XCJpc0dyb3VwTm9kZSgpXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKGRhdGFLZXkgb2YgZGF0YUtleXMoKTsgdHJhY2sgZGF0YUtleTsgbGV0IGRhdGFLZXlMYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgQGZvciAobm9kZSBvZiBkYXRhKClbZGF0YUtleV07IHRyYWNrIG5vZGU7IGxldCBub2RlTGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJub2RlLnZhbHVlLnRlcm0ubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLWJvcmRlci1yaWdodF09XCJkYXRhS2V5cygpLmxlbmd0aCA+IDEgJiYgIWRhdGFLZXlMYXN0ICYmIG5vZGVMYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aGUtbm9kZS1saW5rIFtub2RlXT1cIm5vZGUudmFsdWUudGVybVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cIm5vZGUudmFsdWUudGVybS5uYW1lIHwgZWxsaXBzaXM6IDMwIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJpcy1pdGFsaWMgaGFzLXRleHQtd2VpZ2h0LXNlbWlib2xkXCI+XG4gICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ3aWR0aC1hdXRvIGhhcy1ib3JkZXItcmlnaHRcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiaGFzLWJvcmRlci1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiaXNHcm91cE5vZGUoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8YSBbaHJlZl09XCJiYXNlVXJsICsgJy9zY2hlbWEvQ3ljbGUjZnVuY3Rpb25hbFVuaXQnXCIgdGFyZ2V0PVwiX2JsYW5rXCI+RnVuY3Rpb25hbCB1bml0PC9hPlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKGRhdGFLZXkgb2YgZGF0YUtleXMoKTsgdHJhY2sgZGF0YUtleTsgbGV0IGRhdGFLZXlMYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgQGZvciAobm9kZSBvZiBkYXRhKClbZGF0YUtleV07IHRyYWNrIG5vZGU7IGxldCBub2RlTGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJub2RlLnZhbHVlLnRlcm0udW5pdHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhhcy1ib3JkZXItcmlnaHRdPVwiZGF0YUtleXMoKS5sZW5ndGggPiAxICYmICFkYXRhS2V5TGFzdCAmJiBub2RlTGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySHRtbF09XCJub2RlLnZhbHVlLnRlcm0udW5pdHMgfCBjb21wb3VuZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoZS10ZXJtcy11bml0cy1kZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1tbC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rlcm1dPVwibm9kZS52YWx1ZS50ZXJtXCI+PC9oZS10ZXJtcy11bml0cy1kZXNjcmlwdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgIEBmb3IgKGN5Y2xlIG9mIGN5Y2xlcygpOyB0cmFjayB0cmFja0J5SWQoY3ljbGVJbmRleCwgY3ljbGUpOyBsZXQgY3ljbGVJbmRleCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aWR0aC1hdXRvIGhhcy1ib3JkZXItcmlnaHRcIiBbYXR0ci50aXRsZV09XCJkZWZhdWx0TGFiZWwoY3ljbGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGhlLW5vZGUtbGluayBbbm9kZV09XCJjeWNsZU5vZGUoY3ljbGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjeWNsZUluZGV4ICsgMSB9fS4ge3sgZGVmYXVsdExhYmVsKGN5Y2xlKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiaGFzLWJvcmRlci1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiaXNHcm91cE5vZGUoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxoZS1jeWNsZXMtZnVuY3Rpb25hbC11bml0LW1lYXN1cmUgW2N5Y2xlXT1cImN5Y2xlXCI+PC9oZS1jeWNsZXMtZnVuY3Rpb25hbC11bml0LW1lYXN1cmU+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGRhdGFLZXkgb2YgZGF0YUtleXMoKTsgdHJhY2sgZGF0YUtleTsgbGV0IGRhdGFLZXlMYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICBAZm9yIChub2RlIG9mIGRhdGEoKVtkYXRhS2V5XTsgdHJhY2sgbm9kZTsgbGV0IG5vZGVMYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlzLW5vd3JhcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtYm9yZGVyLXJpZ2h0XT1cImRhdGFLZXlzKCkubGVuZ3RoID4gMSAmJiAhZGF0YUtleUxhc3QgJiYgbm9kZUxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChub2RlLnZhbHVlLnZhbHVlc1tjeWNsZVsnQGlkJ11dKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJpZ2dlci1wb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ2JQb3BvdmVyXT1cImRldGFpbHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9DbG9zZV09XCInb3V0c2lkZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wb3ZlckNsYXNzPVwiaXMtbmFycm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwPVwibmdiUG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJDb250ZXh0XT1cInsgZGF0YTogbm9kZS52YWx1ZS52YWx1ZXNbY3ljbGVbJ0BpZCddXSwgY3ljbGUsIGtleTogZGF0YUtleSB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBwb2ludGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUobm9kZS52YWx1ZS52YWx1ZXNbY3ljbGVbJ0BpZCddXS52YWx1ZSwgbm9kZS52YWx1ZS50ZXJtWydAaWQnXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHJlY2lzaW9uOiAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRlZmF1bHQ6ICctJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhlLWJsYW5rLW5vZGUtc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtbC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFTdGF0ZV09XCJkYXRhU3RhdGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGUudmFsdWUudmFsdWVzW2N5Y2xlWydAaWQnXV0ubm9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1cInZhbHVlXCI+PC9oZS1ibGFuay1ub2RlLXN0YXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+LTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICA8L2hlLWRhdGEtdGFibGU+XG4gICAgICAgICAgPGhlLWJsYW5rLW5vZGUtc3RhdGUtbm90aWNlXG4gICAgICAgICAgICBbZGF0YVN0YXRlXT1cImRhdGFTdGF0ZSgpXCJcbiAgICAgICAgICAgIFtzaG93RGVsZXRlZF09XCJmaXJzdE5vZGVLZXkoKSA9PT0gQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnNcIj48L2hlLWJsYW5rLW5vZGUtc3RhdGUtbm90aWNlPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXMtcHQtMyBoYXMtdGV4dC1jZW50ZXJlZFwiPlxuICAgICAgICAgICAgPHNwYW4+Tm8gZGF0YSBhdmFpbGFibGU8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFmaWx0ZXJUZXJtKClcIj5tYXRjaGluZyB5b3VyIHNlYXJjaCBjcml0ZXJpYTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPi48L3NwYW4+XG4gICAgICAgICAgICBAaWYgKHNob3dTd2l0Y2hUb1JlY2FsY3VsYXRlZCgpKSB7XG4gICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgIFN3aXRjaCB0b1xuICAgICAgICAgICAgICAgIDxjb2RlPnJlY2FsY3VsYXRlZDwvY29kZT5cbiAgICAgICAgICAgICAgICB2ZXJzaW9uLlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAY2FzZSAoVmlldy5jaGFydCkge1xuICAgICAgQHN3aXRjaCAoZmlyc3ROb2RlS2V5KCkpIHtcbiAgICAgICAgQGNhc2UgKEJsYW5rTm9kZXNLZXkuaW5wdXRzKSB7XG4gICAgICAgICAgPGhlLWN5Y2xlcy1yZXN1bHQgW2N5Y2xlc109XCJjeWNsZXMoKVwiPjwvaGUtY3ljbGVzLXJlc3VsdD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnMpIHtcbiAgICAgICAgICA8aGUtY3ljbGVzLWVtaXNzaW9ucy1jaGFydCBbY3ljbGVzXT1cImN5Y2xlcygpXCI+PC9oZS1jeWNsZXMtZW1pc3Npb25zLWNoYXJ0PlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIEBjYXNlIChWaWV3LnRpbWVsaW5lKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VsZWN0Q3ljbGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpcy1weC0zIGlzLXBiLTNcIj5cbiAgICAgICAgPGhlLWN5Y2xlcy1ub2Rlcy10aW1lbGluZVxuICAgICAgICAgIFtyZWNhbGN1bGF0ZWRWYWx1ZXNdPVwidGltZWxpbmVWYWx1ZXMoKVwiXG4gICAgICAgICAgW2RhdGFTdGF0ZV09XCJkYXRhU3RhdGUoKVwiPjwvaGUtY3ljbGVzLW5vZGVzLXRpbWVsaW5lPlxuICAgICAgICA8aGUtYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2UgW2RhdGFTdGF0ZV09XCJkYXRhU3RhdGUoKVwiPjwvaGUtYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2U+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGNhc2UgKFZpZXcubG9ncykge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlbGVjdEN5Y2xlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICBAaWYgKG5vZGVLZXlzKCkubGVuZ3RoID4gMSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidGFicyBpcy1tYi0yXCI+XG4gICAgICAgICAgPHVsPlxuICAgICAgICAgICAgQGZvciAobm9kZUtleSBvZiBub2RlS2V5cygpOyB0cmFjayBub2RlS2V5KSB7XG4gICAgICAgICAgICAgIDxsaSBbY2xhc3MuaXMtYWN0aXZlXT1cInNlbGVjdGVkTm9kZUtleSgpID09PSBub2RlS2V5XCI+XG4gICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cInNlbGVjdGVkTm9kZUtleS5zZXQobm9kZUtleSlcIj57eyBub2RlS2V5IHwga2V5VG9MYWJlbCB9fTwvYT5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoc2VsZWN0ZWROb2RlKCkpIHtcbiAgICAgICAgPGhlLW5vZGUtbG9ncy1tb2RlbHNcbiAgICAgICAgICBbbm9kZV09XCJzZWxlY3RlZE5vZGUoKVwiXG4gICAgICAgICAgW25vZGVLZXldPVwic2VsZWN0ZWROb2RlS2V5KClcIlxuICAgICAgICAgIFtsb2dzS2V5XT1cInNlbGVjdGVkTG9nc0tleSgpXCJcbiAgICAgICAgICBbb3JpZ2luYWxWYWx1ZXNdPVwic2VsZWN0ZWRPcmlnaW5hbFZhbHVlcygpXCJcbiAgICAgICAgICBbcmVjYWxjdWxhdGVkVmFsdWVzXT1cInNlbGVjdGVkUmVjYWxjdWxhdGVkVmFsdWVzKClcIlxuICAgICAgICAgIFtmaWx0ZXJUZXJtVHlwZXNdPVwiZmlsdGVyVGVybVR5cGVzKClcIj48L2hlLW5vZGUtbG9ncy1tb2RlbHM+XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBpZiAoc2hvd0Rvd25sb2FkKSB7XG4gIDxoZS1ub2RlLWNzdi1leHBvcnQtY29uZmlybVxuICAgIFtub2Rlc109XCJjeWNsZXMoKVwiXG4gICAgW2ZpbGVuYW1lXT1cImNzdkZpbGVuYW1lKClcIlxuICAgIFtpc1VwbG9hZF09XCJmYWxzZVwiXG4gICAgW2hlYWRlcktleXNdPVwiaGVhZGVyS2V5cygpXCJcbiAgICAoY2xvc2VkKT1cInNob3dEb3dubG9hZCA9IGZhbHNlXCI+PC9oZS1ub2RlLWNzdi1leHBvcnQtY29uZmlybT5cbn1cblxuPG5nLXRlbXBsYXRlICNkZXRhaWxzIGxldC1ub2RlPVwiY3ljbGVcIiBsZXQtZGF0YT1cImRhdGFcIiBsZXQta2V5PVwia2V5XCI+XG4gIDxwPlxuICAgIDxiPnt7IGRlZmF1bHRMYWJlbChub2RlKSB9fTwvYj5cbiAgPC9wPlxuICA8aGUtbm9kZS12YWx1ZS1kZXRhaWxzXG4gICAgW2RhdGFdPVwiZGF0YVwiXG4gICAgW2RhdGFTdGF0ZV09XCJkYXRhU3RhdGUoKVwiXG4gICAgW25vZGVUeXBlXT1cIm5vZGVbJ0B0eXBlJ11cIlxuICAgIFtkYXRhS2V5XT1cImtleVwiPjwvaGUtbm9kZS12YWx1ZS1kZXRhaWxzPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzZWxlY3RDeWNsZT5cbiAgQGlmIChjeWNsZXMoKS5sZW5ndGggPiAxKSB7XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnMgaXMtcHktMiBpcy1weC0zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbCBpcy1zdGF0aWMgaXMtc2Vjb25kYXJ5XCI+U2VsZWN0IGEgQ3ljbGU8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QgaXMtc21hbGwgaXMtZnVsbHdpZHRoIGlzLXNlY29uZGFyeVwiPlxuICAgICAgICAgIDxzZWxlY3QgKGNoYW5nZSk9XCJzZWxlY3RJbmRleCgkZXZlbnQpXCI+XG4gICAgICAgICAgICBAZm9yICh2YWx1ZSBvZiBjeWNsZXMoKTsgdHJhY2sgdmFsdWU7IGxldCBjeWNsZUluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cImN5Y2xlSW5kZXhcIj57eyBjeWNsZUluZGV4ICsgMSB9fS4ge3sgZGVmYXVsdExhYmVsKHZhbHVlKSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ljbGVzLW5vZGVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jeWNsZXMvY3ljbGVzLW5vZGVzL2N5Y2xlcy1ub2Rlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvY3ljbGVzL2N5Y2xlcy1ub2Rlcy9jeWNsZXMtbm9kZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFJTCxRQUFRLEVBSVIsWUFBWSxFQUlaLGFBQWEsRUFFZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sT0FBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFn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LG9KQUNoQiw0QkFBNEIsa0hBQzVCLHVCQUF1QixxTkFDdkIsNkJBQTZCLGtLQUM3Qix5QkFBeUIsdUhBQ3pCLFdBQVcsdU9BQ1gsWUFBWSw0Q0FDWixXQUFXLDJDQUNYLFlBQVksNENBQ1osY0FBYyw4Q0FDZCxhQUFhOzsyRkFHSixvQkFBb0I7a0JBaENoQyxTQUFTOytCQUNFLGlCQUFpQixtQkFHVix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxVQUFVO3dCQUNWLGVBQWU7d0JBQ2YscUJBQXFCO3dCQUNyQixrQkFBa0I7d0JBQ2xCLGlCQUFpQjt3QkFDakIsOEJBQThCO3dCQUM5QixvQ0FBb0M7d0JBQ3BDLFVBQVU7d0JBQ1YsdUJBQXVCO3dCQUN2Qiw2QkFBNkI7d0JBQzdCLHFCQUFxQjt3QkFDckIsNkJBQTZCO3dCQUM3QixnQkFBZ0I7d0JBQ2hCLDRCQUE0Qjt3QkFDNUIsdUJBQXVCO3dCQUN2Qiw2QkFBNkI7d0JBQzdCLHlCQUF5Qjt3QkFDekIsV0FBVzt3QkFDWCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsWUFBWTt3QkFDWixjQUFjO3dCQUNkLGFBQWE7cUJBQ2QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEYXRhU3RhdGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2FwaSc7XG5pbXBvcnQge1xuICBJQ3ljbGVKU09OTEQsXG4gIElucHV0IGFzIEhlc3RpYUlucHV0LFxuICBQcm9kdWN0LFxuICBOb2RlVHlwZSxcbiAgQW5pbWFsLFxuICBFbWlzc2lvbixcbiAgUHJhY3RpY2UsXG4gIFRlcm1UZXJtVHlwZSxcbiAgRW1pc3Npb25NZXRob2RUaWVyLFxuICBUZXJtLFxuICBUcmFuc2Zvcm1hdGlvbixcbiAgQmxhbmtOb2Rlc0tleSxcbiAgYmxhbmtOb2Rlc1R5cGVcbn0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEnO1xuaW1wb3J0IG9yZGVyQnkgZnJvbSAnbG9kYXNoLm9yZGVyYnknO1xuaW1wb3J0IHsgcHJvcGVydHlWYWx1ZSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvdXRpbHMvZGlzdC90ZXJtJztcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvdXRpbHMnO1xuaW1wb3J0IHsgRmFJY29uQ29tcG9uZW50IH0gZnJvbSAnQGZvcnRhd2Vzb21lL2FuZ3VsYXItZm9udGF3ZXNvbWUnO1xuaW1wb3J0IHsgTmdiVG9vbHRpcCwgTmdiUG9wb3ZlciB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IEljb25EZWZpbml0aW9uIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZvbnRhd2Vzb21lLXN2Zy1jb3JlJztcblxuaW1wb3J0IHsgZmlsdGVyQmxhbmtOb2RlLCBtZXRob2RUaWVyT3JkZXIgfSBmcm9tICcuLi8uLi9jb21tb24vbm9kZS11dGlscyc7XG5pbXBvcnQgeyBsb2dzS2V5IH0gZnJvbSAnLi4vY3ljbGVzLm1vZGVsJztcbmltcG9ydCB7IEhlTm9kZVN0b3JlU2VydmljZSB9IGZyb20gJy4uLy4uL25vZGUvbm9kZS1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IGdyb3VwTm9kZXNCeVRlcm0sIElHcm91cGVkS2V5cywgZ3JvdXBwZWRLZXlzIH0gZnJvbSAnLi4vLi4vY29tbW9uL25vZGUtdXRpbHMnO1xuaW1wb3J0IHsgYmFzZVVybCwgZGVmYXVsdExhYmVsIH0gZnJvbSAnLi4vLi4vY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IFByZWNpc2lvblBpcGUgfSBmcm9tICcuLi8uLi9jb21tb24vcHJlY2lzaW9uLnBpcGUnO1xuaW1wb3J0IHsgS2V5VG9MYWJlbFBpcGUgfSBmcm9tICcuLi8uLi9jb21tb24va2V5LXRvLWxhYmVsLnBpcGUnO1xuaW1wb3J0IHsgRWxsaXBzaXNQaXBlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2VsbGlwc2lzLnBpcGUnO1xuaW1wb3J0IHsgRGVmYXVsdFBpcGUgfSBmcm9tICcuLi8uLi9jb21tb24vZGVmYXVsdC5waXBlJztcbmltcG9ydCB7IENvbXBvdW5kUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9jb21wb3VuZC5waXBlJztcbmltcG9ydCB7IE5vZGVWYWx1ZURldGFpbHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9ub2RlL25vZGUtdmFsdWUtZGV0YWlscy9ub2RlLXZhbHVlLWRldGFpbHMuY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVDc3ZFeHBvcnRDb25maXJtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbm9kZS9ub2RlLWNzdi1leHBvcnQtY29uZmlybS9ub2RlLWNzdi1leHBvcnQtY29uZmlybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZUxvZ3NNb2RlbHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9ub2RlL25vZGUtbG9ncy1tb2RlbHMvbm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3ljbGVzTm9kZXNUaW1lbGluZUNvbXBvbmVudCB9IGZyb20gJy4uL2N5Y2xlcy1ub2Rlcy10aW1lbGluZS9jeWNsZXMtbm9kZXMtdGltZWxpbmUuY29tcG9uZW50JztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ3ljbGVzRW1pc3Npb25zQ2hhcnRDb21wb25lbnQgfSBmcm9tICcuLi9jeWNsZXMtZW1pc3Npb25zLWNoYXJ0L2N5Y2xlcy1lbWlzc2lvbnMtY2hhcnQuY29tcG9uZW50JztcbmltcG9ydCB7IEN5Y2xlc1Jlc3VsdENvbXBvbmVudCB9IGZyb20gJy4uL2N5Y2xlcy1yZXN1bHQvY3ljbGVzLXJlc3VsdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmxhbmtOb2RlU3RhdGVOb3RpY2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2UvYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2UuY29tcG9uZW50JztcbmltcG9ydCB7IEJsYW5rTm9kZVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tbW9uL2JsYW5rLW5vZGUtc3RhdGUvYmxhbmstbm9kZS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3ljbGVzRnVuY3Rpb25hbFVuaXRNZWFzdXJlQ29tcG9uZW50IH0gZnJvbSAnLi4vY3ljbGVzLWZ1bmN0aW9uYWwtdW5pdC1tZWFzdXJlL2N5Y2xlcy1mdW5jdGlvbmFsLXVuaXQtbWVhc3VyZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGVybXNVbml0c0Rlc2NyaXB0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vdGVybXMvdGVybXMtdW5pdHMtZGVzY3JpcHRpb24vdGVybXMtdW5pdHMtZGVzY3JpcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbm9kZS9ub2RlLWxpbmsvbm9kZS1saW5rLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRhVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hFeHRlbmRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vc2VhcmNoLWV4dGVuZC9zZWFyY2gtZXh0ZW5kLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBmYUNhbGN1bGF0b3IsIGZhQ2hhcnRCYXIsIGZhRG93bmxvYWQsIGZhTGlzdCwgZmFMaXN0QWx0IH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJztcblxuZW51bSBWaWV3IHtcbiAgdGFibGUgPSAnVGFibGUgdmlldycsXG4gIGNoYXJ0ID0gJ0NoYXJ0IHZpZXcnLFxuICB0aW1lbGluZSA9ICdPcGVyYXRpb25zIFRpbWVsaW5lJyxcbiAgbG9ncyA9ICdSZWNhbGN1bGF0aW9ucyBsb2dzJ1xufVxuXG5jb25zdCB0aW1lbGluZVRlcm1UeXBlID0gW1Rlcm1UZXJtVHlwZS5vcGVyYXRpb25dO1xuXG5pbnRlcmZhY2UgSUN5Y2xlQ29uZmlnIHtcbiAgbm9kZUtleTogQmxhbmtOb2Rlc0tleTtcbn1cblxuaW50ZXJmYWNlIElDeWNsZUNvbmZpZ0FuaW1hbCBleHRlbmRzIElDeWNsZUNvbmZpZyB7XG4gIG5vZGVLZXk6IEJsYW5rTm9kZXNLZXkuYW5pbWFscztcbn1cblxuaW50ZXJmYWNlIElDeWNsZUNvbmZpZ0VtaXNzaW9uIGV4dGVuZHMgSUN5Y2xlQ29uZmlnIHtcbiAgbm9kZUtleTogQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnM7XG59XG5cbmludGVyZmFjZSBJQ3ljbGVDb25maWdJbnB1dCBleHRlbmRzIElDeWNsZUNvbmZpZyB7XG4gIG5vZGVLZXk6IEJsYW5rTm9kZXNLZXkuaW5wdXRzO1xufVxuXG5pbnRlcmZhY2UgSUN5Y2xlQ29uZmlnUHJhY3RpY2UgZXh0ZW5kcyBJQ3ljbGVDb25maWcge1xuICBub2RlS2V5OiBCbGFua05vZGVzS2V5LnByYWN0aWNlcztcbn1cblxuY29uc3Qgdmlld0ljb246IHtcbiAgW3ZpZXcgaW4gVmlld106IEljb25EZWZpbml0aW9uO1xufSA9IHtcbiAgW1ZpZXcuY2hhcnRdOiBmYUNoYXJ0QmFyLFxuICBbVmlldy5sb2dzXTogZmFDYWxjdWxhdG9yLFxuICBbVmlldy50YWJsZV06IGZhTGlzdCxcbiAgW1ZpZXcudGltZWxpbmVdOiBmYUxpc3RBbHRcbn07XG5cbmNvbnN0IG5vZGVLZXlWaWV3czoge1xuICBbdHlwZSBpbiBCbGFua05vZGVzS2V5XT86IFZpZXdbXTtcbn0gPSB7XG4gIFtCbGFua05vZGVzS2V5LmFuaW1hbHNdOiBbVmlldy50YWJsZSwgVmlldy5sb2dzXSxcbiAgW0JsYW5rTm9kZXNLZXkuZW1pc3Npb25zXTogW1ZpZXcudGFibGUsIFZpZXcuY2hhcnQsIFZpZXcubG9nc10sXG4gIFtCbGFua05vZGVzS2V5LmlucHV0c106IFtWaWV3LnRhYmxlLCBWaWV3LmNoYXJ0LCBWaWV3LmxvZ3NdLFxuICBbQmxhbmtOb2Rlc0tleS5wcm9kdWN0c106IFtWaWV3LnRhYmxlLCBWaWV3LmNoYXJ0LCBWaWV3LmxvZ3NdLFxuICBbQmxhbmtOb2Rlc0tleS5wcmFjdGljZXNdOiBbVmlldy50YWJsZSwgVmlldy50aW1lbGluZSwgVmlldy5sb2dzXVxufTtcblxuY29uc3Qgbm9kZUtleUZpbHRlclRlcm1UeXBlczoge1xuICBbdHlwZSBpbiBCbGFua05vZGVzS2V5XT86IFRlcm1UZXJtVHlwZVtdO1xufSA9IHtcbiAgW0JsYW5rTm9kZXNLZXkuZW1pc3Npb25zXTogW1Rlcm1UZXJtVHlwZS5lbWlzc2lvbl1cbn07XG5cbmNvbnN0IGZpbHRlclZhbHVlc1RpbWVsaW5lID0gKHZhbHVlczogYmxhbmtOb2Rlc1R5cGVbXSkgPT5cbiAgdmFsdWVzLmZpbHRlcihwID0+IHRpbWVsaW5lVGVybVR5cGUuaW5jbHVkZXMocC50ZXJtPy50ZXJtVHlwZSkpO1xuXG50eXBlIGdyb3VwZWRFbWlzc2lvbnMgPSB7XG4gIFttZXRob2RUaWVyIGluIEVtaXNzaW9uTWV0aG9kVGllcl06IElHcm91cGVkS2V5czxFbWlzc2lvbj5bXTtcbn07XG5cbmV4cG9ydCBlbnVtIEN5Y2xlTm9kZXNLZXlHcm91cCB7XG4gIGFuaW1hbHMgPSAnYW5pbWFscycsXG4gIHRyYW5zZm9ybWF0aW9ucyA9ICd0cmFuc2Zvcm1hdGlvbnMnXG59XG5cbnR5cGUgZ3JvdXBlZE5vZGUgPSBBbmltYWwgfCBUcmFuc2Zvcm1hdGlvbjtcblxuY29uc3QgY3ljbGVHcm91cE5vZGUgPVxuICAoY3ljbGU/OiBJQ3ljbGVKU09OTEQpID0+XG4gIChub2RlPzogZ3JvdXBlZE5vZGUpOiBncm91cGVkTm9kZSAmIHsgbmFtZTogc3RyaW5nOyAnQGlkJzogc3RyaW5nIH0gPT5cbiAgICBub2RlXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgIG5hbWU6IGN5Y2xlPy5uYW1lLFxuICAgICAgICAgICdAaWQnOiBjeWNsZT8uWydAaWQnXSAvLyBzZXQgQGlkIHNvIHdlIGNhbiBmZXRjaCB0aGUgbG9ncyBmcm9tIHRoZSBDeWNsZVxuICAgICAgICB9XG4gICAgICA6IG51bGw7XG5cbmNvbnN0IGN5Y2xlR3JvdXBOb2RlcyA9IChncm91cEtleTogQ3ljbGVOb2Rlc0tleUdyb3VwLCBjeWNsZT86IElDeWNsZUpTT05MRCk6IGdyb3VwZWROb2RlW10gPT5cbiAgKGN5Y2xlPy5bZ3JvdXBLZXldIHx8IFtdKS5tYXAoY3ljbGVHcm91cE5vZGUoY3ljbGUpKS5maWx0ZXIoQm9vbGVhbik7XG5cbmNvbnN0IGZpbHRlckdyb3VwTm9kZXNCeVRlcm0gPSAoZ3JvdXBLZXk6IEN5Y2xlTm9kZXNLZXlHcm91cCwgY3ljbGVzOiBJQ3ljbGVKU09OTERbXSwgdGVybT86IFRlcm0pOiBncm91cGVkTm9kZVtdID0+XG4gIGN5Y2xlc1xuICAgIC5tYXAoY3ljbGUgPT5cbiAgICAgIGN5Y2xlR3JvdXBOb2RlKGN5Y2xlKShcbiAgICAgICAgKChjeWNsZT8uW2dyb3VwS2V5XSBhcyBncm91cGVkTm9kZVtdKSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZpbmQobm9kZSA9PiBub2RlLnRlcm0/Lm5hbWUgPT09IHRlcm0/Lm5hbWUpXG4gICAgICApXG4gICAgKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLWN5Y2xlcy1ub2RlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jeWNsZXMtbm9kZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jeWNsZXMtbm9kZXMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBOZ2JUb29sdGlwLFxuICAgIEZhSWNvbkNvbXBvbmVudCxcbiAgICBTZWFyY2hFeHRlbmRDb21wb25lbnQsXG4gICAgRGF0YVRhYmxlQ29tcG9uZW50LFxuICAgIE5vZGVMaW5rQ29tcG9uZW50LFxuICAgIFRlcm1zVW5pdHNEZXNjcmlwdGlvbkNvbXBvbmVudCxcbiAgICBDeWNsZXNGdW5jdGlvbmFsVW5pdE1lYXN1cmVDb21wb25lbnQsXG4gICAgTmdiUG9wb3ZlcixcbiAgICBCbGFua05vZGVTdGF0ZUNvbXBvbmVudCxcbiAgICBCbGFua05vZGVTdGF0ZU5vdGljZUNvbXBvbmVudCxcbiAgICBDeWNsZXNSZXN1bHRDb21wb25lbnQsXG4gICAgQ3ljbGVzRW1pc3Npb25zQ2hhcnRDb21wb25lbnQsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBDeWNsZXNOb2Rlc1RpbWVsaW5lQ29tcG9uZW50LFxuICAgIE5vZGVMb2dzTW9kZWxzQ29tcG9uZW50LFxuICAgIE5vZGVDc3ZFeHBvcnRDb25maXJtQ29tcG9uZW50LFxuICAgIE5vZGVWYWx1ZURldGFpbHNDb21wb25lbnQsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgQ29tcG91bmRQaXBlLFxuICAgIERlZmF1bHRQaXBlLFxuICAgIEVsbGlwc2lzUGlwZSxcbiAgICBLZXlUb0xhYmVsUGlwZSxcbiAgICBQcmVjaXNpb25QaXBlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ3ljbGVzTm9kZXNDb21wb25lbnQge1xuICBwcml2YXRlIG5vZGVTdG9yZVNlcnZpY2UgPSBpbmplY3QoSGVOb2RlU3RvcmVTZXJ2aWNlKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmFEb3dubG9hZCA9IGZhRG93bmxvYWQ7XG5cbiAgcHJvdGVjdGVkIGRhdGFTdGF0ZSA9IGlucHV0KERhdGFTdGF0ZS5vcmlnaW5hbCk7XG4gIHByb3RlY3RlZCBub2RlS2V5cyA9IGlucHV0LnJlcXVpcmVkPEJsYW5rTm9kZXNLZXlbXT4oKTtcbiAgcHJvdGVjdGVkIG5vZGVLZXlHcm91cCA9IGlucHV0PEN5Y2xlTm9kZXNLZXlHcm91cD4oKTtcblxuICBwcm90ZWN0ZWQgQmxhbmtOb2Rlc0tleSA9IEJsYW5rTm9kZXNLZXk7XG4gIHByb3RlY3RlZCBmaXJzdE5vZGVLZXkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm5vZGVLZXlzKCk/LlswXSk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZE5vZGVLZXkgPSBzaWduYWwodW5kZWZpbmVkIGFzIEJsYW5rTm9kZXNLZXkpO1xuXG4gIHByb3RlY3RlZCBzZWxlY3RlZEdyb3VwVGVybSA9IHNpZ25hbCh1bmRlZmluZWQgYXMgVGVybSk7XG5cbiAgcHJvdGVjdGVkIGJhc2VVcmwgPSBiYXNlVXJsKCk7XG4gIHByb3RlY3RlZCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTtcbiAgcHJvdGVjdGVkIGRlZmF1bHRMYWJlbCA9IGRlZmF1bHRMYWJlbDtcbiAgcHJvdGVjdGVkIHNob3dEb3dubG9hZCA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBoZWFkZXJLZXlzID0gY29tcHV0ZWQoKCkgPT4gW1xuICAgICdjeWNsZS5pZCcsXG4gICAgJ2N5Y2xlLkBpZCcsXG4gICAgJ3RyYW5zZm9ybWF0aW9uLmlkJyxcbiAgICAndHJhbnNmb3JtYXRpb24uQGlkJyxcbiAgICAuLi50aGlzLm5vZGVLZXlzKCkuZmxhdE1hcChrZXkgPT4gW2BjeWNsZS4ke2tleX0uYCwgYHRyYW5zZm9ybWF0aW9uLiR7a2V5fS5gXSlcbiAgXSk7XG5cbiAgcHJvdGVjdGVkIFZpZXcgPSBWaWV3O1xuICBwcm90ZWN0ZWQgdmlld0ljb24gPSB2aWV3SWNvbjtcbiAgcHJpdmF0ZSBzaG93VmlldyA9IGNvbXB1dGVkKFxuICAgICgpID0+XG4gICAgICAoe1xuICAgICAgICBbVmlldy5jaGFydF06IHRoaXMuc2VsZWN0ZWROb2RlS2V5KCkgPT09IEJsYW5rTm9kZXNLZXkuZW1pc3Npb25zID8gdGhpcy5jeWNsZXMoKS5sZW5ndGggPiAxIDogdGhpcy5oYXNEYXRhKCksXG4gICAgICAgIFtWaWV3LmxvZ3NdOiAhdGhpcy5pc09yaWdpbmFsKCksXG4gICAgICAgIFtWaWV3LnRhYmxlXTogdHJ1ZSxcbiAgICAgICAgW1ZpZXcudGltZWxpbmVdOiB0aGlzLmVuYWJsZVRpbWVsaW5lKClcbiAgICAgIH0pIGFzIHsgW3ZpZXcgaW4gVmlld106IGJvb2xlYW4gfVxuICApO1xuICBwcm90ZWN0ZWQgdmlld3MgPSBjb21wdXRlZCgoKSA9PiBub2RlS2V5Vmlld3NbdGhpcy5zZWxlY3RlZE5vZGVLZXkoKV0/LmZpbHRlcih2aWV3ID0+IHRoaXMuc2hvd1ZpZXcoKVt2aWV3XSkgPz8gW10pO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRWaWV3ID0gc2lnbmFsKFZpZXcudGFibGUpO1xuXG4gIHByaXZhdGUgX2FsbE5vZGVzID0gdG9TaWduYWwodGhpcy5ub2RlU3RvcmVTZXJ2aWNlLmZpbmQkPElDeWNsZUpTT05MRD4oTm9kZVR5cGUuQ3ljbGUpKTtcbiAgcHJpdmF0ZSBvcmlnaW5hbE5vZGVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fYWxsTm9kZXMoKT8ubWFwKGRhdGEgPT4gZGF0YVtEYXRhU3RhdGUub3JpZ2luYWxdKSB8fCBbXSk7XG4gIHByaXZhdGUgY3VycmVudE5vZGVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fYWxsTm9kZXMoKT8ubWFwKGRhdGEgPT4gZGF0YVt0aGlzLmRhdGFTdGF0ZSgpXSkgfHwgW10pO1xuXG4gIC8vIGNhbiBiZSBDeWNsZSBvciBUcmFuc2Zvcm1hdGlvblxuICBwcm90ZWN0ZWQgb3JpZ2luYWxDeWNsZXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMubm9kZUtleUdyb3VwKClcbiAgICAgID8gZmlsdGVyR3JvdXBOb2Rlc0J5VGVybSh0aGlzLm5vZGVLZXlHcm91cCgpLCB0aGlzLm9yaWdpbmFsTm9kZXMoKSwgdGhpcy5zZWxlY3RlZEdyb3VwVGVybSgpKVxuICAgICAgOiB0aGlzLm9yaWdpbmFsTm9kZXMoKVxuICApO1xuICBwcm90ZWN0ZWQgY3ljbGVzID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLm5vZGVLZXlHcm91cCgpXG4gICAgICA/IGZpbHRlckdyb3VwTm9kZXNCeVRlcm0odGhpcy5ub2RlS2V5R3JvdXAoKSwgdGhpcy5jdXJyZW50Tm9kZXMoKSwgdGhpcy5zZWxlY3RlZEdyb3VwVGVybSgpKVxuICAgICAgOiB0aGlzLmN1cnJlbnROb2RlcygpXG4gICk7XG5cbiAgcHJpdmF0ZSBzZWxlY3RlZEluZGV4ID0gc2lnbmFsKDApO1xuICBwcml2YXRlIG9naXJpbmFsU2VsZWN0ZWRDeWNsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3JpZ2luYWxDeWNsZXMoKT8uW3RoaXMuc2VsZWN0ZWRJbmRleCgpXSk7XG4gIHByaXZhdGUgc2VsZWN0ZWRDeWNsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY3ljbGVzKCk/Llt0aGlzLnNlbGVjdGVkSW5kZXgoKV0pO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRMb2dzS2V5ID0gY29tcHV0ZWQoKCkgPT4gbG9nc0tleSh0aGlzLnNlbGVjdGVkQ3ljbGUoKSkpO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRPcmlnaW5hbFZhbHVlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMub2dpcmluYWxTZWxlY3RlZEN5Y2xlKCk/Llt0aGlzLnNlbGVjdGVkTm9kZUtleSgpXSB8fCBbXSk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFJlY2FsY3VsYXRlZFZhbHVlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0ZWRDeWNsZSgpPy5bdGhpcy5zZWxlY3RlZE5vZGVLZXkoKV0gfHwgW10pO1xuICAvLyBUT0RPOiBoYW5kbGUgdHJhbnNmb3JtYXRpb24gYW5kIG5vbi1pbmRleGVkIG5vZGVzIG9uIENFXG4gIHByb3RlY3RlZCBzZWxlY3RlZE5vZGUgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuc2VsZWN0ZWRDeWNsZSgpXG4gICAgICA/IHtcbiAgICAgICAgICAuLi50aGlzLnNlbGVjdGVkQ3ljbGUoKSxcbiAgICAgICAgICAnQHR5cGUnOiBOb2RlVHlwZS5DeWNsZSxcbiAgICAgICAgICB0eXBlOiBOb2RlVHlwZS5DeWNsZSxcbiAgICAgICAgICBkYXRhU3RhdGU6IERhdGFTdGF0ZS5yZWNhbGN1bGF0ZWRcbiAgICAgICAgfVxuICAgICAgOiBudWxsXG4gICk7XG5cbiAgcHJpdmF0ZSBpc09yaWdpbmFsID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kYXRhU3RhdGUoKSA9PT0gRGF0YVN0YXRlLm9yaWdpbmFsKTtcbiAgcHJpdmF0ZSBvcmlnaW5hbFZhbHVlcyA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmlzT3JpZ2luYWwoKSA/IG51bGwgOiB0aGlzLm9yaWdpbmFsQ3ljbGVzKCkpIHx8IFtdKTtcblxuICBwcml2YXRlIGhhc1JlY2FsY3VsYXRlZE5vZGVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jeWNsZXMoKS5zb21lKGN5Y2xlID0+ICFjeWNsZS5hZ2dyZWdhdGVkKSk7XG4gIHByb3RlY3RlZCBzaG93U3dpdGNoVG9SZWNhbGN1bGF0ZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmlzT3JpZ2luYWwoKSAmJiB0aGlzLmhhc1JlY2FsY3VsYXRlZE5vZGVzKCkpO1xuXG4gIHByb3RlY3RlZCB0aW1lbGluZVZhbHVlcyA9IGNvbXB1dGVkKCgpID0+IGZpbHRlclZhbHVlc1RpbWVsaW5lKHRoaXMuc2VsZWN0ZWRDeWNsZSgpPy5bdGhpcy5zZWxlY3RlZE5vZGVLZXkoKV0gfHwgW10pKTtcbiAgcHJpdmF0ZSBlbmFibGVUaW1lbGluZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMudGltZWxpbmVWYWx1ZXMoKS5sZW5ndGggPiAwKTtcblxuICBwcm90ZWN0ZWQgaXNOb2RlS2V5QWxsb3dlZCA9IGNvbXB1dGVkKCgpID0+IG5vZGVLZXlWaWV3c1t0aGlzLmZpcnN0Tm9kZUtleSgpXS5pbmNsdWRlcyh0aGlzLnNlbGVjdGVkVmlldygpKSk7XG5cbiAgcHJpdmF0ZSBncm91cGVkTm9kZXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMub3JpZ2luYWxOb2RlcygpLmZsYXRNYXAoY3ljbGUgPT4gY3ljbGVHcm91cE5vZGVzKHRoaXMubm9kZUtleUdyb3VwKCksIGN5Y2xlKSlcbiAgKTtcbiAgcHJvdGVjdGVkIGdyb3VwTm9kZVRlcm1zID0gY29tcHV0ZWQoKCkgPT4gdW5pcXVlKHRoaXMuZ3JvdXBlZE5vZGVzKCkubWFwKCh7IHRlcm0gfSkgPT4gdGVybSkpKTtcbiAgcHJvdGVjdGVkIGlzR3JvdXBOb2RlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5ub2RlS2V5R3JvdXAoKSAmJiB0aGlzLmdyb3VwZWROb2RlcygpPy5sZW5ndGggPiAwKTtcblxuICBwcm90ZWN0ZWQgaXNFbWlzc2lvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0ZWROb2RlS2V5KCkgPT09IEJsYW5rTm9kZXNLZXkuZW1pc3Npb25zKTtcblxuICBwcm90ZWN0ZWQgZGF0YSA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5pc0VtaXNzaW9uKClcbiAgICAgID8gdGhpcy5ncm91cEVtaXNzaW9ucygpXG4gICAgICA6IE9iamVjdC5mcm9tRW50cmllcyh0aGlzLm5vZGVLZXlzKCkubWFwKG5vZGVLZXkgPT4gW25vZGVLZXksIHRoaXMuZ3JvdXBOb2Rlc0J5S2V5KHsgbm9kZUtleSB9KV0pKVxuICApO1xuICBwcm90ZWN0ZWQgZGF0YUtleXMgPSBjb21wdXRlZCgoKSA9PiBPYmplY3Qua2V5cyh0aGlzLmRhdGEoKSkpO1xuXG4gIHByb3RlY3RlZCBoYXNEYXRhID0gY29tcHV0ZWQoKCkgPT4gT2JqZWN0LnZhbHVlcyh0aGlzLmRhdGEoKSkuZmxhdCgpLmxlbmd0aCA+IDApO1xuXG4gIHByb3RlY3RlZCBmaWx0ZXJUZXJtVHlwZXMgPSBjb21wdXRlZCgoKSA9PiBub2RlS2V5RmlsdGVyVGVybVR5cGVzW3RoaXMuc2VsZWN0ZWROb2RlS2V5KCldKTtcbiAgcHJvdGVjdGVkIGZpbHRlclRlcm0gPSBzaWduYWwoJycpO1xuXG4gIHByb3RlY3RlZCBjc3ZGaWxlbmFtZSA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMubm9kZUtleXMoKS5qb2luKCctJyl9LmNzdmApO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIGxvZ3MgZG9lcyBub3QgcmVtYWluIGRpc3BsYXllZFxuICAgICAgICBpZiAoKHRoaXMuaXNPcmlnaW5hbCgpICYmIHRoaXMuc2VsZWN0ZWRWaWV3KCkgPT09IFZpZXcubG9ncykgfHwgIXRoaXMudmlld3MoKS5pbmNsdWRlcyh0aGlzLnNlbGVjdGVkVmlldygpKSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3LnNldChWaWV3LnRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG5cbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZE5vZGVLZXkoKSB8fCAhdGhpcy5ub2RlS2V5cygpLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWROb2RlS2V5KCkpKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGVLZXkuc2V0KHRoaXMuZmlyc3ROb2RlS2V5KCkpO1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3LnNldChWaWV3LnRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG5cbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZEdyb3VwVGVybSgpIHx8ICF0aGlzLmdyb3VwTm9kZVRlcm1zKCkuaW5jbHVkZXModGhpcy5zZWxlY3RlZEdyb3VwVGVybSgpKSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cFRlcm0uc2V0KHRoaXMuZ3JvdXBOb2RlVGVybXMoKVswXSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBncm91cE5vZGVzQnlLZXk8XG4gICAgVCBleHRlbmRzIElDeWNsZUNvbmZpZyxcbiAgICBSID0gVCBleHRlbmRzIElDeWNsZUNvbmZpZ0FuaW1hbFxuICAgICAgPyBBbmltYWxcbiAgICAgIDogVCBleHRlbmRzIElDeWNsZUNvbmZpZ0VtaXNzaW9uXG4gICAgICAgID8gRW1pc3Npb25cbiAgICAgICAgOiBUIGV4dGVuZHMgSUN5Y2xlQ29uZmlnSW5wdXRcbiAgICAgICAgICA/IEhlc3RpYUlucHV0XG4gICAgICAgICAgOiBUIGV4dGVuZHMgSUN5Y2xlQ29uZmlnUHJhY3RpY2VcbiAgICAgICAgICAgID8gUHJhY3RpY2VcbiAgICAgICAgICAgIDogUHJvZHVjdFxuICA+KHsgbm9kZUtleSB9OiBUKTogSUdyb3VwZWRLZXlzPFI+W10ge1xuICAgIGNvbnN0IG5vZGVzUGVyQ3ljbGUgPSBncm91cE5vZGVzQnlUZXJtPElDeWNsZUpTT05MRCB8IGdyb3VwZWROb2RlLCBSPihcbiAgICAgIHRoaXMuY3ljbGVzKCksXG4gICAgICBub2RlS2V5LFxuICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlcygpLFxuICAgICAgZmlsdGVyQmxhbmtOb2RlKHRoaXMuZmlsdGVyVGVybSgpKVxuICAgICk7XG4gICAgcmV0dXJuIG9yZGVyQnkoZ3JvdXBwZWRLZXlzKG5vZGVzUGVyQ3ljbGUpLCBbJ2tleSddLCBbJ2FzYyddKTtcbiAgfVxuXG4gIHByaXZhdGUgZ3JvdXBFbWlzc2lvbnMoKSB7XG4gICAgY29uc3QgZW1pc3Npb25zUGVyQ3ljbGUgPSBncm91cE5vZGVzQnlUZXJtPElDeWNsZUpTT05MRCB8IGdyb3VwZWROb2RlLCBFbWlzc2lvbj4oXG4gICAgICB0aGlzLmN5Y2xlcygpLFxuICAgICAgQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnMsXG4gICAgICB0aGlzLm9yaWdpbmFsVmFsdWVzKCksXG4gICAgICBmaWx0ZXJCbGFua05vZGUodGhpcy5maWx0ZXJUZXJtKCkpXG4gICAgKTtcbiAgICBjb25zdCB2YWx1ZXM6IElHcm91cGVkS2V5czxFbWlzc2lvbj5bXSA9IG9yZGVyQnkoZ3JvdXBwZWRLZXlzKGVtaXNzaW9uc1BlckN5Y2xlKSwgWydrZXknXSwgWydhc2MnXSk7XG4gICAgY29uc3QgbWV0aG9kVGllcnMgPSBvcmRlckJ5KFxuICAgICAgdW5pcXVlKHZhbHVlcy5tYXAoKHsgdmFsdWUgfSkgPT4gdmFsdWUubWV0aG9kVGllcikpLm1hcChtZXRob2RUaWVyID0+ICh7XG4gICAgICAgIG1ldGhvZFRpZXIsXG4gICAgICAgIG1ldGhvZFRpZXJPcmRlcjogbWV0aG9kVGllck9yZGVyKG1ldGhvZFRpZXIpXG4gICAgICB9KSksXG4gICAgICBbJ21ldGhvZFRpZXJPcmRlciddLFxuICAgICAgWydhc2MnXVxuICAgICk7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIG1ldGhvZFRpZXJzLm1hcCgoeyBtZXRob2RUaWVyIH0pID0+IFttZXRob2RUaWVyLCB2YWx1ZXMuZmlsdGVyKCh7IHZhbHVlIH0pID0+IHZhbHVlLm1ldGhvZFRpZXIgPT09IG1ldGhvZFRpZXIpXSlcbiAgICApIGFzIGdyb3VwZWRFbWlzc2lvbnM7XG4gIH1cblxuICBwcm90ZWN0ZWQgdHJhY2tCeUlkKF9pbmRleDogbnVtYmVyLCBpdGVtOiBJQ3ljbGVKU09OTEQgfCBncm91cGVkTm9kZSkge1xuICAgIHJldHVybiBpdGVtWydAaWQnXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaWx0ZXJCeVRlcm0odGVybTogc3RyaW5nKSB7XG4gICAgdGhpcy5maWx0ZXJUZXJtLnNldCh0ZXJtKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZWxlY3RJbmRleCh7IHRhcmdldDogeyB2YWx1ZSB9IH0pIHtcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXguc2V0KCt2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3ljbGVOb2RlKGN5Y2xlOiBJQ3ljbGVKU09OTEQgfCBncm91cGVkTm9kZSkge1xuICAgIHJldHVybiAndGVybScgaW4gY3ljbGUgPyBjeWNsZS50ZXJtIDogY3ljbGU7XG4gIH1cbn1cbiIsIkBpZiAoaXNHcm91cE5vZGUoKSkge1xuICA8ZGl2IGNsYXNzPVwidGFicyBpcy1tYi0xXCI+XG4gICAgPHVsPlxuICAgICAgQGZvciAodGVybSBvZiBncm91cE5vZGVUZXJtcygpOyB0cmFjayB0ZXJtKSB7XG4gICAgICAgIDxsaSBbY2xhc3MuaXMtYWN0aXZlXT1cInNlbGVjdGVkR3JvdXBUZXJtKCkgPT09IHRlcm1cIj5cbiAgICAgICAgICA8YSAoY2xpY2spPVwic2VsZWN0ZWRHcm91cFRlcm0uc2V0KHRlcm0pXCI+e3sgdGVybS5uYW1lIH19PC9hPlxuICAgICAgICA8L2xpPlxuICAgICAgfVxuICAgIDwvdWw+XG4gIDwvZGl2PlxufVxuXG48ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy12YXJpYWJsZSBpcy1hbGlnbi1pdGVtcy1jZW50ZXIgaXMtMiBpcy1tLTBcIj5cbiAgPGRpdiBjbGFzcz1cImNvbHVtblwiPlxuICAgIEBpZiAoaGFzRGF0YSgpICYmIHNlbGVjdGVkVmlldygpID09PSBWaWV3LnRhYmxlKSB7XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsIGlzLWdob3N0XCJcbiAgICAgICAgKGNsaWNrKT1cInNob3dEb3dubG9hZCA9IHRydWVcIlxuICAgICAgICBuZ2JUb29sdGlwPVwiRG93bmxvYWQgYXMgQ1NWXCJcbiAgICAgICAgW2Rpc2FibGVUb29sdGlwXT1cInNob3dEb3dubG9hZFwiXG4gICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiPlxuICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJmYURvd25sb2FkXCIgc2l6ZT1cImxnXCI+PC9mYS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmIChoYXNEYXRhKCkgJiYgc2VsZWN0ZWRWaWV3KCkgPT09IFZpZXcudGFibGUpIHtcbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvd1wiPlxuICAgICAgPGhlLXNlYXJjaC1leHRlbmRcbiAgICAgICAgY2xhc3M9XCJpcy1zZWNvbmRhcnkgaXMtc21hbGxcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkZpbHRlciB0ZXJtcyBieSBuYW1lXCJcbiAgICAgICAgKHNlYXJjaCk9XCJmaWx0ZXJCeVRlcm0oJGV2ZW50KVwiPjwvaGUtc2VhcmNoLWV4dGVuZD5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKHZpZXdzKCk/Lmxlbmd0aCA+IDEpIHtcbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnNcIj5cbiAgICAgICAgQGZvciAodmlldyBvZiB2aWV3cygpOyB0cmFjayB2aWV3KSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIlxuICAgICAgICAgICAgICBbY2xhc3MuaXMtc2VsZWN0ZWRdPVwic2VsZWN0ZWRWaWV3KCkgPT09IHZpZXdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRWaWV3LnNldCh2aWV3KVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24gaXMtc21hbGxcIj5cbiAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJ2aWV3SWNvblt2aWV3XVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWhpZGRlbi1tb2JpbGVcIj57eyB2aWV3IH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cblxuQGlmIChpc05vZGVLZXlBbGxvd2VkKCkpIHtcbiAgQHN3aXRjaCAoc2VsZWN0ZWRWaWV3KCkpIHtcbiAgICBAY2FzZSAoVmlldy50YWJsZSkge1xuICAgICAgPGRpdiBjbGFzcz1cImlzLXB4LTMgaXMtcGItM1wiPlxuICAgICAgICBAaWYgKGhhc0RhdGEoKSkge1xuICAgICAgICAgIDxoZS1kYXRhLXRhYmxlIGNsYXNzPVwibWItMSBpcy1zbWFsbFwiIFtzbWFsbF09XCJ0cnVlXCIgbWF4SGVpZ2h0PVwiMzIwXCI+XG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBpcy1mdWxsd2lkdGggaXMtbmFycm93IGlzLXN0cmlwZWRcIj5cbiAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIEBpZiAoZGF0YUtleXMoKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJoYXMtdGV4dC13ZWlnaHQtYm9sZFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ3aWR0aC1hdXRvXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIFtjbGFzcy5pcy1oaWRkZW5dPVwiaXNHcm91cE5vZGUoKVwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGRhdGFLZXkgb2YgZGF0YUtleXMoKTsgdHJhY2sgZGF0YUtleTsgbGV0IGRhdGFLZXlMYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGRhdGEoKVtkYXRhS2V5XT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggW2F0dHIuY29sc3Bhbl09XCJkYXRhKClbZGF0YUtleV0ubGVuZ3RoXCIgW2NsYXNzLmhhcy1ib3JkZXItcmlnaHRdPVwiIWRhdGFLZXlMYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGRhdGFLZXkgfCBrZXlUb0xhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImhhcy10ZXh0LXdlaWdodC1zZW1pYm9sZFwiPlxuICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0XCI+PC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy1ib3JkZXItcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cImlzR3JvdXBOb2RlKClcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgQGZvciAoZGF0YUtleSBvZiBkYXRhS2V5cygpOyB0cmFjayBkYXRhS2V5OyBsZXQgZGF0YUtleUxhc3QgPSAkbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICBAZm9yIChub2RlIG9mIGRhdGEoKVtkYXRhS2V5XTsgdHJhY2sgbm9kZTsgbGV0IG5vZGVMYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIm5vZGUudmFsdWUudGVybS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtYm9yZGVyLXJpZ2h0XT1cImRhdGFLZXlzKCkubGVuZ3RoID4gMSAmJiAhZGF0YUtleUxhc3QgJiYgbm9kZUxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoZS1ub2RlLWxpbmsgW25vZGVdPVwibm9kZS52YWx1ZS50ZXJtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySHRtbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudmFsdWUudGVybS5uYW1lIHwgZWxsaXBzaXM6IDMwIHwgY29tcG91bmQ6IG5vZGUudmFsdWUudGVybS50ZXJtVHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImlzLWl0YWxpYyBoYXMtdGV4dC13ZWlnaHQtc2VtaWJvbGRcIj5cbiAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtYm9yZGVyLXJpZ2h0XCIgW2NsYXNzLmlzLWhpZGRlbl09XCJpc0dyb3VwTm9kZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cImJhc2VVcmwgKyAnL3NjaGVtYS9DeWNsZSNmdW5jdGlvbmFsVW5pdCdcIiB0YXJnZXQ9XCJfYmxhbmtcIj5GdW5jdGlvbmFsIHVuaXQ8L2E+XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgQGZvciAoZGF0YUtleSBvZiBkYXRhS2V5cygpOyB0cmFjayBkYXRhS2V5OyBsZXQgZGF0YUtleUxhc3QgPSAkbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICBAZm9yIChub2RlIG9mIGRhdGEoKVtkYXRhS2V5XTsgdHJhY2sgbm9kZTsgbGV0IG5vZGVMYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIm5vZGUudmFsdWUudGVybS51bml0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLWJvcmRlci1yaWdodF09XCJkYXRhS2V5cygpLmxlbmd0aCA+IDEgJiYgIWRhdGFLZXlMYXN0ICYmIG5vZGVMYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cIm5vZGUudmFsdWUudGVybS51bml0cyB8IGNvbXBvdW5kOiBub2RlLnZhbHVlLnRlcm0udGVybVR5cGVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aGUtdGVybXMtdW5pdHMtZGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpcy1pbmxpbmUtYmxvY2sgaXMtbWwtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXJtXT1cIm5vZGUudmFsdWUudGVybVwiPjwvaGUtdGVybXMtdW5pdHMtZGVzY3JpcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICBAZm9yIChjeWNsZSBvZiBjeWNsZXMoKTsgdHJhY2sgdHJhY2tCeUlkKGN5Y2xlSW5kZXgsIGN5Y2xlKTsgbGV0IGN5Y2xlSW5kZXggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0XCIgW2F0dHIudGl0bGVdPVwiZGVmYXVsdExhYmVsKGN5Y2xlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxoZS1ub2RlLWxpbmsgW25vZGVdPVwiY3ljbGVOb2RlKGN5Y2xlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgY3ljbGVJbmRleCArIDEgfX0uIHt7IGRlZmF1bHRMYWJlbChjeWNsZSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9oZS1ub2RlLWxpbms+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImhhcy1ib3JkZXItcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cImlzR3JvdXBOb2RlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aGUtY3ljbGVzLWZ1bmN0aW9uYWwtdW5pdC1tZWFzdXJlIFtjeWNsZV09XCJjeWNsZVwiPjwvaGUtY3ljbGVzLWZ1bmN0aW9uYWwtdW5pdC1tZWFzdXJlPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChkYXRhS2V5IG9mIGRhdGFLZXlzKCk7IHRyYWNrIGRhdGFLZXk7IGxldCBkYXRhS2V5TGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGZvciAobm9kZSBvZiBkYXRhKClbZGF0YUtleV07IHRyYWNrIG5vZGU7IGxldCBub2RlTGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpcy1ub3dyYXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLWJvcmRlci1yaWdodF09XCJkYXRhS2V5cygpLmxlbmd0aCA+IDEgJiYgIWRhdGFLZXlMYXN0ICYmIG5vZGVMYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobm9kZS52YWx1ZS52YWx1ZXNbY3ljbGVbJ0BpZCddXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRyaWdnZXItcG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiUG9wb3Zlcl09XCJkZXRhaWxzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcG92ZXJDbGFzcz1cImlzLW5hcnJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcD1cIm5nYlBvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwibGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyQ29udGV4dF09XCJ7IGRhdGE6IG5vZGUudmFsdWUudmFsdWVzW2N5Y2xlWydAaWQnXV0sIGN5Y2xlLCBrZXk6IGRhdGFLZXkgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gcG9pbnRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKG5vZGUudmFsdWUudmFsdWVzW2N5Y2xlWydAaWQnXV0udmFsdWUsIG5vZGUudmFsdWUudGVybVsnQGlkJ10pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHByZWNpc2lvbjogM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkZWZhdWx0OiAnLSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoZS1ibGFuay1ub2RlLXN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhU3RhdGVdPVwiZGF0YVN0YXRlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlLnZhbHVlLnZhbHVlc1tjeWNsZVsnQGlkJ11dLm5vZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9XCJ2YWx1ZVwiPjwvaGUtYmxhbmstbm9kZS1zdGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPi08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgPC9oZS1kYXRhLXRhYmxlPlxuICAgICAgICAgIDxoZS1ibGFuay1ub2RlLXN0YXRlLW5vdGljZVxuICAgICAgICAgICAgW2RhdGFTdGF0ZV09XCJkYXRhU3RhdGUoKVwiXG4gICAgICAgICAgICBbc2hvd0RlbGV0ZWRdPVwiZmlyc3ROb2RlS2V5KCkgPT09IEJsYW5rTm9kZXNLZXkuZW1pc3Npb25zXCI+PC9oZS1ibGFuay1ub2RlLXN0YXRlLW5vdGljZT5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlzLXB0LTMgaGFzLXRleHQtY2VudGVyZWRcIj5cbiAgICAgICAgICAgIDxzcGFuPk5vIGRhdGEgYXZhaWxhYmxlPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1wbC0xXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhZmlsdGVyVGVybSgpXCI+bWF0Y2hpbmcgeW91ciBzZWFyY2ggY3JpdGVyaWE8L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxuICAgICAgICAgICAgQGlmIChzaG93U3dpdGNoVG9SZWNhbGN1bGF0ZWQoKSkge1xuICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICBTd2l0Y2ggdG9cbiAgICAgICAgICAgICAgICA8Y29kZT5yZWNhbGN1bGF0ZWQ8L2NvZGU+XG4gICAgICAgICAgICAgICAgdmVyc2lvbi5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGNhc2UgKFZpZXcuY2hhcnQpIHtcbiAgICAgIEBzd2l0Y2ggKGZpcnN0Tm9kZUtleSgpKSB7XG4gICAgICAgIEBjYXNlIChCbGFua05vZGVzS2V5LmlucHV0cykge1xuICAgICAgICAgIDxoZS1jeWNsZXMtcmVzdWx0IFtjeWNsZXNdPVwiY3ljbGVzKClcIj48L2hlLWN5Y2xlcy1yZXN1bHQ+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKEJsYW5rTm9kZXNLZXkuZW1pc3Npb25zKSB7XG4gICAgICAgICAgPGhlLWN5Y2xlcy1lbWlzc2lvbnMtY2hhcnQgW2N5Y2xlc109XCJjeWNsZXMoKVwiPjwvaGUtY3ljbGVzLWVtaXNzaW9ucy1jaGFydD5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBAY2FzZSAoVmlldy50aW1lbGluZSkge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlbGVjdEN5Y2xlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaXMtcHgtMyBpcy1wYi0zXCI+XG4gICAgICAgIDxoZS1jeWNsZXMtbm9kZXMtdGltZWxpbmVcbiAgICAgICAgICBbcmVjYWxjdWxhdGVkVmFsdWVzXT1cInRpbWVsaW5lVmFsdWVzKClcIlxuICAgICAgICAgIFtkYXRhU3RhdGVdPVwiZGF0YVN0YXRlKClcIj48L2hlLWN5Y2xlcy1ub2Rlcy10aW1lbGluZT5cbiAgICAgICAgPGhlLWJsYW5rLW5vZGUtc3RhdGUtbm90aWNlIFtkYXRhU3RhdGVdPVwiZGF0YVN0YXRlKClcIj48L2hlLWJsYW5rLW5vZGUtc3RhdGUtbm90aWNlPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIEBjYXNlIChWaWV3LmxvZ3MpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3RDeWNsZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgQGlmIChub2RlS2V5cygpLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYnMgaXMtbWItMlwiPlxuICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgIEBmb3IgKG5vZGVLZXkgb2Ygbm9kZUtleXMoKTsgdHJhY2sgbm9kZUtleSkge1xuICAgICAgICAgICAgICA8bGkgW2NsYXNzLmlzLWFjdGl2ZV09XCJzZWxlY3RlZE5vZGVLZXkoKSA9PT0gbm9kZUtleVwiPlxuICAgICAgICAgICAgICAgIDxhIChjbGljayk9XCJzZWxlY3RlZE5vZGVLZXkuc2V0KG5vZGVLZXkpXCI+e3sgbm9kZUtleSB8IGtleVRvTGFiZWwgfX08L2E+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKHNlbGVjdGVkTm9kZSgpKSB7XG4gICAgICAgIDxoZS1ub2RlLWxvZ3MtbW9kZWxzXG4gICAgICAgICAgW25vZGVdPVwic2VsZWN0ZWROb2RlKClcIlxuICAgICAgICAgIFtub2RlS2V5XT1cInNlbGVjdGVkTm9kZUtleSgpXCJcbiAgICAgICAgICBbbG9nc0tleV09XCJzZWxlY3RlZExvZ3NLZXkoKVwiXG4gICAgICAgICAgW29yaWdpbmFsVmFsdWVzXT1cInNlbGVjdGVkT3JpZ2luYWxWYWx1ZXMoKVwiXG4gICAgICAgICAgW3JlY2FsY3VsYXRlZFZhbHVlc109XCJzZWxlY3RlZFJlY2FsY3VsYXRlZFZhbHVlcygpXCJcbiAgICAgICAgICBbZmlsdGVyVGVybVR5cGVzXT1cImZpbHRlclRlcm1UeXBlcygpXCI+PC9oZS1ub2RlLWxvZ3MtbW9kZWxzPlxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5AaWYgKHNob3dEb3dubG9hZCkge1xuICA8aGUtbm9kZS1jc3YtZXhwb3J0LWNvbmZpcm1cbiAgICBbbm9kZXNdPVwiY3ljbGVzKClcIlxuICAgIFtmaWxlbmFtZV09XCJjc3ZGaWxlbmFtZSgpXCJcbiAgICBbaXNVcGxvYWRdPVwiZmFsc2VcIlxuICAgIFtoZWFkZXJLZXlzXT1cImhlYWRlcktleXMoKVwiXG4gICAgKGNsb3NlZCk9XCJzaG93RG93bmxvYWQgPSBmYWxzZVwiPjwvaGUtbm9kZS1jc3YtZXhwb3J0LWNvbmZpcm0+XG59XG5cbjxuZy10ZW1wbGF0ZSAjZGV0YWlscyBsZXQtbm9kZT1cImN5Y2xlXCIgbGV0LWRhdGE9XCJkYXRhXCIgbGV0LWtleT1cImtleVwiPlxuICA8cD5cbiAgICA8Yj57eyBkZWZhdWx0TGFiZWwobm9kZSkgfX08L2I+XG4gIDwvcD5cbiAgPGhlLW5vZGUtdmFsdWUtZGV0YWlsc1xuICAgIFtkYXRhXT1cImRhdGFcIlxuICAgIFtkYXRhU3RhdGVdPVwiZGF0YVN0YXRlKClcIlxuICAgIFtub2RlVHlwZV09XCJub2RlWydAdHlwZSddXCJcbiAgICBbZGF0YUtleV09XCJrZXlcIj48L2hlLW5vZGUtdmFsdWUtZGV0YWlscz5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2VsZWN0Q3ljbGU+XG4gIEBpZiAoY3ljbGVzKCkubGVuZ3RoID4gMSkge1xuICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zIGlzLXB5LTIgaXMtcHgtM1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24gaXMtc21hbGwgaXMtc3RhdGljIGlzLXNlY29uZGFyeVwiPlNlbGVjdCBhIEN5Y2xlPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0IGlzLXNtYWxsIGlzLWZ1bGx3aWR0aCBpcy1zZWNvbmRhcnlcIj5cbiAgICAgICAgICA8c2VsZWN0IChjaGFuZ2UpPVwic2VsZWN0SW5kZXgoJGV2ZW50KVwiPlxuICAgICAgICAgICAgQGZvciAodmFsdWUgb2YgY3ljbGVzKCk7IHRyYWNrIHZhbHVlOyBsZXQgY3ljbGVJbmRleCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJjeWNsZUluZGV4XCI+e3sgY3ljbGVJbmRleCArIDEgfX0uIHt7IGRlZmF1bHRMYWJlbCh2YWx1ZSkgfX08L29wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -31,10 +31,10 @@ export class CyclesNodesTimelineComponent {
31
31
  return this.elementRef.nativeElement.offsetWidth - 60;
32
32
  }
33
33
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: CyclesNodesTimelineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: CyclesNodesTimelineComponent, isStandalone: true, selector: "he-cycles-nodes-timeline", inputs: { recalculatedValues: { classPropertyName: "recalculatedValues", publicName: "recalculatedValues", isSignal: true, isRequired: false, transformFunction: null }, dataState: { classPropertyName: "dataState", publicName: "dataState", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<ul class=\"content is-pl-4 is-ml-4 is-pb-4\">\n @for (\n blankNode of blankNodes() | sortBy: ['startDate', 'endDate'] : ['asc', 'asc'];\n track trackByBlankNode($index, blankNode)\n ) {\n <li class=\"is-relative is-m-0\">\n <div class=\"is-relative\" [style.width]=\"lineWidth + 'px'\">\n @if (blankNode.startDate) {\n <span>{{ blankNode.startDate | date: 'YYYY-MM-dd' }}</span>\n }\n @if (!blankNode.startDate) {\n <span>\n @if (blankNode.term?.termType === TermTermType.operation) {\n No date\n }\n </span>\n }\n <span class=\"px-1\" [class.is-invisible]=\"!blankNode.startDate || !blankNode.endDate\">-</span>\n <span [class.is-invisible]=\"!blankNode.endDate\">{{ blankNode.endDate || now | date: 'YYYY-MM-dd' }}</span>\n <span class=\"pl-4\" [innerHtml]=\"blankNode.term.name | compound\"></span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"dataState()\"\n [node]=\"blankNode\"\n key=\"value\"></he-blank-node-state>\n </div>\n </li>\n }\n</ul>\n", styles: ["ul{max-height:400px;overflow-y:auto}ul li{width:4px;padding-top:20px;background:#193957}ul li:after{content:\"\";position:absolute;left:50%;bottom:2px;transform:translate(-50%);width:20px;height:20px;border-radius:50%;background:inherit}ul li>div{width:600px;margin-left:24px}ul li>div>span{display:inline-block}ul li>div>span:nth-child(1),ul li>div>span:nth-child(3){width:94px}\n"], dependencies: [{ kind: "component", type: BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["dataState", "nodeType", "dataKey", "key", "node", "state", "linkClass"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: CompoundPipe, name: "compound" }, { kind: "pipe", type: SortByPipe, name: "sortBy" }] }); }
34
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: CyclesNodesTimelineComponent, isStandalone: true, selector: "he-cycles-nodes-timeline", inputs: { recalculatedValues: { classPropertyName: "recalculatedValues", publicName: "recalculatedValues", isSignal: true, isRequired: false, transformFunction: null }, dataState: { classPropertyName: "dataState", publicName: "dataState", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<ul class=\"content is-pl-4 is-ml-4 is-pb-4\">\n @for (\n blankNode of blankNodes() | sortBy: ['startDate', 'endDate'] : ['asc', 'asc'];\n track trackByBlankNode($index, blankNode)\n ) {\n <li class=\"is-relative is-m-0\">\n <div class=\"is-relative\" [style.width]=\"lineWidth + 'px'\">\n @if (blankNode.startDate) {\n <span>{{ blankNode.startDate | date: 'YYYY-MM-dd' }}</span>\n }\n @if (!blankNode.startDate) {\n <span>\n @if (blankNode.term?.termType === TermTermType.operation) {\n No date\n }\n </span>\n }\n <span class=\"px-1\" [class.is-invisible]=\"!blankNode.startDate || !blankNode.endDate\">-</span>\n <span [class.is-invisible]=\"!blankNode.endDate\">{{ blankNode.endDate || now | date: 'YYYY-MM-dd' }}</span>\n <span class=\"pl-4\" [innerHtml]=\"blankNode.term.name | compound: blankNode.term.termType\"></span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"dataState()\"\n [node]=\"blankNode\"\n key=\"value\"></he-blank-node-state>\n </div>\n </li>\n }\n</ul>\n", styles: ["ul{max-height:400px;overflow-y:auto}ul li{width:4px;padding-top:20px;background:#193957}ul li:after{content:\"\";position:absolute;left:50%;bottom:2px;transform:translate(-50%);width:20px;height:20px;border-radius:50%;background:inherit}ul li>div{width:600px;margin-left:24px}ul li>div>span{display:inline-block}ul li>div>span:nth-child(1),ul li>div>span:nth-child(3){width:94px}\n"], dependencies: [{ kind: "component", type: BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["dataState", "nodeType", "dataKey", "key", "node", "state", "linkClass"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: CompoundPipe, name: "compound" }, { kind: "pipe", type: SortByPipe, name: "sortBy" }] }); }
35
35
  }
36
36
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: CyclesNodesTimelineComponent, decorators: [{
37
37
  type: Component,
38
- args: [{ selector: 'he-cycles-nodes-timeline', standalone: true, imports: [BlankNodeStateComponent, DatePipe, CompoundPipe, SortByPipe], template: "<ul class=\"content is-pl-4 is-ml-4 is-pb-4\">\n @for (\n blankNode of blankNodes() | sortBy: ['startDate', 'endDate'] : ['asc', 'asc'];\n track trackByBlankNode($index, blankNode)\n ) {\n <li class=\"is-relative is-m-0\">\n <div class=\"is-relative\" [style.width]=\"lineWidth + 'px'\">\n @if (blankNode.startDate) {\n <span>{{ blankNode.startDate | date: 'YYYY-MM-dd' }}</span>\n }\n @if (!blankNode.startDate) {\n <span>\n @if (blankNode.term?.termType === TermTermType.operation) {\n No date\n }\n </span>\n }\n <span class=\"px-1\" [class.is-invisible]=\"!blankNode.startDate || !blankNode.endDate\">-</span>\n <span [class.is-invisible]=\"!blankNode.endDate\">{{ blankNode.endDate || now | date: 'YYYY-MM-dd' }}</span>\n <span class=\"pl-4\" [innerHtml]=\"blankNode.term.name | compound\"></span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"dataState()\"\n [node]=\"blankNode\"\n key=\"value\"></he-blank-node-state>\n </div>\n </li>\n }\n</ul>\n", styles: ["ul{max-height:400px;overflow-y:auto}ul li{width:4px;padding-top:20px;background:#193957}ul li:after{content:\"\";position:absolute;left:50%;bottom:2px;transform:translate(-50%);width:20px;height:20px;border-radius:50%;background:inherit}ul li>div{width:600px;margin-left:24px}ul li>div>span{display:inline-block}ul li>div>span:nth-child(1),ul li>div>span:nth-child(3){width:94px}\n"] }]
38
+ args: [{ selector: 'he-cycles-nodes-timeline', standalone: true, imports: [BlankNodeStateComponent, DatePipe, CompoundPipe, SortByPipe], template: "<ul class=\"content is-pl-4 is-ml-4 is-pb-4\">\n @for (\n blankNode of blankNodes() | sortBy: ['startDate', 'endDate'] : ['asc', 'asc'];\n track trackByBlankNode($index, blankNode)\n ) {\n <li class=\"is-relative is-m-0\">\n <div class=\"is-relative\" [style.width]=\"lineWidth + 'px'\">\n @if (blankNode.startDate) {\n <span>{{ blankNode.startDate | date: 'YYYY-MM-dd' }}</span>\n }\n @if (!blankNode.startDate) {\n <span>\n @if (blankNode.term?.termType === TermTermType.operation) {\n No date\n }\n </span>\n }\n <span class=\"px-1\" [class.is-invisible]=\"!blankNode.startDate || !blankNode.endDate\">-</span>\n <span [class.is-invisible]=\"!blankNode.endDate\">{{ blankNode.endDate || now | date: 'YYYY-MM-dd' }}</span>\n <span class=\"pl-4\" [innerHtml]=\"blankNode.term.name | compound: blankNode.term.termType\"></span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"dataState()\"\n [node]=\"blankNode\"\n key=\"value\"></he-blank-node-state>\n </div>\n </li>\n }\n</ul>\n", styles: ["ul{max-height:400px;overflow-y:auto}ul li{width:4px;padding-top:20px;background:#193957}ul li:after{content:\"\";position:absolute;left:50%;bottom:2px;transform:translate(-50%);width:20px;height:20px;border-radius:50%;background:inherit}ul li>div{width:600px;margin-left:24px}ul li>div>span{display:inline-block}ul li>div>span:nth-child(1),ul li>div>span:nth-child(3){width:94px}\n"] }]
39
39
  }] });
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ljbGVzLW5vZGVzLXRpbWVsaW5lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jeWNsZXMvY3ljbGVzLW5vZGVzLXRpbWVsaW5lL2N5Y2xlcy1ub2Rlcy10aW1lbGluZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvY3ljbGVzL2N5Y2xlcy1ub2Rlcy10aW1lbGluZS9jeWNsZXMtbm9kZXMtdGltZWxpbmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFrQixNQUFNLHNCQUFzQixDQUFDO0FBRXBFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ25HLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBUzFELE1BQU0sT0FBTyw0QkFBNEI7SUFQekM7UUFRVSxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTlCLHVCQUFrQixHQUFHLEtBQUssQ0FBQyxFQUFzQixDQUFDLENBQUM7UUFDbkQsY0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdEMsUUFBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDakIsaUJBQVksR0FBRyxZQUFZLENBQUM7UUFFNUIsZUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FDbkMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2hDLFdBQVcsSUFBSSxDQUFDO1lBQ2QsQ0FBQyxDQUFDLENBQUM7WUFDSCxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUM7Z0JBQ1osQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTTtvQkFDZixDQUFDLENBQUM7d0JBQ0UsR0FBRyxDQUFDO3dCQUNKLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztxQkFDdEI7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FDUixDQUNGLENBQUM7S0FTSDtJQVBRLGdCQUFnQixDQUFDLE1BQWMsRUFBRSxFQUFFLElBQUksRUFBa0I7UUFDOUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDeEQsQ0FBQzs4R0E5QlUsNEJBQTRCO2tHQUE1Qiw0QkFBNEIsbVlDaEJ6Qyx5bkNBNkJBLHViRGZZLHVCQUF1Qiw4SUFBRSxRQUFRLHdDQUFFLFlBQVksNENBQUUsVUFBVTs7MkZBRTFELDRCQUE0QjtrQkFQeEMsU0FBUzsrQkFDRSwwQkFBMEIsY0FHeEIsSUFBSSxXQUNQLENBQUMsdUJBQXVCLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEYXRhU3RhdGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2FwaSc7XG5pbXBvcnQgeyBUZXJtVGVybVR5cGUsIGJsYW5rTm9kZXNUeXBlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEnO1xuXG5pbXBvcnQgeyBCbGFua05vZGVTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbW1vbi9ibGFuay1ub2RlLXN0YXRlL2JsYW5rLW5vZGUtc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IFNvcnRCeVBpcGUgfSBmcm9tICcuLi8uLi9jb21tb24vc29ydC1ieS5waXBlJztcbmltcG9ydCB7IENvbXBvdW5kUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9jb21wb3VuZC5waXBlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGUtY3ljbGVzLW5vZGVzLXRpbWVsaW5lJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N5Y2xlcy1ub2Rlcy10aW1lbGluZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2N5Y2xlcy1ub2Rlcy10aW1lbGluZS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQmxhbmtOb2RlU3RhdGVDb21wb25lbnQsIERhdGVQaXBlLCBDb21wb3VuZFBpcGUsIFNvcnRCeVBpcGVdXG59KVxuZXhwb3J0IGNsYXNzIEN5Y2xlc05vZGVzVGltZWxpbmVDb21wb25lbnQge1xuICBwcml2YXRlIGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG5cbiAgcHJvdGVjdGVkIHJlY2FsY3VsYXRlZFZhbHVlcyA9IGlucHV0KFtdIGFzIGJsYW5rTm9kZXNUeXBlW10pO1xuICBwcm90ZWN0ZWQgZGF0YVN0YXRlID0gaW5wdXQoRGF0YVN0YXRlLm9yaWdpbmFsKTtcblxuICBwcm90ZWN0ZWQgbm93ID0gbmV3IERhdGUoKTtcbiAgcHJvdGVjdGVkIFRlcm1UZXJtVHlwZSA9IFRlcm1UZXJtVHlwZTtcblxuICBwcm90ZWN0ZWQgYmxhbmtOb2RlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5yZWNhbGN1bGF0ZWRWYWx1ZXMoKS5tYXAodiA9PlxuICAgICAgJ3N0YXJ0RGF0ZScgaW4gdlxuICAgICAgICA/IHZcbiAgICAgICAgOiAnZGF0ZXMnIGluIHZcbiAgICAgICAgICA/IHYuZGF0ZXM/Lmxlbmd0aFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgLi4udixcbiAgICAgICAgICAgICAgICBzdGFydERhdGU6IHYuZGF0ZXNbMF1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB2XG4gICAgICAgICAgOiB2XG4gICAgKVxuICApO1xuXG4gIHB1YmxpYyB0cmFja0J5QmxhbmtOb2RlKF9pbmRleDogbnVtYmVyLCB7IHRlcm0gfTogYmxhbmtOb2Rlc1R5cGUpIHtcbiAgICByZXR1cm4gdGVybVsnQGlkJ107XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxpbmVXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggLSA2MDtcbiAgfVxufVxuIiwiPHVsIGNsYXNzPVwiY29udGVudCBpcy1wbC00IGlzLW1sLTQgaXMtcGItNFwiPlxuICBAZm9yIChcbiAgICBibGFua05vZGUgb2YgYmxhbmtOb2RlcygpIHwgc29ydEJ5OiBbJ3N0YXJ0RGF0ZScsICdlbmREYXRlJ10gOiBbJ2FzYycsICdhc2MnXTtcbiAgICB0cmFjayB0cmFja0J5QmxhbmtOb2RlKCRpbmRleCwgYmxhbmtOb2RlKVxuICApIHtcbiAgICA8bGkgY2xhc3M9XCJpcy1yZWxhdGl2ZSBpcy1tLTBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpcy1yZWxhdGl2ZVwiIFtzdHlsZS53aWR0aF09XCJsaW5lV2lkdGggKyAncHgnXCI+XG4gICAgICAgIEBpZiAoYmxhbmtOb2RlLnN0YXJ0RGF0ZSkge1xuICAgICAgICAgIDxzcGFuPnt7IGJsYW5rTm9kZS5zdGFydERhdGUgfCBkYXRlOiAnWVlZWS1NTS1kZCcgfX08L3NwYW4+XG4gICAgICAgIH1cbiAgICAgICAgQGlmICghYmxhbmtOb2RlLnN0YXJ0RGF0ZSkge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgQGlmIChibGFua05vZGUudGVybT8udGVybVR5cGUgPT09IFRlcm1UZXJtVHlwZS5vcGVyYXRpb24pIHtcbiAgICAgICAgICAgICAgTm8gZGF0ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICA8c3BhbiBjbGFzcz1cInB4LTFcIiBbY2xhc3MuaXMtaW52aXNpYmxlXT1cIiFibGFua05vZGUuc3RhcnREYXRlIHx8ICFibGFua05vZGUuZW5kRGF0ZVwiPi08L3NwYW4+XG4gICAgICAgIDxzcGFuIFtjbGFzcy5pcy1pbnZpc2libGVdPVwiIWJsYW5rTm9kZS5lbmREYXRlXCI+e3sgYmxhbmtOb2RlLmVuZERhdGUgfHwgbm93IHwgZGF0ZTogJ1lZWVktTU0tZGQnIH19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTRcIiBbaW5uZXJIdG1sXT1cImJsYW5rTm9kZS50ZXJtLm5hbWUgfCBjb21wb3VuZFwiPjwvc3Bhbj5cbiAgICAgICAgPGhlLWJsYW5rLW5vZGUtc3RhdGVcbiAgICAgICAgICBjbGFzcz1cIm1sLTFcIlxuICAgICAgICAgIFtkYXRhU3RhdGVdPVwiZGF0YVN0YXRlKClcIlxuICAgICAgICAgIFtub2RlXT1cImJsYW5rTm9kZVwiXG4gICAgICAgICAga2V5PVwidmFsdWVcIj48L2hlLWJsYW5rLW5vZGUtc3RhdGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2xpPlxuICB9XG48L3VsPlxuIl19
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ljbGVzLW5vZGVzLXRpbWVsaW5lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jeWNsZXMvY3ljbGVzLW5vZGVzLXRpbWVsaW5lL2N5Y2xlcy1ub2Rlcy10aW1lbGluZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvY3ljbGVzL2N5Y2xlcy1ub2Rlcy10aW1lbGluZS9jeWNsZXMtbm9kZXMtdGltZWxpbmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFrQixNQUFNLHNCQUFzQixDQUFDO0FBRXBFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ25HLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBUzFELE1BQU0sT0FBTyw0QkFBNEI7SUFQekM7UUFRVSxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTlCLHVCQUFrQixHQUFHLEtBQUssQ0FBQyxFQUFzQixDQUFDLENBQUM7UUFDbkQsY0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdEMsUUFBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDakIsaUJBQVksR0FBRyxZQUFZLENBQUM7UUFFNUIsZUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FDbkMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2hDLFdBQVcsSUFBSSxDQUFDO1lBQ2QsQ0FBQyxDQUFDLENBQUM7WUFDSCxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUM7Z0JBQ1osQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTTtvQkFDZixDQUFDLENBQUM7d0JBQ0UsR0FBRyxDQUFDO3dCQUNKLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztxQkFDdEI7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FDUixDQUNGLENBQUM7S0FTSDtJQVBRLGdCQUFnQixDQUFDLE1BQWMsRUFBRSxFQUFFLElBQUksRUFBa0I7UUFDOUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDeEQsQ0FBQzs4R0E5QlUsNEJBQTRCO2tHQUE1Qiw0QkFBNEIsbVlDaEJ6QyxrcENBNkJBLHViRGZZLHVCQUF1Qiw4SUFBRSxRQUFRLHdDQUFFLFlBQVksNENBQUUsVUFBVTs7MkZBRTFELDRCQUE0QjtrQkFQeEMsU0FBUzsrQkFDRSwwQkFBMEIsY0FHeEIsSUFBSSxXQUNQLENBQUMsdUJBQXVCLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEYXRhU3RhdGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2FwaSc7XG5pbXBvcnQgeyBUZXJtVGVybVR5cGUsIGJsYW5rTm9kZXNUeXBlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEnO1xuXG5pbXBvcnQgeyBCbGFua05vZGVTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbW1vbi9ibGFuay1ub2RlLXN0YXRlL2JsYW5rLW5vZGUtc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IFNvcnRCeVBpcGUgfSBmcm9tICcuLi8uLi9jb21tb24vc29ydC1ieS5waXBlJztcbmltcG9ydCB7IENvbXBvdW5kUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9jb21wb3VuZC5waXBlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGUtY3ljbGVzLW5vZGVzLXRpbWVsaW5lJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N5Y2xlcy1ub2Rlcy10aW1lbGluZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2N5Y2xlcy1ub2Rlcy10aW1lbGluZS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQmxhbmtOb2RlU3RhdGVDb21wb25lbnQsIERhdGVQaXBlLCBDb21wb3VuZFBpcGUsIFNvcnRCeVBpcGVdXG59KVxuZXhwb3J0IGNsYXNzIEN5Y2xlc05vZGVzVGltZWxpbmVDb21wb25lbnQge1xuICBwcml2YXRlIGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG5cbiAgcHJvdGVjdGVkIHJlY2FsY3VsYXRlZFZhbHVlcyA9IGlucHV0KFtdIGFzIGJsYW5rTm9kZXNUeXBlW10pO1xuICBwcm90ZWN0ZWQgZGF0YVN0YXRlID0gaW5wdXQoRGF0YVN0YXRlLm9yaWdpbmFsKTtcblxuICBwcm90ZWN0ZWQgbm93ID0gbmV3IERhdGUoKTtcbiAgcHJvdGVjdGVkIFRlcm1UZXJtVHlwZSA9IFRlcm1UZXJtVHlwZTtcblxuICBwcm90ZWN0ZWQgYmxhbmtOb2RlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5yZWNhbGN1bGF0ZWRWYWx1ZXMoKS5tYXAodiA9PlxuICAgICAgJ3N0YXJ0RGF0ZScgaW4gdlxuICAgICAgICA/IHZcbiAgICAgICAgOiAnZGF0ZXMnIGluIHZcbiAgICAgICAgICA/IHYuZGF0ZXM/Lmxlbmd0aFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgLi4udixcbiAgICAgICAgICAgICAgICBzdGFydERhdGU6IHYuZGF0ZXNbMF1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB2XG4gICAgICAgICAgOiB2XG4gICAgKVxuICApO1xuXG4gIHB1YmxpYyB0cmFja0J5QmxhbmtOb2RlKF9pbmRleDogbnVtYmVyLCB7IHRlcm0gfTogYmxhbmtOb2Rlc1R5cGUpIHtcbiAgICByZXR1cm4gdGVybVsnQGlkJ107XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxpbmVXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggLSA2MDtcbiAgfVxufVxuIiwiPHVsIGNsYXNzPVwiY29udGVudCBpcy1wbC00IGlzLW1sLTQgaXMtcGItNFwiPlxuICBAZm9yIChcbiAgICBibGFua05vZGUgb2YgYmxhbmtOb2RlcygpIHwgc29ydEJ5OiBbJ3N0YXJ0RGF0ZScsICdlbmREYXRlJ10gOiBbJ2FzYycsICdhc2MnXTtcbiAgICB0cmFjayB0cmFja0J5QmxhbmtOb2RlKCRpbmRleCwgYmxhbmtOb2RlKVxuICApIHtcbiAgICA8bGkgY2xhc3M9XCJpcy1yZWxhdGl2ZSBpcy1tLTBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpcy1yZWxhdGl2ZVwiIFtzdHlsZS53aWR0aF09XCJsaW5lV2lkdGggKyAncHgnXCI+XG4gICAgICAgIEBpZiAoYmxhbmtOb2RlLnN0YXJ0RGF0ZSkge1xuICAgICAgICAgIDxzcGFuPnt7IGJsYW5rTm9kZS5zdGFydERhdGUgfCBkYXRlOiAnWVlZWS1NTS1kZCcgfX08L3NwYW4+XG4gICAgICAgIH1cbiAgICAgICAgQGlmICghYmxhbmtOb2RlLnN0YXJ0RGF0ZSkge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgQGlmIChibGFua05vZGUudGVybT8udGVybVR5cGUgPT09IFRlcm1UZXJtVHlwZS5vcGVyYXRpb24pIHtcbiAgICAgICAgICAgICAgTm8gZGF0ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICA8c3BhbiBjbGFzcz1cInB4LTFcIiBbY2xhc3MuaXMtaW52aXNpYmxlXT1cIiFibGFua05vZGUuc3RhcnREYXRlIHx8ICFibGFua05vZGUuZW5kRGF0ZVwiPi08L3NwYW4+XG4gICAgICAgIDxzcGFuIFtjbGFzcy5pcy1pbnZpc2libGVdPVwiIWJsYW5rTm9kZS5lbmREYXRlXCI+e3sgYmxhbmtOb2RlLmVuZERhdGUgfHwgbm93IHwgZGF0ZTogJ1lZWVktTU0tZGQnIH19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTRcIiBbaW5uZXJIdG1sXT1cImJsYW5rTm9kZS50ZXJtLm5hbWUgfCBjb21wb3VuZDogYmxhbmtOb2RlLnRlcm0udGVybVR5cGVcIj48L3NwYW4+XG4gICAgICAgIDxoZS1ibGFuay1ub2RlLXN0YXRlXG4gICAgICAgICAgY2xhc3M9XCJtbC0xXCJcbiAgICAgICAgICBbZGF0YVN0YXRlXT1cImRhdGFTdGF0ZSgpXCJcbiAgICAgICAgICBbbm9kZV09XCJibGFua05vZGVcIlxuICAgICAgICAgIGtleT1cInZhbHVlXCI+PC9oZS1ibGFuay1ub2RlLXN0YXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9saT5cbiAgfVxuPC91bD5cbiJdfQ==