@hestia-earth/ui-components 0.13.2 → 0.14.0

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.
@@ -8,7 +8,7 @@ export declare class LinkKeyValueComponent {
8
8
  protected key?: string;
9
9
  protected defaultValue?: any;
10
10
  protected dataState?: DataState;
11
- isExpandable: (val: any) => boolean;
11
+ isExpandable: (val: any) => any;
12
12
  valueLink: (value: any) => string;
13
13
  get isInlineBlock(): boolean;
14
14
  baseUrl: string;
@@ -50,10 +50,10 @@ export class DataTableComponent {
50
50
  }
51
51
  }
52
52
  DataTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: DataTableComponent, deps: [{ token: i0.ElementRef }, { token: i1.NavigationMenuService }], target: i0.ɵɵFactoryTarget.Component });
53
- DataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: DataTableComponent, selector: "he-data-table", inputs: { minHeight: "minHeight", maxHeight: "maxHeight", nbRows: "nbRows", small: "small", height: "height", width: "width" }, host: { listeners: { "window:resize": "onResize()" }, properties: { "class.is-small": "this.isSmall" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"data-table-holder\"\n [style.height]=\"height\"\n [style.width]=\"width\"\n>\n <div class=\"data-table-content\"\n [style.height]=\"height\"\n [style.width]=\"width\"\n >\n <div class=\"table-container\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;height:inherit;width:100%}:host *{box-sizing:border-box}:host .data-table-holder{overflow:hidden;position:relative;z-index:1}:host .data-table-content{position:absolute;top:0;left:0;z-index:1}:host ::ng-deep *{box-sizing:border-box}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container{overflow:auto!important;width:100%;height:100%}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table{width:100%}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td{border:none;height:42px;white-space:nowrap}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th span:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td span:first-child{display:inline-block;max-width:100%}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table .fixed-column{position:sticky}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td{z-index:10}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{z-index:11}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th{top:0;z-index:1070}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column{z-index:1071}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.has-border-right{box-shadow:inset -2px 0 #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{left:0;max-width:200px;width:200px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{max-width:160px;width:160px}}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column.has-border-right{box-shadow:none}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column.has-border-right:after{position:absolute;content:\"\";height:100%;top:0;right:0;width:4px;box-shadow:2px 0 4px #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{left:200px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{left:160px}}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th{box-shadow:inset 0 -1px #ffc000}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th.has-border-right{box-shadow:inset 0 -1px #ffc000,inset -2px 0 #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th.fixed-column.has-border-right{box-shadow:inset 0 -1px #ffc000}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th.fixed-column.has-border-right:after{box-shadow:inset 0 -1px #ffc000,2px 0 4px #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr>th.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>tbody>tr>td.has-border-right{box-shadow:inset -2px 0 #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr>th.fixed-column.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>tbody>tr>td:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>tbody>tr>td.fixed-column.has-border-right:after{box-shadow:2px 0 4px #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th{box-shadow:inset 0 -1px #c5cdd5}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th.has-border-right{box-shadow:inset 0 -1px #c5cdd5,inset -2px 0 #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th.fixed-column.has-border-right{box-shadow:inset 0 -1px #c5cdd5}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th.fixed-column.has-border-right:after{box-shadow:inset 0 -1px #c5cdd5,2px 0 4px #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr{background-color:transparent!important}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr+tr th{top:42px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr+tr+tr th{top:84px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td{background-color:#fff}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-hoverable>tbody>tr:not(.is-selected):hover>td{background-color:#f3f5f7}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-striped>tbody>tr:not(.is-selected):nth-child(even)>td{background-color:#fefcf7}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-striped.is-hoverable>tr:not(.is-selected):nth-child(even):hover>td{background-color:#f3f5f7}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow{font-size:.8rem;line-height:1rem}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td{height:30px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr+tr th{top:30px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr+tr+tr th{top:60px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .select,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .select select,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .input{height:30px;font-size:.8rem;line-height:1rem}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .select select,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .input{padding-top:5px;padding-bottom:5px}\n"] });
53
+ DataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: DataTableComponent, selector: "he-data-table", inputs: { minHeight: "minHeight", maxHeight: "maxHeight", nbRows: "nbRows", small: "small", height: "height", width: "width" }, host: { listeners: { "window:resize": "onResize()" }, properties: { "class.is-small": "this.isSmall" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"data-table-holder\"\n [style.height]=\"height\"\n [style.width]=\"width\"\n>\n <div class=\"data-table-content\"\n [style.height]=\"height\"\n [style.width]=\"width\"\n >\n <div class=\"table-container\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;height:inherit;width:100%}:host *{box-sizing:border-box}:host .data-table-holder{overflow:hidden;position:relative;z-index:1}:host .data-table-content{position:absolute;top:0;left:0;z-index:1}:host ::ng-deep *{box-sizing:border-box}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container{overflow:auto!important;width:100%;height:100%}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table{width:100%}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td{border:none;height:42px;white-space:nowrap}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th span:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td span:first-child{display:inline-block;max-width:100%}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table .fixed-column{position:sticky}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td{z-index:10}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{z-index:11}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th{top:0;z-index:1070}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column{z-index:1071}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.has-border-right{box-shadow:inset -2px 0 #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{left:0;max-width:300px;width:300px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{max-width:180px;width:180px}}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column.has-border-right{box-shadow:none}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column.has-border-right:after{position:absolute;content:\"\";height:100%;top:0;right:0;width:4px;box-shadow:2px 0 4px #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{left:300px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{left:180px}}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th{box-shadow:inset 0 -1px #ffc000}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th.has-border-right{box-shadow:inset 0 -1px #ffc000,inset -2px 0 #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th.fixed-column.has-border-right{box-shadow:inset 0 -1px #ffc000}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th.fixed-column.has-border-right:after{box-shadow:inset 0 -1px #ffc000,2px 0 4px #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr>th.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>tbody>tr>td.has-border-right{box-shadow:inset -2px 0 #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr>th.fixed-column.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>tbody>tr>td:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>tbody>tr>td.fixed-column.has-border-right:after{box-shadow:2px 0 4px #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th{box-shadow:inset 0 -1px #c5cdd5}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th.has-border-right{box-shadow:inset 0 -1px #c5cdd5,inset -2px 0 #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th.fixed-column.has-border-right{box-shadow:inset 0 -1px #c5cdd5}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th.fixed-column.has-border-right:after{box-shadow:inset 0 -1px #c5cdd5,2px 0 4px #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr{background-color:transparent!important}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr+tr th{top:42px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr+tr+tr th{top:84px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td{background-color:#fff}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-hoverable>tbody>tr:not(.is-selected):hover>td{background-color:#f3f5f7}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-striped>tbody>tr:not(.is-selected):nth-child(even)>td{background-color:#fefcf7}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-striped.is-hoverable>tr:not(.is-selected):nth-child(even):hover>td{background-color:#f3f5f7}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow{font-size:.8rem;line-height:1rem}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td{height:30px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td.fixed-column{max-width:200px;width:200px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td.fixed-column{max-width:160px;width:160px}}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td.fixed-column{left:200px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td.fixed-column{left:160px}}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr+tr th{top:30px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr+tr+tr th{top:60px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .select,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .select select,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .input{height:30px;font-size:.8rem;line-height:1rem}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .select select,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .input{padding-top:5px;padding-bottom:5px}\n"] });
54
54
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: DataTableComponent, decorators: [{
55
55
  type: Component,
56
- args: [{ selector: 'he-data-table', template: "<div class=\"data-table-holder\"\n [style.height]=\"height\"\n [style.width]=\"width\"\n>\n <div class=\"data-table-content\"\n [style.height]=\"height\"\n [style.width]=\"width\"\n >\n <div class=\"table-container\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;height:inherit;width:100%}:host *{box-sizing:border-box}:host .data-table-holder{overflow:hidden;position:relative;z-index:1}:host .data-table-content{position:absolute;top:0;left:0;z-index:1}:host ::ng-deep *{box-sizing:border-box}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container{overflow:auto!important;width:100%;height:100%}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table{width:100%}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td{border:none;height:42px;white-space:nowrap}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th span:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td span:first-child{display:inline-block;max-width:100%}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table .fixed-column{position:sticky}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td{z-index:10}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{z-index:11}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th{top:0;z-index:1070}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column{z-index:1071}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.has-border-right{box-shadow:inset -2px 0 #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{left:0;max-width:200px;width:200px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{max-width:160px;width:160px}}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column.has-border-right{box-shadow:none}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column.has-border-right:after{position:absolute;content:\"\";height:100%;top:0;right:0;width:4px;box-shadow:2px 0 4px #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{left:200px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{left:160px}}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th{box-shadow:inset 0 -1px #ffc000}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th.has-border-right{box-shadow:inset 0 -1px #ffc000,inset -2px 0 #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th.fixed-column.has-border-right{box-shadow:inset 0 -1px #ffc000}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th.fixed-column.has-border-right:after{box-shadow:inset 0 -1px #ffc000,2px 0 4px #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr>th.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>tbody>tr>td.has-border-right{box-shadow:inset -2px 0 #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr>th.fixed-column.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>tbody>tr>td:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>tbody>tr>td.fixed-column.has-border-right:after{box-shadow:2px 0 4px #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th{box-shadow:inset 0 -1px #c5cdd5}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th.has-border-right{box-shadow:inset 0 -1px #c5cdd5,inset -2px 0 #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th.fixed-column.has-border-right{box-shadow:inset 0 -1px #c5cdd5}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th.fixed-column.has-border-right:after{box-shadow:inset 0 -1px #c5cdd5,2px 0 4px #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr{background-color:transparent!important}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr+tr th{top:42px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr+tr+tr th{top:84px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td{background-color:#fff}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-hoverable>tbody>tr:not(.is-selected):hover>td{background-color:#f3f5f7}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-striped>tbody>tr:not(.is-selected):nth-child(even)>td{background-color:#fefcf7}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-striped.is-hoverable>tr:not(.is-selected):nth-child(even):hover>td{background-color:#f3f5f7}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow{font-size:.8rem;line-height:1rem}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td{height:30px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr+tr th{top:30px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr+tr+tr th{top:60px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .select,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .select select,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .input{height:30px;font-size:.8rem;line-height:1rem}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .select select,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .input{padding-top:5px;padding-bottom:5px}\n"] }]
56
+ args: [{ selector: 'he-data-table', template: "<div class=\"data-table-holder\"\n [style.height]=\"height\"\n [style.width]=\"width\"\n>\n <div class=\"data-table-content\"\n [style.height]=\"height\"\n [style.width]=\"width\"\n >\n <div class=\"table-container\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;height:inherit;width:100%}:host *{box-sizing:border-box}:host .data-table-holder{overflow:hidden;position:relative;z-index:1}:host .data-table-content{position:absolute;top:0;left:0;z-index:1}:host ::ng-deep *{box-sizing:border-box}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container{overflow:auto!important;width:100%;height:100%}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table{width:100%}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td{border:none;height:42px;white-space:nowrap}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th span:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td span:first-child{display:inline-block;max-width:100%}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table .fixed-column{position:sticky}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td{z-index:10}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{z-index:11}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th{top:0;z-index:1070}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column{z-index:1071}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.has-border-right{box-shadow:inset -2px 0 #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{left:0;max-width:300px;width:300px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{max-width:180px;width:180px}}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column.has-border-right{box-shadow:none}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column.has-border-right:after{position:absolute;content:\"\";height:100%;top:0;right:0;width:4px;box-shadow:2px 0 4px #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{left:300px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td.fixed-column{left:180px}}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th{box-shadow:inset 0 -1px #ffc000}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th.has-border-right{box-shadow:inset 0 -1px #ffc000,inset -2px 0 #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th.fixed-column.has-border-right{box-shadow:inset 0 -1px #ffc000}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr:last-child>th.fixed-column.has-border-right:after{box-shadow:inset 0 -1px #ffc000,2px 0 4px #c4ae6c1a}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr>th.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>tbody>tr>td.has-border-right{box-shadow:inset -2px 0 #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr>th.fixed-column.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>tbody>tr>td:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>tbody>tr>td.fixed-column.has-border-right:after{box-shadow:2px 0 4px #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th{box-shadow:inset 0 -1px #c5cdd5}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th.has-border-right{box-shadow:inset 0 -1px #c5cdd5,inset -2px 0 #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th:first-child.has-border-right,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th.fixed-column.has-border-right{box-shadow:inset 0 -1px #c5cdd5}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th:first-child.has-border-right:after,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-dark>thead>tr:last-child>th.fixed-column.has-border-right:after{box-shadow:inset 0 -1px #c5cdd5,2px 0 4px #6c8093}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr{background-color:transparent!important}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr+tr th{top:42px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr+tr+tr th{top:84px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table>tbody>tr>td{background-color:#fff}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-hoverable>tbody>tr:not(.is-selected):hover>td{background-color:#f3f5f7}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-striped>tbody>tr:not(.is-selected):nth-child(even)>td{background-color:#fefcf7}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-striped.is-hoverable>tr:not(.is-selected):nth-child(even):hover>td{background-color:#f3f5f7}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow{font-size:.8rem;line-height:1rem}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td{height:30px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td.fixed-column{max-width:200px;width:200px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td:first-child,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td.fixed-column{max-width:160px;width:160px}}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td.fixed-column{left:200px}@media screen and (max-width: 767px){:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr>th.fixed-column,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>tbody>tr>td.fixed-column{left:160px}}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr+tr th{top:30px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow>thead>tr+tr+tr th{top:60px}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .select,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .select select,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .input{height:30px;font-size:.8rem;line-height:1rem}:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .select select,:host ::ng-deep>.data-table-holder>.data-table-content>.table-container>.table.is-narrow .input{padding-top:5px;padding-bottom:5px}\n"] }]
57
57
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.NavigationMenuService }]; }, propDecorators: { minHeight: [{
58
58
  type: Input
59
59
  }], maxHeight: [{
@@ -12,10 +12,11 @@ import * as i4 from "../../common/ellipsis.pipe";
12
12
  import * as i5 from "../../common/pluralize.pipe";
13
13
  const nodeTypeToString = (type) => `${type.charAt(0).toLowerCase()}${type.substring(1)}`;
14
14
  const acceptedTypes = Object.values(NodeType).filter(val => val !== NodeType.Term).map(nodeTypeToString);
15
- var ErrorKeys;
15
+ export var ErrorKeys;
16
16
  (function (ErrorKeys) {
17
17
  ErrorKeys["NoData"] = "no-data";
18
18
  ErrorKeys["NoHeaders"] = "no-headers";
19
+ ErrorKeys["InvalidJSON"] = "invalid-json";
19
20
  ErrorKeys["InvalidSheetName"] = "invalid-sheet-name";
20
21
  ErrorKeys["InvalidFirstColumn"] = "invalid-first-column";
21
22
  ErrorKeys["DuplicatedHeaders"] = "duplicated-headers";
@@ -109,13 +110,13 @@ export class FilesUploadErrorsComponent {
109
110
  }
110
111
  }
111
112
  FilesUploadErrorsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: FilesUploadErrorsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
112
- FilesUploadErrorsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: FilesUploadErrorsComponent, selector: "he-files-upload-errors", inputs: { file: "file", error: "error" }, ngImport: i0, template: "<ng-container *ngIf=\"!!error\">\n <div class=\"has-text-danger\" [ngSwitch]=\"error?.message\">\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.NoData\">\n <p>\n No Nodes could be found in your Submission.\n Please verify the column headers match the Hestia schema.\n </p>\n\n <ng-container *ngTemplateOutlet=\"defaultError\"></ng-container>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyNotFound\">\n <div class=\"notification is-danger\" role=\"alert\">\n <p>\n <fa-icon class=\"pr-2\" icon=\"exclamation-triangle\"></fa-icon>\n <span>You have column headers that do not match the Hestia schema.</span>\n <span class=\"px-1\">Please refer to the</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema\" target=\"_blank\">schema</a>\n <span class=\"pl-1\">and then correct the column headers indicated below.</span>\n </p>\n\n <ng-container *ngTemplateOutlet=\"defaultError\"></ng-container>\n </div>\n\n <div class=\"is-mb-2\">\n <pre><code>{{error.key}}</code></pre>\n </div>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyInvalidFormat\">\n <div class=\"is-mb-2\">\n <span>The following value in the column <i>{{error.key}}</i> is not in the correct format:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{stringify(error.value)}}</code></pre>\n </div>\n <ng-container [ngSwitch]=\"hasNumberWithCommasError\">\n <ng-container *ngSwitchCase=\"true\">\n <p class=\"is-mt-2\">\n Please format your numbers to remove commas and use a decimal point to separate the whole part of the number from the fractional part of the number.\n </p>\n\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>3,510.1</code></pre>\n\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>3510.1</code></pre>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"false\">\n <p>\n <span class=\"pr-1\">You can see the accepted field type and some examples</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + (error.schemaKey || error.key)\" target=\"_blank\">here</a>\n <span>.</span>\n </p>\n\n <p>The error could either be a value in the column, or an error with the column header.</p>\n <p>If you are trying to set no data, we accept either <code>-</code> or an empty cell.</p>\n </ng-container>\n </ng-container>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyRequired\">\n <div class=\"is-mb-2\">\n <span class=\"pr-1\">The following field is required in the</span>\n <a class=\"pr-1\" *ngIf=\"error.schema\" [href]=\"baseUrl + '/schema/' + error.schema\" target=\"_blank\">{{error.schema}}</a>\n <span>schema:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.property}}</code></pre>\n </div>\n <p [ngSwitch]=\"error.property\">\n <span *ngSwitchCase=\"'id'\">You must assign a unique <code>id</code> for every record in your data.</span>\n <span *ngSwitchCase=\"'type'\">Every record in your data must contain a <code>type</code>.</span>\n </p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyInternal\">\n <div class=\"is-mb-2\">\n <span class=\"pr-1\">The following field is <code>internal</code> in the</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + (error.schemaKey || error.key)\" target=\"_blank\">{{error.schema}} schema</a>\n <span>:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.schemaKey || error.key}}</code></pre>\n </div>\n <p>You cannot upload <code>internal</code> fields to Hestia.</p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.SchemaNotFound\">\n <div class=\"is-mb-2\">\n <span>The following Node does not exist in the schema:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.key}}</code></pre>\n </div>\n <p>\n <span>The list of accepted values is:</span>\n </p>\n <div class=\"content\">\n <ul>\n <li *ngFor=\"let type of nodeTypes\"><i>{{type}}</i></li>\n </ul>\n </div>\n </div>\n\n <ng-container *ngSwitchCase=\"ErrorKeys.UploadsLimit\">\n <div class=\"is-mb-2\">\n <span>You have reached the upload limit of</span>\n <code class=\"mx-1\">{{UploadLimit[error.schema]}}</code>\n <span>{{error.schema}} in a single submission (<b>{{error.value}}</b> have been found).</span>\n </div>\n\n <p>\n <span>Please re-upload the data in multiple submissions with a maximum of</span>\n <code class=\"mx-1\">{{UploadLimit[error.schema]}}</code>\n <span>{{error.schema}} in each submission.</span>\n </p>\n </ng-container>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.InvalidFirstColumn\">\n <span>\n No data in the Hestia format was detected on the first sheet.\n Either try selecting a different sheet in the upload screen, or check the sheet to ensure the headers follow the schema - see examples\n </span>\n <a class=\"pl-1\" routerLink=\"/upload\" fragment=\"example\">here</a>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.NoHeaders\">\n <p>\n No headers matching the Hestia schema were found on the first row.\n Please remove all empty rows at the begining of the file and try uploading again.\n </p>\n\n <ng-container *ngTemplateOutlet=\"defaultError\"></ng-container>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.InvalidSheetName\">\n <div class=\"is-mb-2\">\n <span class=\"pr-1\">The Excel sheet</span>\n <code>{{error.value}}</code>\n <span class=\"pl-1\">does not exist.</span>\n <span class=\"pl-1\">Your Excel file contains the following sheets:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n <li *ngFor=\"let e of error.error.split(';')\">\n <code>{{e}}</code>\n </li>\n </ul>\n </div>\n\n <p>\n <span>Please re-upload selecting one of the sheets above.</span>\n </p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.DuplicatedHeaders\">\n <span>Your submission contains duplicated column headers.</span>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.DuplicatedIds\">\n <span class=\"pr-1\">You have multiple</span>\n <code>{{error.schema | pluralize}}</code>\n <span class=\"px-1\">with the same</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + error.schemaKey\" target=\"_blank\">{{error.schemaKey}}</a>\n <span class=\"px-1\">but different data. The</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + error.schemaKey\" target=\"_blank\">{{error.schemaKey}}</a>\n <span class=\"pl-1\">is:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.value}}</code></pre>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.NestedHeaders\">\n <p>\n To link nodes together, you first need to define the node (e.g., <code>source.id</code>, <code>source.bibliography.title</code>) and then create the link (e.g., <code>cycle.defaultSource.id</code>).\n We do not allow nesting (e.g., <code>cycle.defaultSource.bibliography.title</code>).\n </p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.ReferenceExistingHeaders\">\n <p>You have used the internal <code>@id</code> field to upload a new Node.</p>\n <p>The <code>@id</code> field should only be used to reference existing Node or Terms. Example:</p>\n\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.@id,cycle.inputs.0.term.@id,source.id</code></pre>\n\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.id,cycle.inputs.0.term.@id,source.id</code></pre>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.MaxSize\">\n <span>The maximum file size limit is {{MAX_SIZE}}Mb (current file size: {{error.value}}Mb).</span>\n <span class=\"pl-1\">Please re-upload the data in multiple submissions.</span>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.MaxRows\">\n <span>Your file has {{error.value | number}} rows. This might be an error caused by adding some data at the bottom of a spreadsheet by accident: delete any unused rows and resubmit the file.</span>\n </div>\n\n <div class=\"my-3\" *ngIf=\"columns.length || (error.index && !isSchemaError)\">\n <b>Hint:</b>\n <span class=\"pl-1\">the error might be located</span>\n <span class=\"pl-1\" *ngIf=\"error.index && !isSchemaError\">on row {{error.index}}</span>\n <ng-container *ngIf=\"columns.length\">\n <span class=\"pl-1\">in {{'column' | pluralize:columns.length}}:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n <li *ngFor=\"let column of columns\">\n <b class=\"pr-2\">{{column.column}}</b>\n <code>{{column.name}}</code>\n </li>\n </ul>\n </ng-container>\n </div>\n\n <div class=\"my-3\" *ngIf=\"error.suggestions?.length\">\n <b>Suggestions:</b>\n <span class=\"pl-1\">did you mean instead:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n <li *ngFor=\"let suggestion of error.suggestions\">\n <code>{{suggestion}}</code>\n </li>\n </ul>\n </div>\n\n <div *ngIf=\"showCsvPreview\" class=\"is-my-2\">\n <b>Preview<sup>1</sup>:</b>\n <div class=\"table-container is-mt-2\">\n <table class=\"table is-bordered is-fullwidth is-hoverable is-narrow mb-0\">\n <thead>\n <th *ngIf=\"error.index\"></th>\n <th *ngFor=\"let header of headers\">{{header}}</th>\n </thead>\n <tbody>\n <ng-container *bindOnce=\"rows\">\n <tr *ngFor=\"let row of rows\">\n <td class=\"has-text-danger\" *ngIf=\"error.index\">\n <span class=\"is-nowrap\">Row {{error.index}}</span>\n </td>\n <td *ngFor=\"let col of row; let colIndex = index\">\n <span\n [class.has-text-danger]=\"error?.message === ErrorKeys.DuplicatedIds && hasDuplicatedError(col, colIndex)\"\n >{{col | ellipsis:50}}</span>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n <p class=\"is-size-7\"><i>1. The preview does not necessarily reflect the original Submission's order or content.</i></p>\n </div>\n\n <div *ngIf=\"showJsonPreview\" class=\"is-my-2\">\n <b>Preview:</b>\n <pre class=\"is-mt-2\"><code>{{stringify(error.node)}}</code></pre>\n </div>\n </div>\n</ng-container>\n\n<ng-template #defaultError>\n <p class=\"is-mt-2 has-text-black\">\n <span class=\"is-pr-1\">If you are still stuck, please see</span>\n <a [href]=\"baseUrl + '/upload#example'\" target=\"_blank\">the example submissions and videos</a>\n <span class=\"is-px-1\">or try using the Wizard to get the first few rows of data formatted correctly, or use the chat to ask for help.</span>\n </p>\n</ng-template>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i2.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "directive", type: i3.BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: i5.PluralizePipe, name: "pluralize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
113
+ FilesUploadErrorsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: FilesUploadErrorsComponent, selector: "he-files-upload-errors", inputs: { file: "file", error: "error" }, ngImport: i0, template: "<ng-container *ngIf=\"!!error\">\n <div class=\"has-text-danger\" [ngSwitch]=\"error?.message\">\n <div *ngSwitchCase=\"ErrorKeys.InvalidJSON\">\n <p>The Submission does not appear to contain valid JSON data:</p>\n\n <div class=\"is-mt-2\">\n <pre><code>{{error.error}}</code></pre>\n </div>\n\n <p>Please validate your JSON content before uploading it using an <a href=\"https://jsoneditoronline.org\" target=\"_blank\">online tool</a> for example.</p>\n </div>\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.NoData\">\n <p>\n No Nodes could be found in your Submission.\n Please verify the column headers match the Hestia schema.\n </p>\n\n <ng-container *ngTemplateOutlet=\"defaultError\"></ng-container>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyNotFound\">\n <div class=\"notification is-danger\" role=\"alert\">\n <p>\n <fa-icon class=\"pr-2\" icon=\"exclamation-triangle\"></fa-icon>\n <span>You have column headers that do not match the Hestia schema.</span>\n <span class=\"px-1\">Please refer to the</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema\" target=\"_blank\">schema</a>\n <span class=\"pl-1\">and then correct the column headers indicated below.</span>\n </p>\n\n <ng-container *ngTemplateOutlet=\"defaultError\"></ng-container>\n </div>\n\n <div class=\"is-mb-2\">\n <pre><code>{{error.key}}</code></pre>\n </div>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyInvalidFormat\">\n <div class=\"is-mb-2\">\n <span>The following value in the column <i>{{error.key}}</i> is not in the correct format:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{stringify(error.value)}}</code></pre>\n </div>\n <ng-container [ngSwitch]=\"hasNumberWithCommasError\">\n <ng-container *ngSwitchCase=\"true\">\n <p class=\"is-mt-2\">\n Please format your numbers to remove commas and use a decimal point to separate the whole part of the number from the fractional part of the number.\n </p>\n\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>3,510.1</code></pre>\n\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>3510.1</code></pre>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"false\">\n <p>\n <span class=\"pr-1\">You can see the accepted field type and some examples</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + (error.schemaKey || error.key)\" target=\"_blank\">here</a>\n <span>.</span>\n </p>\n\n <p>The error could either be a value in the column, or an error with the column header.</p>\n <p>If you are trying to set no data, we accept either <code>-</code> or an empty cell.</p>\n </ng-container>\n </ng-container>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyRequired\">\n <div class=\"is-mb-2\">\n <span class=\"pr-1\">The following field is required in the</span>\n <a class=\"pr-1\" *ngIf=\"error.schema\" [href]=\"baseUrl + '/schema/' + error.schema\" target=\"_blank\">{{error.schema}}</a>\n <span>schema:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.property}}</code></pre>\n </div>\n <p [ngSwitch]=\"error.property\">\n <span *ngSwitchCase=\"'id'\">You must assign a unique <code>id</code> for every record in your data.</span>\n <span *ngSwitchCase=\"'type'\">Every record in your data must contain a <code>type</code>.</span>\n </p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyInternal\">\n <div class=\"is-mb-2\">\n <span class=\"pr-1\">The following field is <code>internal</code> in the</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + (error.schemaKey || error.key)\" target=\"_blank\">{{error.schema}} schema</a>\n <span>:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.schemaKey || error.key}}</code></pre>\n </div>\n <p>You cannot upload <code>internal</code> fields to Hestia.</p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.SchemaNotFound\">\n <div class=\"is-mb-2\">\n <span>The following Node does not exist in the schema:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.key}}</code></pre>\n </div>\n <p>\n <span>The list of accepted values is:</span>\n </p>\n <div class=\"content\">\n <ul>\n <li *ngFor=\"let type of nodeTypes\"><i>{{type}}</i></li>\n </ul>\n </div>\n </div>\n\n <ng-container *ngSwitchCase=\"ErrorKeys.UploadsLimit\">\n <div class=\"is-mb-2\">\n <span>You have reached the upload limit of</span>\n <code class=\"mx-1\">{{UploadLimit[error.schema]}}</code>\n <span>{{error.schema}} in a single submission (<b>{{error.value}}</b> have been found).</span>\n </div>\n\n <p>\n <span>Please re-upload the data in multiple submissions with a maximum of</span>\n <code class=\"mx-1\">{{UploadLimit[error.schema]}}</code>\n <span>{{error.schema}} in each submission.</span>\n </p>\n </ng-container>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.InvalidFirstColumn\">\n <span>\n No data in the Hestia format was detected on the first sheet.\n Either try selecting a different sheet in the upload screen, or check the sheet to ensure the headers follow the schema - see examples\n </span>\n <a class=\"pl-1\" routerLink=\"/upload\" fragment=\"example\">here</a>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.NoHeaders\">\n <p>\n No headers matching the Hestia schema were found on the first row.\n Please remove all empty rows at the begining of the file and try uploading again.\n </p>\n\n <ng-container *ngTemplateOutlet=\"defaultError\"></ng-container>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.InvalidSheetName\">\n <div class=\"is-mb-2\">\n <span class=\"pr-1\">The Excel sheet</span>\n <code>{{error.value}}</code>\n <span class=\"pl-1\">does not exist.</span>\n <span class=\"pl-1\">Your Excel file contains the following sheets:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n <li *ngFor=\"let e of error.error.split(';')\">\n <code>{{e}}</code>\n </li>\n </ul>\n </div>\n\n <p>\n <span>Please re-upload selecting one of the sheets above.</span>\n </p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.DuplicatedHeaders\">\n <span>Your submission contains duplicated column headers.</span>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.DuplicatedIds\">\n <span class=\"pr-1\">You have multiple</span>\n <code>{{error.schema | pluralize}}</code>\n <span class=\"px-1\">with the same</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + error.schemaKey\" target=\"_blank\">{{error.schemaKey}}</a>\n <span class=\"px-1\">but different data. The</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + error.schemaKey\" target=\"_blank\">{{error.schemaKey}}</a>\n <span class=\"pl-1\">is:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.value}}</code></pre>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.NestedHeaders\">\n <p>\n To link nodes together, you first need to define the node (e.g., <code>source.id</code>, <code>source.bibliography.title</code>) and then create the link (e.g., <code>cycle.defaultSource.id</code>).\n We do not allow nesting (e.g., <code>cycle.defaultSource.bibliography.title</code>).\n </p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.ReferenceExistingHeaders\">\n <p>You have used the internal <code>@id</code> field to upload a new Node.</p>\n <p>The <code>@id</code> field should only be used to reference existing Node or Terms. Example:</p>\n\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.@id,cycle.inputs.0.term.@id,source.id</code></pre>\n\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.id,cycle.inputs.0.term.@id,source.id</code></pre>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.MaxSize\">\n <span>The maximum file size limit is {{MAX_SIZE}}Mb (current file size: {{error.value}}Mb).</span>\n <span class=\"pl-1\">Please re-upload the data in multiple submissions.</span>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.MaxRows\">\n <span>Your file has {{error.value | number}} rows. This might be an error caused by adding some data at the bottom of a spreadsheet by accident: delete any unused rows and resubmit the file.</span>\n </div>\n\n <div class=\"my-3\" *ngIf=\"columns.length || (error.index && !isSchemaError)\">\n <b>Hint:</b>\n <span class=\"pl-1\">the error might be located</span>\n <span class=\"pl-1\" *ngIf=\"error.index && !isSchemaError\">on row {{error.index}}</span>\n <ng-container *ngIf=\"columns.length\">\n <span class=\"pl-1\">in {{'column' | pluralize:columns.length}}:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n <li *ngFor=\"let column of columns\">\n <b class=\"pr-2\">{{column.column}}</b>\n <code>{{column.name}}</code>\n </li>\n </ul>\n </ng-container>\n </div>\n\n <div class=\"my-3\" *ngIf=\"error.suggestions?.length\">\n <b>Suggestions:</b>\n <span class=\"pl-1\">did you mean instead:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n <li *ngFor=\"let suggestion of error.suggestions\">\n <code>{{suggestion}}</code>\n </li>\n </ul>\n </div>\n\n <div *ngIf=\"showCsvPreview\" class=\"is-my-2\">\n <b>Preview<sup>1</sup>:</b>\n <div class=\"table-container is-mt-2\">\n <table class=\"table is-bordered is-fullwidth is-hoverable is-narrow mb-0\">\n <thead>\n <th *ngIf=\"error.index\"></th>\n <th *ngFor=\"let header of headers\">{{header}}</th>\n </thead>\n <tbody>\n <ng-container *bindOnce=\"rows\">\n <tr *ngFor=\"let row of rows\">\n <td class=\"has-text-danger\" *ngIf=\"error.index\">\n <span class=\"is-nowrap\">Row {{error.index}}</span>\n </td>\n <td *ngFor=\"let col of row; let colIndex = index\">\n <span\n [class.has-text-danger]=\"error?.message === ErrorKeys.DuplicatedIds && hasDuplicatedError(col, colIndex)\"\n >{{col | ellipsis:50}}</span>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n <p class=\"is-size-7\"><i>1. The preview does not necessarily reflect the original Submission's order or content.</i></p>\n </div>\n\n <div *ngIf=\"showJsonPreview\" class=\"is-my-2\">\n <b>Preview:</b>\n <pre class=\"is-mt-2\"><code>{{stringify(error.node)}}</code></pre>\n </div>\n </div>\n</ng-container>\n\n<ng-template #defaultError>\n <p class=\"is-mt-2 has-text-black\">\n <span class=\"is-pr-1\">If you are still stuck, please see</span>\n <a [href]=\"baseUrl + '/upload#example'\" target=\"_blank\">the example submissions and videos</a>\n <span class=\"is-px-1\">or try using the Wizard to get the first few rows of data formatted correctly, or use the chat to ask for help.</span>\n </p>\n</ng-template>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i2.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "directive", type: i3.BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: i5.PluralizePipe, name: "pluralize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
113
114
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: FilesUploadErrorsComponent, decorators: [{
114
115
  type: Component,
115
- args: [{ selector: 'he-files-upload-errors', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"!!error\">\n <div class=\"has-text-danger\" [ngSwitch]=\"error?.message\">\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.NoData\">\n <p>\n No Nodes could be found in your Submission.\n Please verify the column headers match the Hestia schema.\n </p>\n\n <ng-container *ngTemplateOutlet=\"defaultError\"></ng-container>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyNotFound\">\n <div class=\"notification is-danger\" role=\"alert\">\n <p>\n <fa-icon class=\"pr-2\" icon=\"exclamation-triangle\"></fa-icon>\n <span>You have column headers that do not match the Hestia schema.</span>\n <span class=\"px-1\">Please refer to the</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema\" target=\"_blank\">schema</a>\n <span class=\"pl-1\">and then correct the column headers indicated below.</span>\n </p>\n\n <ng-container *ngTemplateOutlet=\"defaultError\"></ng-container>\n </div>\n\n <div class=\"is-mb-2\">\n <pre><code>{{error.key}}</code></pre>\n </div>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyInvalidFormat\">\n <div class=\"is-mb-2\">\n <span>The following value in the column <i>{{error.key}}</i> is not in the correct format:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{stringify(error.value)}}</code></pre>\n </div>\n <ng-container [ngSwitch]=\"hasNumberWithCommasError\">\n <ng-container *ngSwitchCase=\"true\">\n <p class=\"is-mt-2\">\n Please format your numbers to remove commas and use a decimal point to separate the whole part of the number from the fractional part of the number.\n </p>\n\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>3,510.1</code></pre>\n\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>3510.1</code></pre>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"false\">\n <p>\n <span class=\"pr-1\">You can see the accepted field type and some examples</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + (error.schemaKey || error.key)\" target=\"_blank\">here</a>\n <span>.</span>\n </p>\n\n <p>The error could either be a value in the column, or an error with the column header.</p>\n <p>If you are trying to set no data, we accept either <code>-</code> or an empty cell.</p>\n </ng-container>\n </ng-container>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyRequired\">\n <div class=\"is-mb-2\">\n <span class=\"pr-1\">The following field is required in the</span>\n <a class=\"pr-1\" *ngIf=\"error.schema\" [href]=\"baseUrl + '/schema/' + error.schema\" target=\"_blank\">{{error.schema}}</a>\n <span>schema:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.property}}</code></pre>\n </div>\n <p [ngSwitch]=\"error.property\">\n <span *ngSwitchCase=\"'id'\">You must assign a unique <code>id</code> for every record in your data.</span>\n <span *ngSwitchCase=\"'type'\">Every record in your data must contain a <code>type</code>.</span>\n </p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyInternal\">\n <div class=\"is-mb-2\">\n <span class=\"pr-1\">The following field is <code>internal</code> in the</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + (error.schemaKey || error.key)\" target=\"_blank\">{{error.schema}} schema</a>\n <span>:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.schemaKey || error.key}}</code></pre>\n </div>\n <p>You cannot upload <code>internal</code> fields to Hestia.</p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.SchemaNotFound\">\n <div class=\"is-mb-2\">\n <span>The following Node does not exist in the schema:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.key}}</code></pre>\n </div>\n <p>\n <span>The list of accepted values is:</span>\n </p>\n <div class=\"content\">\n <ul>\n <li *ngFor=\"let type of nodeTypes\"><i>{{type}}</i></li>\n </ul>\n </div>\n </div>\n\n <ng-container *ngSwitchCase=\"ErrorKeys.UploadsLimit\">\n <div class=\"is-mb-2\">\n <span>You have reached the upload limit of</span>\n <code class=\"mx-1\">{{UploadLimit[error.schema]}}</code>\n <span>{{error.schema}} in a single submission (<b>{{error.value}}</b> have been found).</span>\n </div>\n\n <p>\n <span>Please re-upload the data in multiple submissions with a maximum of</span>\n <code class=\"mx-1\">{{UploadLimit[error.schema]}}</code>\n <span>{{error.schema}} in each submission.</span>\n </p>\n </ng-container>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.InvalidFirstColumn\">\n <span>\n No data in the Hestia format was detected on the first sheet.\n Either try selecting a different sheet in the upload screen, or check the sheet to ensure the headers follow the schema - see examples\n </span>\n <a class=\"pl-1\" routerLink=\"/upload\" fragment=\"example\">here</a>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.NoHeaders\">\n <p>\n No headers matching the Hestia schema were found on the first row.\n Please remove all empty rows at the begining of the file and try uploading again.\n </p>\n\n <ng-container *ngTemplateOutlet=\"defaultError\"></ng-container>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.InvalidSheetName\">\n <div class=\"is-mb-2\">\n <span class=\"pr-1\">The Excel sheet</span>\n <code>{{error.value}}</code>\n <span class=\"pl-1\">does not exist.</span>\n <span class=\"pl-1\">Your Excel file contains the following sheets:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n <li *ngFor=\"let e of error.error.split(';')\">\n <code>{{e}}</code>\n </li>\n </ul>\n </div>\n\n <p>\n <span>Please re-upload selecting one of the sheets above.</span>\n </p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.DuplicatedHeaders\">\n <span>Your submission contains duplicated column headers.</span>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.DuplicatedIds\">\n <span class=\"pr-1\">You have multiple</span>\n <code>{{error.schema | pluralize}}</code>\n <span class=\"px-1\">with the same</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + error.schemaKey\" target=\"_blank\">{{error.schemaKey}}</a>\n <span class=\"px-1\">but different data. The</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + error.schemaKey\" target=\"_blank\">{{error.schemaKey}}</a>\n <span class=\"pl-1\">is:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.value}}</code></pre>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.NestedHeaders\">\n <p>\n To link nodes together, you first need to define the node (e.g., <code>source.id</code>, <code>source.bibliography.title</code>) and then create the link (e.g., <code>cycle.defaultSource.id</code>).\n We do not allow nesting (e.g., <code>cycle.defaultSource.bibliography.title</code>).\n </p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.ReferenceExistingHeaders\">\n <p>You have used the internal <code>@id</code> field to upload a new Node.</p>\n <p>The <code>@id</code> field should only be used to reference existing Node or Terms. Example:</p>\n\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.@id,cycle.inputs.0.term.@id,source.id</code></pre>\n\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.id,cycle.inputs.0.term.@id,source.id</code></pre>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.MaxSize\">\n <span>The maximum file size limit is {{MAX_SIZE}}Mb (current file size: {{error.value}}Mb).</span>\n <span class=\"pl-1\">Please re-upload the data in multiple submissions.</span>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.MaxRows\">\n <span>Your file has {{error.value | number}} rows. This might be an error caused by adding some data at the bottom of a spreadsheet by accident: delete any unused rows and resubmit the file.</span>\n </div>\n\n <div class=\"my-3\" *ngIf=\"columns.length || (error.index && !isSchemaError)\">\n <b>Hint:</b>\n <span class=\"pl-1\">the error might be located</span>\n <span class=\"pl-1\" *ngIf=\"error.index && !isSchemaError\">on row {{error.index}}</span>\n <ng-container *ngIf=\"columns.length\">\n <span class=\"pl-1\">in {{'column' | pluralize:columns.length}}:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n <li *ngFor=\"let column of columns\">\n <b class=\"pr-2\">{{column.column}}</b>\n <code>{{column.name}}</code>\n </li>\n </ul>\n </ng-container>\n </div>\n\n <div class=\"my-3\" *ngIf=\"error.suggestions?.length\">\n <b>Suggestions:</b>\n <span class=\"pl-1\">did you mean instead:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n <li *ngFor=\"let suggestion of error.suggestions\">\n <code>{{suggestion}}</code>\n </li>\n </ul>\n </div>\n\n <div *ngIf=\"showCsvPreview\" class=\"is-my-2\">\n <b>Preview<sup>1</sup>:</b>\n <div class=\"table-container is-mt-2\">\n <table class=\"table is-bordered is-fullwidth is-hoverable is-narrow mb-0\">\n <thead>\n <th *ngIf=\"error.index\"></th>\n <th *ngFor=\"let header of headers\">{{header}}</th>\n </thead>\n <tbody>\n <ng-container *bindOnce=\"rows\">\n <tr *ngFor=\"let row of rows\">\n <td class=\"has-text-danger\" *ngIf=\"error.index\">\n <span class=\"is-nowrap\">Row {{error.index}}</span>\n </td>\n <td *ngFor=\"let col of row; let colIndex = index\">\n <span\n [class.has-text-danger]=\"error?.message === ErrorKeys.DuplicatedIds && hasDuplicatedError(col, colIndex)\"\n >{{col | ellipsis:50}}</span>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n <p class=\"is-size-7\"><i>1. The preview does not necessarily reflect the original Submission's order or content.</i></p>\n </div>\n\n <div *ngIf=\"showJsonPreview\" class=\"is-my-2\">\n <b>Preview:</b>\n <pre class=\"is-mt-2\"><code>{{stringify(error.node)}}</code></pre>\n </div>\n </div>\n</ng-container>\n\n<ng-template #defaultError>\n <p class=\"is-mt-2 has-text-black\">\n <span class=\"is-pr-1\">If you are still stuck, please see</span>\n <a [href]=\"baseUrl + '/upload#example'\" target=\"_blank\">the example submissions and videos</a>\n <span class=\"is-px-1\">or try using the Wizard to get the first few rows of data formatted correctly, or use the chat to ask for help.</span>\n </p>\n</ng-template>\n", styles: [":host{display:block}\n"] }]
116
+ args: [{ selector: 'he-files-upload-errors', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"!!error\">\n <div class=\"has-text-danger\" [ngSwitch]=\"error?.message\">\n <div *ngSwitchCase=\"ErrorKeys.InvalidJSON\">\n <p>The Submission does not appear to contain valid JSON data:</p>\n\n <div class=\"is-mt-2\">\n <pre><code>{{error.error}}</code></pre>\n </div>\n\n <p>Please validate your JSON content before uploading it using an <a href=\"https://jsoneditoronline.org\" target=\"_blank\">online tool</a> for example.</p>\n </div>\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.NoData\">\n <p>\n No Nodes could be found in your Submission.\n Please verify the column headers match the Hestia schema.\n </p>\n\n <ng-container *ngTemplateOutlet=\"defaultError\"></ng-container>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyNotFound\">\n <div class=\"notification is-danger\" role=\"alert\">\n <p>\n <fa-icon class=\"pr-2\" icon=\"exclamation-triangle\"></fa-icon>\n <span>You have column headers that do not match the Hestia schema.</span>\n <span class=\"px-1\">Please refer to the</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema\" target=\"_blank\">schema</a>\n <span class=\"pl-1\">and then correct the column headers indicated below.</span>\n </p>\n\n <ng-container *ngTemplateOutlet=\"defaultError\"></ng-container>\n </div>\n\n <div class=\"is-mb-2\">\n <pre><code>{{error.key}}</code></pre>\n </div>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyInvalidFormat\">\n <div class=\"is-mb-2\">\n <span>The following value in the column <i>{{error.key}}</i> is not in the correct format:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{stringify(error.value)}}</code></pre>\n </div>\n <ng-container [ngSwitch]=\"hasNumberWithCommasError\">\n <ng-container *ngSwitchCase=\"true\">\n <p class=\"is-mt-2\">\n Please format your numbers to remove commas and use a decimal point to separate the whole part of the number from the fractional part of the number.\n </p>\n\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>3,510.1</code></pre>\n\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>3510.1</code></pre>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"false\">\n <p>\n <span class=\"pr-1\">You can see the accepted field type and some examples</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + (error.schemaKey || error.key)\" target=\"_blank\">here</a>\n <span>.</span>\n </p>\n\n <p>The error could either be a value in the column, or an error with the column header.</p>\n <p>If you are trying to set no data, we accept either <code>-</code> or an empty cell.</p>\n </ng-container>\n </ng-container>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyRequired\">\n <div class=\"is-mb-2\">\n <span class=\"pr-1\">The following field is required in the</span>\n <a class=\"pr-1\" *ngIf=\"error.schema\" [href]=\"baseUrl + '/schema/' + error.schema\" target=\"_blank\">{{error.schema}}</a>\n <span>schema:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.property}}</code></pre>\n </div>\n <p [ngSwitch]=\"error.property\">\n <span *ngSwitchCase=\"'id'\">You must assign a unique <code>id</code> for every record in your data.</span>\n <span *ngSwitchCase=\"'type'\">Every record in your data must contain a <code>type</code>.</span>\n </p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.PropertyInternal\">\n <div class=\"is-mb-2\">\n <span class=\"pr-1\">The following field is <code>internal</code> in the</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + (error.schemaKey || error.key)\" target=\"_blank\">{{error.schema}} schema</a>\n <span>:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.schemaKey || error.key}}</code></pre>\n </div>\n <p>You cannot upload <code>internal</code> fields to Hestia.</p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.SchemaNotFound\">\n <div class=\"is-mb-2\">\n <span>The following Node does not exist in the schema:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.key}}</code></pre>\n </div>\n <p>\n <span>The list of accepted values is:</span>\n </p>\n <div class=\"content\">\n <ul>\n <li *ngFor=\"let type of nodeTypes\"><i>{{type}}</i></li>\n </ul>\n </div>\n </div>\n\n <ng-container *ngSwitchCase=\"ErrorKeys.UploadsLimit\">\n <div class=\"is-mb-2\">\n <span>You have reached the upload limit of</span>\n <code class=\"mx-1\">{{UploadLimit[error.schema]}}</code>\n <span>{{error.schema}} in a single submission (<b>{{error.value}}</b> have been found).</span>\n </div>\n\n <p>\n <span>Please re-upload the data in multiple submissions with a maximum of</span>\n <code class=\"mx-1\">{{UploadLimit[error.schema]}}</code>\n <span>{{error.schema}} in each submission.</span>\n </p>\n </ng-container>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.InvalidFirstColumn\">\n <span>\n No data in the Hestia format was detected on the first sheet.\n Either try selecting a different sheet in the upload screen, or check the sheet to ensure the headers follow the schema - see examples\n </span>\n <a class=\"pl-1\" routerLink=\"/upload\" fragment=\"example\">here</a>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.NoHeaders\">\n <p>\n No headers matching the Hestia schema were found on the first row.\n Please remove all empty rows at the begining of the file and try uploading again.\n </p>\n\n <ng-container *ngTemplateOutlet=\"defaultError\"></ng-container>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.InvalidSheetName\">\n <div class=\"is-mb-2\">\n <span class=\"pr-1\">The Excel sheet</span>\n <code>{{error.value}}</code>\n <span class=\"pl-1\">does not exist.</span>\n <span class=\"pl-1\">Your Excel file contains the following sheets:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n <li *ngFor=\"let e of error.error.split(';')\">\n <code>{{e}}</code>\n </li>\n </ul>\n </div>\n\n <p>\n <span>Please re-upload selecting one of the sheets above.</span>\n </p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.DuplicatedHeaders\">\n <span>Your submission contains duplicated column headers.</span>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.DuplicatedIds\">\n <span class=\"pr-1\">You have multiple</span>\n <code>{{error.schema | pluralize}}</code>\n <span class=\"px-1\">with the same</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + error.schemaKey\" target=\"_blank\">{{error.schemaKey}}</a>\n <span class=\"px-1\">but different data. The</span>\n <a [href]=\"baseUrl + '/schema/' + error.schema + '#' + error.schemaKey\" target=\"_blank\">{{error.schemaKey}}</a>\n <span class=\"pl-1\">is:</span>\n <br>\n <pre class=\"is-mt-2\"><code>{{error.value}}</code></pre>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.NestedHeaders\">\n <p>\n To link nodes together, you first need to define the node (e.g., <code>source.id</code>, <code>source.bibliography.title</code>) and then create the link (e.g., <code>cycle.defaultSource.id</code>).\n We do not allow nesting (e.g., <code>cycle.defaultSource.bibliography.title</code>).\n </p>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.ReferenceExistingHeaders\">\n <p>You have used the internal <code>@id</code> field to upload a new Node.</p>\n <p>The <code>@id</code> field should only be used to reference existing Node or Terms. Example:</p>\n\n <p class=\"is-mt-2 has-text-danger has-text-underline\">Incorrect:</p>\n <pre class=\"is-mt-2\"><code>cycle.@id,cycle.inputs.0.term.@id,source.id</code></pre>\n\n <p class=\"is-mt-2 has-text-success has-text-underline\">Correct:</p>\n <pre class=\"is-mt-2\"><code>cycle.id,cycle.inputs.0.term.@id,source.id</code></pre>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.MaxSize\">\n <span>The maximum file size limit is {{MAX_SIZE}}Mb (current file size: {{error.value}}Mb).</span>\n <span class=\"pl-1\">Please re-upload the data in multiple submissions.</span>\n </div>\n\n <div class=\"is-mb-2\" *ngSwitchCase=\"ErrorKeys.MaxRows\">\n <span>Your file has {{error.value | number}} rows. This might be an error caused by adding some data at the bottom of a spreadsheet by accident: delete any unused rows and resubmit the file.</span>\n </div>\n\n <div class=\"my-3\" *ngIf=\"columns.length || (error.index && !isSchemaError)\">\n <b>Hint:</b>\n <span class=\"pl-1\">the error might be located</span>\n <span class=\"pl-1\" *ngIf=\"error.index && !isSchemaError\">on row {{error.index}}</span>\n <ng-container *ngIf=\"columns.length\">\n <span class=\"pl-1\">in {{'column' | pluralize:columns.length}}:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n <li *ngFor=\"let column of columns\">\n <b class=\"pr-2\">{{column.column}}</b>\n <code>{{column.name}}</code>\n </li>\n </ul>\n </ng-container>\n </div>\n\n <div class=\"my-3\" *ngIf=\"error.suggestions?.length\">\n <b>Suggestions:</b>\n <span class=\"pl-1\">did you mean instead:</span>\n <ul class=\"mt-1 content is-list-style-disc pl-5\">\n <li *ngFor=\"let suggestion of error.suggestions\">\n <code>{{suggestion}}</code>\n </li>\n </ul>\n </div>\n\n <div *ngIf=\"showCsvPreview\" class=\"is-my-2\">\n <b>Preview<sup>1</sup>:</b>\n <div class=\"table-container is-mt-2\">\n <table class=\"table is-bordered is-fullwidth is-hoverable is-narrow mb-0\">\n <thead>\n <th *ngIf=\"error.index\"></th>\n <th *ngFor=\"let header of headers\">{{header}}</th>\n </thead>\n <tbody>\n <ng-container *bindOnce=\"rows\">\n <tr *ngFor=\"let row of rows\">\n <td class=\"has-text-danger\" *ngIf=\"error.index\">\n <span class=\"is-nowrap\">Row {{error.index}}</span>\n </td>\n <td *ngFor=\"let col of row; let colIndex = index\">\n <span\n [class.has-text-danger]=\"error?.message === ErrorKeys.DuplicatedIds && hasDuplicatedError(col, colIndex)\"\n >{{col | ellipsis:50}}</span>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n <p class=\"is-size-7\"><i>1. The preview does not necessarily reflect the original Submission's order or content.</i></p>\n </div>\n\n <div *ngIf=\"showJsonPreview\" class=\"is-my-2\">\n <b>Preview:</b>\n <pre class=\"is-mt-2\"><code>{{stringify(error.node)}}</code></pre>\n </div>\n </div>\n</ng-container>\n\n<ng-template #defaultError>\n <p class=\"is-mt-2 has-text-black\">\n <span class=\"is-pr-1\">If you are still stuck, please see</span>\n <a [href]=\"baseUrl + '/upload#example'\" target=\"_blank\">the example submissions and videos</a>\n <span class=\"is-px-1\">or try using the Wizard to get the first few rows of data formatted correctly, or use the chat to ask for help.</span>\n </p>\n</ng-template>\n", styles: [":host{display:block}\n"] }]
116
117
  }], propDecorators: { file: [{
117
118
  type: Input
118
119
  }], error: [{
119
120
  type: Input
120
121
  }] } });
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtdXBsb2FkLWVycm9ycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmlsZXMvZmlsZXMtdXBsb2FkLWVycm9ycy9maWxlcy11cGxvYWQtZXJyb3JzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9maWxlcy9maWxlcy11cGxvYWQtZXJyb3JzL2ZpbGVzLXVwbG9hZC1lcnJvcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsVUFBVSxFQUFFLFFBQVEsRUFBc0IsV0FBVyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFDdEYsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQVEsUUFBUSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXJELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7QUFFdkMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLElBQWMsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUVuRyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFekcsSUFBSyxT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aEd2QyxrK1dBb1FBOzJGRHBLYSwwQkFBMEI7a0JBTnRDLFNBQVM7K0JBQ0Usd0JBQXdCLG1CQUdqQix1QkFBdUIsQ0FBQyxNQUFNOzhCQUl2QyxJQUFJO3NCQURYLEtBQUs7Z0JBR0MsS0FBSztzQkFEWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdwYXBhcGFyc2UnO1xuaW1wb3J0IHtcbiAgU2NoZW1hVHlwZSwgTm9kZVR5cGUsIEpTT04gYXMgSGVzdGlhSnNvbiwgVXBsb2FkTGltaXQsIGlzRXhwYW5kYWJsZSwgdHlwZVRvU2NoZW1hVHlwZVxufSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgeyBGaWxlLCBNQVhfU0laRSwgU3VwcG9ydGVkRXh0ZW5zaW9ucyB9IGZyb20gJ0BoZXN0aWEtZWFydGgvYXBpJztcbmltcG9ydCB7IHRvQ3N2IH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEtY29udmVydCc7XG5cbmltcG9ydCB7IGJhc2VVcmwgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuXG5jb25zdCBub2RlVHlwZVRvU3RyaW5nID0gKHR5cGU6IE5vZGVUeXBlKSA9PiBgJHt0eXBlLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpfSR7dHlwZS5zdWJzdHJpbmcoMSl9YDtcblxuY29uc3QgYWNjZXB0ZWRUeXBlcyA9IE9iamVjdC52YWx1ZXMoTm9kZVR5cGUpLmZpbHRlcih2YWwgPT4gdmFsICE9PSBOb2RlVHlwZS5UZXJtKS5tYXAobm9kZVR5cGVUb1N0cmluZyk7XG5cbmVudW0gRXJyb3JLZXlzIHtcbiAgTm9EYXRhID0gJ25vLWRhdGEnLFxuICBOb0hlYWRlcnMgPSAnbm8taGVhZGVycycsXG4gIEludmFsaWRTaGVldE5hbWUgPSAnaW52YWxpZC1zaGVldC1uYW1lJyxcbiAgSW52YWxpZEZpcnN0Q29sdW1uID0gJ2ludmFsaWQtZmlyc3QtY29sdW1uJyxcbiAgRHVwbGljYXRlZEhlYWRlcnMgPSAnZHVwbGljYXRlZC1oZWFkZXJzJyxcbiAgRHVwbGljYXRlZElkcyA9ICdkdXBsaWNhdGVkLWlkcycsXG4gIFByb3BlcnR5SW52YWxpZEZvcm1hdCA9ICdwcm9wZXJ0eS1pbnZhbGlkLWZvcm1hdCcsXG4gIFByb3BlcnR5Tm90Rm91bmQgPSAncHJvcGVydHktbm90LWZvdW5kJyxcbiAgUHJvcGVydHlSZXF1aXJlZCA9ICdwcm9wZXJ0eS1yZXF1aXJlZCcsXG4gIFByb3BlcnR5SW50ZXJuYWwgPSAncHJvcGVydHktaW50ZXJuYWwnLFxuICBTY2hlbWFOb3RGb3VuZCA9ICdzY2hlbWEtbm90LWZvdW5kJyxcbiAgVXBsb2Fkc0xpbWl0ID0gJ3VwbG9hZC1saW1pdCcsXG4gIE5lc3RlZEhlYWRlcnMgPSAnbmVzdGVkLWhlYWRlcnMnLFxuICBSZWZlcmVuY2VFeGlzdGluZ0hlYWRlcnMgPSAncmVmZXJlbmNlLWV4aXN0aW5nLWhlYWRlcnMnLFxuICBNYXhTaXplID0gJ21heC1zaXplJyxcbiAgTWF4Um93cyA9ICdtYXgtcm93cydcbn1cblxuaW50ZXJmYWNlIElDU1ZIZWFkZXIge1xuICBuYW1lOiBzdHJpbmc7XG4gIGluZGV4OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBJQ1NWQ29sdW1uIGV4dGVuZHMgSUNTVkhlYWRlciB7XG4gIGNvbHVtbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSUVycm9yIHtcbiAgbWVzc2FnZTogRXJyb3JLZXlzO1xuICBzY2hlbWE/OiBTY2hlbWFUeXBlO1xuICBzY2hlbWFLZXk/OiBzdHJpbmc7XG4gIGtleT86IHN0cmluZztcbiAgcHJvcGVydHk/OiBzdHJpbmc7XG4gIHZhbHVlPzogYW55O1xuICBtaW4/OiBhbnk7XG4gIG1heD86IGFueTtcbiAgZXJyb3I/OiBzdHJpbmc7XG4gIG5vZGU/OiBIZXN0aWFKc29uPFNjaGVtYVR5cGU+O1xuICBpbmRleD86IG51bWJlcjtcbiAgaGVhZGVycz86IElDU1ZIZWFkZXJbXTtcbiAgc3VnZ2VzdGlvbnM/OiBzdHJpbmdbXTtcbn1cblxuY29uc3QgdmFsdWVUb05vZGVzID0gKHZhbHVlOiBhbnksIHR5cGU6IFNjaGVtYVR5cGUpID0+XG4gIEFycmF5LmlzQXJyYXkodmFsdWUpID8gKFxuICAgIGlzRXhwYW5kYWJsZSh2YWx1ZSkgPyB2YWx1ZS5tYXAodmFsID0+ICh7XG4gICAgICB0eXBlLFxuICAgICAgLi4udmFsXG4gICAgfSkpIDogbnVsbFxuICApIDogKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBbe1xuICAgICAgdHlwZSxcbiAgICAgIC4uLnZhbHVlXG4gICAgfV0gOiBudWxsXG4gICk7XG5cbmNvbnN0IG5vZGVzRnJvbUVycm9yID0gKGVycm9yPzogSUVycm9yLCB0eXBlPzogU2NoZW1hVHlwZSkgPT5cbiAgZXJyb3IgPyAodmFsdWVUb05vZGVzKGVycm9yLm5vZGUsIHR5cGUpIHx8IHZhbHVlVG9Ob2RlcyhlcnJvci52YWx1ZSwgZXJyb3Iuc2NoZW1hKSB8fCBbXSkgOiBbXTtcblxuY29uc3QgZXJyb3JDc3YgPSAobm9kZXMpID0+IHtcbiAgdHJ5IHsgcmV0dXJuIHRvQ3N2KG5vZGVzLCB0cnVlKTsgfSBjYXRjaCAoX2VycikgeyByZXR1cm4gJyc7IH1cbn07XG5cbmNvbnN0IG51bWJlclRvQ29sID0gKG51bTogbnVtYmVyKSA9PiB7XG4gIGxldCB0b3RhbCA9IG51bSArIDE7IC8vIHN0YXJ0cyBhdCAwXG4gIGxldCBzdHIgPSAnJztcbiAgd2hpbGUgKHRvdGFsID4gMCkge1xuICAgIGNvbnN0IHEgPSAodG90YWwgLSAxKSAvIDI2O1xuICAgIGNvbnN0IHIgPSAodG90YWwgLSAxKSAlIDI2O1xuICAgIHRvdGFsID0gTWF0aC5mbG9vcihxKTtcbiAgICBzdHIgPSBgJHtTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgcil9JHtzdHJ9YDtcbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGUtZmlsZXMtdXBsb2FkLWVycm9ycycsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWxlcy11cGxvYWQtZXJyb3JzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmlsZXMtdXBsb2FkLWVycm9ycy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBGaWxlc1VwbG9hZEVycm9yc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgZmlsZTogRmlsZTtcbiAgQElucHV0KClcbiAgcHVibGljIGVycm9yOiBJRXJyb3I7XG5cbiAgcHVibGljIGJhc2VVcmwgPSBiYXNlVXJsKCk7XG4gIHB1YmxpYyBub2RlVHlwZXMgPSBhY2NlcHRlZFR5cGVzO1xuICBwdWJsaWMgRXJyb3JLZXlzID0gRXJyb3JLZXlzO1xuICBwdWJsaWMgVXBsb2FkTGltaXQgPSBVcGxvYWRMaW1pdDtcbiAgcHVibGljIE1BWF9TSVpFID0gTUFYX1NJWkU7XG4gIHB1YmxpYyBjb2x1bW5zOiBJQ1NWQ29sdW1uW10gPSBbXTtcbiAgcHVibGljIGhlYWRlcnM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyByb3dzOiBzdHJpbmdbXVtdID0gW107XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jb2x1bW5zID0gKHRoaXMuZXJyb3I/LmhlYWRlcnMgfHwgW10pLm1hcChoZWFkZXIgPT4gKHtcbiAgICAgIC4uLmhlYWRlcixcbiAgICAgIGNvbHVtbjogbnVtYmVyVG9Db2woaGVhZGVyLmluZGV4KVxuICAgIH0pKTtcbiAgICBjb25zdCBzY2hlbWFUeXBlID0gdGhpcy5lcnJvcj8ua2V5ID8gdHlwZVRvU2NoZW1hVHlwZSh0aGlzLmVycm9yLmtleS5zcGxpdCgnLicpWzBdKSA6IG51bGw7XG4gICAgY29uc3Qgbm9kZVR5cGUgPSBPYmplY3QudmFsdWVzKFNjaGVtYVR5cGUpLmluY2x1ZGVzKHNjaGVtYVR5cGUpID8gc2NoZW1hVHlwZSA6IHRoaXMuZXJyb3I/LnNjaGVtYTtcbiAgICBjb25zdCBub2RlcyA9IG5vZGVzRnJvbUVycm9yKHRoaXMuZXJyb3IsIG5vZGVUeXBlKTtcbiAgICBjb25zdCBjc3YgPSBlcnJvckNzdihub2RlcykudHJpbSgpO1xuICAgIGNvbnN0IHsgZGF0YTogW2hlYWRlcnMsIC4uLnJvd3NdIH0gPSBjc3YgPyBwYXJzZShjc3YpIDogeyBkYXRhOiBbW11dIH07XG4gICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICB0aGlzLnJvd3MgPSByb3dzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgaXNKU09ORmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5maWxlPy5maWxlbmFtZT8uZW5kc1dpdGgoU3VwcG9ydGVkRXh0ZW5zaW9ucy5qc29uKTtcbiAgfVxuXG4gIHB1YmxpYyBzdHJpbmdpZnkodmFsdWUpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpO1xuICB9XG5cbiAgcHVibGljIGhhc0R1cGxpY2F0ZWRFcnJvcih2YWx1ZTogc3RyaW5nLCBjb2xJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgZmlyc3RWYWwgPSB0aGlzLnJvd3NbMF1bY29sSW5kZXhdO1xuICAgIHJldHVybiB2YWx1ZSAhPT0gZmlyc3RWYWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc051bWJlcldpdGhDb21tYXNFcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcj8uZXJyb3IgPT09ICdmYWlsZWQgdG8gcGFyc2UgbnVtYmVyJyAmJiAoYCR7dGhpcy5lcnJvcj8udmFsdWV9YCB8fCAnJykuaW5jbHVkZXMoJywnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNTY2hlbWFFcnJvcigpIHtcbiAgICByZXR1cm4gW1xuICAgICAgRXJyb3JLZXlzLlByb3BlcnR5Tm90Rm91bmQsXG4gICAgICBFcnJvcktleXMuU2NoZW1hTm90Rm91bmRcbiAgICBdLmluY2x1ZGVzKHRoaXMuZXJyb3I/Lm1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIGdldCBzaG93Q3N2UHJldmlldygpIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkZXJzPy5sZW5ndGggJiYgdGhpcy5yb3dzPy5sZW5ndGggJiYgIXRoaXMuaXNTY2hlbWFFcnJvciAmJiAhdGhpcy5pc0pTT05GaWxlO1xuICB9XG5cbiAgcHVibGljIGdldCBzaG93SnNvblByZXZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3I/Lm5vZGUgJiYgdGhpcy5pc0pTT05GaWxlO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiISFlcnJvclwiPlxuICA8ZGl2IGNsYXNzPVwiaGFzLXRleHQtZGFuZ2VyXCIgW25nU3dpdGNoXT1cImVycm9yPy5tZXNzYWdlXCI+XG4gICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIiAqbmdTd2l0Y2hDYXNlPVwiRXJyb3JLZXlzLk5vRGF0YVwiPlxuICAgICAgPHA+XG4gICAgICAgIE5vIE5vZGVzIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgU3VibWlzc2lvbi5cbiAgICAgICAgUGxlYXNlIHZlcmlmeSB0aGUgY29sdW1uIGhlYWRlcnMgbWF0Y2ggdGhlIEhlc3RpYSBzY2hlbWEuXG4gICAgICA8L3A+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWZhdWx0RXJyb3JcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCIgKm5nU3dpdGNoQ2FzZT1cIkVycm9yS2V5cy5Qcm9wZXJ0eU5vdEZvdW5kXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uIGlzLWRhbmdlclwiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICA8cD5cbiAgICAgICAgICA8ZmEtaWNvbiBjbGFzcz1cInByLTJcIiBpY29uPVwiZXhjbGFtYXRpb24tdHJpYW5nbGVcIj48L2ZhLWljb24+XG4gICAgICAgICAgPHNwYW4+WW91IGhhdmUgY29sdW1uIGhlYWRlcnMgdGhhdCBkbyBub3QgbWF0Y2ggdGhlIEhlc3RpYSBzY2hlbWEuPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHgtMVwiPlBsZWFzZSByZWZlciB0byB0aGU8L3NwYW4+XG4gICAgICAgICAgPGEgW2hyZWZdPVwiYmFzZVVybCArICcvc2NoZW1hLycgKyBlcnJvci5zY2hlbWFcIiB0YXJnZXQ9XCJfYmxhbmtcIj5zY2hlbWE8L2E+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0xXCI+YW5kIHRoZW4gY29ycmVjdCB0aGUgY29sdW1uIGhlYWRlcnMgaW5kaWNhdGVkIGJlbG93Ljwvc3Bhbj5cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWZhdWx0RXJyb3JcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiPlxuICAgICAgICA8cHJlPjxjb2RlPnt7ZXJyb3Iua2V5fX08L2NvZGU+PC9wcmU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCIgKm5nU3dpdGNoQ2FzZT1cIkVycm9yS2V5cy5Qcm9wZXJ0eUludmFsaWRGb3JtYXRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCI+XG4gICAgICAgIDxzcGFuPlRoZSBmb2xsb3dpbmcgdmFsdWUgaW4gdGhlIGNvbHVtbiA8aT57e2Vycm9yLmtleX19PC9pPiBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0Ojwvc3Bhbj5cbiAgICAgICAgPGJyPlxuICAgICAgICA8cHJlIGNsYXNzPVwiaXMtbXQtMlwiPjxjb2RlPnt7c3RyaW5naWZ5KGVycm9yLnZhbHVlKX19PC9jb2RlPjwvcHJlPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJoYXNOdW1iZXJXaXRoQ29tbWFzRXJyb3JcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwidHJ1ZVwiPlxuICAgICAgICAgIDxwIGNsYXNzPVwiaXMtbXQtMlwiPlxuICAgICAgICAgICAgUGxlYXNlIGZvcm1hdCB5b3VyIG51bWJlcnMgdG8gcmVtb3ZlIGNvbW1hcyBhbmQgdXNlIGEgZGVjaW1hbCBwb2ludCB0byBzZXBhcmF0ZSB0aGUgd2hvbGUgcGFydCBvZiB0aGUgbnVtYmVyIGZyb20gdGhlIGZyYWN0aW9uYWwgcGFydCBvZiB0aGUgbnVtYmVyLlxuICAgICAgICAgIDwvcD5cblxuICAgICAgICAgIDxwIGNsYXNzPVwiaXMtbXQtMiBoYXMtdGV4dC1kYW5nZXIgaGFzLXRleHQtdW5kZXJsaW5lXCI+SW5jb3JyZWN0OjwvcD5cbiAgICAgICAgICA8cHJlIGNsYXNzPVwiaXMtbXQtMlwiPjxjb2RlPjMsNTEwLjE8L2NvZGU+PC9wcmU+XG5cbiAgICAgICAgICA8cCBjbGFzcz1cImlzLW10LTIgaGFzLXRleHQtc3VjY2VzcyBoYXMtdGV4dC11bmRlcmxpbmVcIj5Db3JyZWN0OjwvcD5cbiAgICAgICAgICA8cHJlIGNsYXNzPVwiaXMtbXQtMlwiPjxjb2RlPjM1MTAuMTwvY29kZT48L3ByZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiZmFsc2VcIj5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHItMVwiPllvdSBjYW4gc2VlIHRoZSBhY2NlcHRlZCBmaWVsZCB0eXBlIGFuZCBzb21lIGV4YW1wbGVzPC9zcGFuPlxuICAgICAgICAgICAgPGEgW2hyZWZdPVwiYmFzZVVybCArICcvc2NoZW1hLycgKyBlcnJvci5zY2hlbWEgKyAnIycgKyAoZXJyb3Iuc2NoZW1hS2V5IHx8IGVycm9yLmtleSlcIiB0YXJnZXQ9XCJfYmxhbmtcIj5oZXJlPC9hPlxuICAgICAgICAgICAgPHNwYW4+Ljwvc3Bhbj5cbiAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICA8cD5UaGUgZXJyb3IgY291bGQgZWl0aGVyIGJlIGEgdmFsdWUgaW4gdGhlIGNvbHVtbiwgb3IgYW4gZXJyb3Igd2l0aCB0aGUgY29sdW1uIGhlYWRlci48L3A+XG4gICAgICAgICAgPHA+SWYgeW91IGFyZSB0cnlpbmcgdG8gc2V0IG5vIGRhdGEsIHdlIGFjY2VwdCBlaXRoZXIgPGNvZGU+LTwvY29kZT4gb3IgYW4gZW1wdHkgY2VsbC48L3A+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiICpuZ1N3aXRjaENhc2U9XCJFcnJvcktleXMuUHJvcGVydHlSZXF1aXJlZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJwci0xXCI+VGhlIGZvbGxvd2luZyBmaWVsZCBpcyByZXF1aXJlZCBpbiB0aGU8L3NwYW4+XG4gICAgICAgIDxhIGNsYXNzPVwicHItMVwiICpuZ0lmPVwiZXJyb3Iuc2NoZW1hXCIgW2hyZWZdPVwiYmFzZVVybCArICcvc2NoZW1hLycgKyBlcnJvci5zY2hlbWFcIiB0YXJnZXQ9XCJfYmxhbmtcIj57e2Vycm9yLnNjaGVtYX19PC9hPlxuICAgICAgICA8c3Bhbj5zY2hlbWE6PC9zcGFuPlxuICAgICAgICA8YnI+XG4gICAgICAgIDxwcmUgY2xhc3M9XCJpcy1tdC0yXCI+PGNvZGU+e3tlcnJvci5wcm9wZXJ0eX19PC9jb2RlPjwvcHJlPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBbbmdTd2l0Y2hdPVwiZXJyb3IucHJvcGVydHlcIj5cbiAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidpZCdcIj5Zb3UgbXVzdCBhc3NpZ24gYSB1bmlxdWUgPGNvZGU+aWQ8L2NvZGU+IGZvciBldmVyeSByZWNvcmQgaW4geW91ciBkYXRhLjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid0eXBlJ1wiPkV2ZXJ5IHJlY29yZCBpbiB5b3VyIGRhdGEgbXVzdCBjb250YWluIGEgPGNvZGU+dHlwZTwvY29kZT4uPC9zcGFuPlxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIiAqbmdTd2l0Y2hDYXNlPVwiRXJyb3JLZXlzLlByb3BlcnR5SW50ZXJuYWxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicHItMVwiPlRoZSBmb2xsb3dpbmcgZmllbGQgaXMgPGNvZGU+aW50ZXJuYWw8L2NvZGU+IGluIHRoZTwvc3Bhbj5cbiAgICAgICAgPGEgW2hyZWZdPVwiYmFzZVVybCArICcvc2NoZW1hLycgKyBlcnJvci5zY2hlbWEgKyAnIycgKyAoZXJyb3Iuc2NoZW1hS2V5IHx8IGVycm9yLmtleSlcIiB0YXJnZXQ9XCJfYmxhbmtcIj57e2Vycm9yLnNjaGVtYX19IHNjaGVtYTwvYT5cbiAgICAgICAgPHNwYW4+Ojwvc3Bhbj5cbiAgICAgICAgPGJyPlxuICAgICAgICA8cHJlIGNsYXNzPVwiaXMtbXQtMlwiPjxjb2RlPnt7ZXJyb3Iuc2NoZW1hS2V5IHx8IGVycm9yLmtleX19PC9jb2RlPjwvcHJlPlxuICAgICAgPC9kaXY+XG4gICAgICA8cD5Zb3UgY2Fubm90IHVwbG9hZCA8Y29kZT5pbnRlcm5hbDwvY29kZT4gZmllbGRzIHRvIEhlc3RpYS48L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiICpuZ1N3aXRjaENhc2U9XCJFcnJvcktleXMuU2NoZW1hTm90Rm91bmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCI+XG4gICAgICAgIDxzcGFuPlRoZSBmb2xsb3dpbmcgTm9kZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgc2NoZW1hOjwvc3Bhbj5cbiAgICAgICAgPGJyPlxuICAgICAgICA8cHJlIGNsYXNzPVwiaXMtbXQtMlwiPjxjb2RlPnt7ZXJyb3Iua2V5fX08L2NvZGU+PC9wcmU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwPlxuICAgICAgICA8c3Bhbj5UaGUgbGlzdCBvZiBhY2NlcHRlZCB2YWx1ZXMgaXM6PC9zcGFuPlxuICAgICAgPC9wPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgdHlwZSBvZiBub2RlVHlwZXNcIj48aT57e3R5cGV9fTwvaT48L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJFcnJvcktleXMuVXBsb2Fkc0xpbWl0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiPlxuICAgICAgICA8c3Bhbj5Zb3UgaGF2ZSByZWFjaGVkIHRoZSB1cGxvYWQgbGltaXQgb2Y8L3NwYW4+XG4gICAgICAgIDxjb2RlIGNsYXNzPVwibXgtMVwiPnt7VXBsb2FkTGltaXRbZXJyb3Iuc2NoZW1hXX19PC9jb2RlPlxuICAgICAgICA8c3Bhbj57e2Vycm9yLnNjaGVtYX19IGluIGEgc2luZ2xlIHN1Ym1pc3Npb24gKDxiPnt7ZXJyb3IudmFsdWV9fTwvYj4gaGF2ZSBiZWVuIGZvdW5kKS48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHA+XG4gICAgICAgIDxzcGFuPlBsZWFzZSByZS11cGxvYWQgdGhlIGRhdGEgaW4gbXVsdGlwbGUgc3VibWlzc2lvbnMgd2l0aCBhIG1heGltdW0gb2Y8L3NwYW4+XG4gICAgICAgIDxjb2RlIGNsYXNzPVwibXgtMVwiPnt7VXBsb2FkTGltaXRbZXJyb3Iuc2NoZW1hXX19PC9jb2RlPlxuICAgICAgICA8c3Bhbj57e2Vycm9yLnNjaGVtYX19IGluIGVhY2ggc3VibWlzc2lvbi48L3NwYW4+XG4gICAgICA8L3A+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiICpuZ1N3aXRjaENhc2U9XCJFcnJvcktleXMuSW52YWxpZEZpcnN0Q29sdW1uXCI+XG4gICAgICA8c3Bhbj5cbiAgICAgICAgTm8gZGF0YSBpbiB0aGUgSGVzdGlhIGZvcm1hdCB3YXMgZGV0ZWN0ZWQgb24gdGhlIGZpcnN0IHNoZWV0LlxuICAgICAgICBFaXRoZXIgdHJ5IHNlbGVjdGluZyBhIGRpZmZlcmVudCBzaGVldCBpbiB0aGUgdXBsb2FkIHNjcmVlbiwgb3IgY2hlY2sgdGhlIHNoZWV0IHRvIGVuc3VyZSB0aGUgaGVhZGVycyBmb2xsb3cgdGhlIHNjaGVtYSAtIHNlZSBleGFtcGxlc1xuICAgICAgPC9zcGFuPlxuICAgICAgPGEgY2xhc3M9XCJwbC0xXCIgcm91dGVyTGluaz1cIi91cGxvYWRcIiBmcmFnbWVudD1cImV4YW1wbGVcIj5oZXJlPC9hPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIiAqbmdTd2l0Y2hDYXNlPVwiRXJyb3JLZXlzLk5vSGVhZGVyc1wiPlxuICAgICAgPHA+XG4gICAgICAgIE5vIGhlYWRlcnMgbWF0Y2hpbmcgdGhlIEhlc3RpYSBzY2hlbWEgd2VyZSBmb3VuZCBvbiB0aGUgZmlyc3Qgcm93LlxuICAgICAgICBQbGVhc2UgcmVtb3ZlIGFsbCBlbXB0eSByb3dzIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgZmlsZSBhbmQgdHJ5IHVwbG9hZGluZyBhZ2Fpbi5cbiAgICAgIDwvcD5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlZmF1bHRFcnJvclwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIiAqbmdTd2l0Y2hDYXNlPVwiRXJyb3JLZXlzLkludmFsaWRTaGVldE5hbWVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicHItMVwiPlRoZSBFeGNlbCBzaGVldDwvc3Bhbj5cbiAgICAgICAgPGNvZGU+e3tlcnJvci52YWx1ZX19PC9jb2RlPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj5kb2VzIG5vdCBleGlzdC48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiPllvdXIgRXhjZWwgZmlsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIHNoZWV0czo8L3NwYW4+XG4gICAgICAgIDx1bCBjbGFzcz1cIm10LTEgY29udGVudCBpcy1saXN0LXN0eWxlLWRpc2MgcGwtNVwiPlxuICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgZSBvZiBlcnJvci5lcnJvci5zcGxpdCgnOycpXCI+XG4gICAgICAgICAgICA8Y29kZT57e2V9fTwvY29kZT5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxwPlxuICAgICAgICA8c3Bhbj5QbGVhc2UgcmUtdXBsb2FkIHNlbGVjdGluZyBvbmUgb2YgdGhlIHNoZWV0cyBhYm92ZS48L3NwYW4+XG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiICpuZ1N3aXRjaENhc2U9XCJFcnJvcktleXMuRHVwbGljYXRlZEhlYWRlcnNcIj5cbiAgICAgIDxzcGFuPllvdXIgc3VibWlzc2lvbiBjb250YWlucyBkdXBsaWNhdGVkIGNvbHVtbiBoZWFkZXJzLjwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCIgKm5nU3dpdGNoQ2FzZT1cIkVycm9yS2V5cy5EdXBsaWNhdGVkSWRzXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInByLTFcIj5Zb3UgaGF2ZSBtdWx0aXBsZTwvc3Bhbj5cbiAgICAgIDxjb2RlPnt7ZXJyb3Iuc2NoZW1hIHwgcGx1cmFsaXplfX08L2NvZGU+XG4gICAgICA8c3BhbiBjbGFzcz1cInB4LTFcIj53aXRoIHRoZSBzYW1lPC9zcGFuPlxuICAgICAgPGEgW2hyZWZdPVwiYmFzZVVybCArICcvc2NoZW1hLycgKyBlcnJvci5zY2hlbWEgKyAnIycgKyBlcnJvci5zY2hlbWFLZXlcIiB0YXJnZXQ9XCJfYmxhbmtcIj57e2Vycm9yLnNjaGVtYUtleX19PC9hPlxuICAgICAgPHNwYW4gY2xhc3M9XCJweC0xXCI+YnV0IGRpZmZlcmVudCBkYXRhLiBUaGU8L3NwYW4+XG4gICAgICA8YSBbaHJlZl09XCJiYXNlVXJsICsgJy9zY2hlbWEvJyArIGVycm9yLnNjaGVtYSArICcjJyArIGVycm9yLnNjaGVtYUtleVwiIHRhcmdldD1cIl9ibGFua1wiPnt7ZXJyb3Iuc2NoZW1hS2V5fX08L2E+XG4gICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj5pczo8L3NwYW4+XG4gICAgICA8YnI+XG4gICAgICA8cHJlIGNsYXNzPVwiaXMtbXQtMlwiPjxjb2RlPnt7ZXJyb3IudmFsdWV9fTwvY29kZT48L3ByZT5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCIgKm5nU3dpdGNoQ2FzZT1cIkVycm9yS2V5cy5OZXN0ZWRIZWFkZXJzXCI+XG4gICAgICA8cD5cbiAgICAgICAgVG8gbGluayBub2RlcyB0b2dldGhlciwgeW91IGZpcnN0IG5lZWQgdG8gZGVmaW5lIHRoZSBub2RlIChlLmcuLCA8Y29kZT5zb3VyY2UuaWQ8L2NvZGU+LCA8Y29kZT5zb3VyY2UuYmlibGlvZ3JhcGh5LnRpdGxlPC9jb2RlPikgYW5kIHRoZW4gY3JlYXRlIHRoZSBsaW5rIChlLmcuLCA8Y29kZT5jeWNsZS5kZWZhdWx0U291cmNlLmlkPC9jb2RlPikuXG4gICAgICAgIFdlIGRvIG5vdCBhbGxvdyBuZXN0aW5nIChlLmcuLCA8Y29kZT5jeWNsZS5kZWZhdWx0U291cmNlLmJpYmxpb2dyYXBoeS50aXRsZTwvY29kZT4pLlxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIiAqbmdTd2l0Y2hDYXNlPVwiRXJyb3JLZXlzLlJlZmVyZW5jZUV4aXN0aW5nSGVhZGVyc1wiPlxuICAgICAgPHA+WW91IGhhdmUgdXNlZCB0aGUgaW50ZXJuYWwgPGNvZGU+QGlkPC9jb2RlPiBmaWVsZCB0byB1cGxvYWQgYSBuZXcgTm9kZS48L3A+XG4gICAgICA8cD5UaGUgPGNvZGU+QGlkPC9jb2RlPiBmaWVsZCBzaG91bGQgb25seSBiZSB1c2VkIHRvIHJlZmVyZW5jZSBleGlzdGluZyBOb2RlIG9yIFRlcm1zLiBFeGFtcGxlOjwvcD5cblxuICAgICAgPHAgY2xhc3M9XCJpcy1tdC0yIGhhcy10ZXh0LWRhbmdlciBoYXMtdGV4dC11bmRlcmxpbmVcIj5JbmNvcnJlY3Q6PC9wPlxuICAgICAgPHByZSBjbGFzcz1cImlzLW10LTJcIj48Y29kZT5jeWNsZS5AaWQsY3ljbGUuaW5wdXRzLjAudGVybS5AaWQsc291cmNlLmlkPC9jb2RlPjwvcHJlPlxuXG4gICAgICA8cCBjbGFzcz1cImlzLW10LTIgaGFzLXRleHQtc3VjY2VzcyBoYXMtdGV4dC11bmRlcmxpbmVcIj5Db3JyZWN0OjwvcD5cbiAgICAgIDxwcmUgY2xhc3M9XCJpcy1tdC0yXCI+PGNvZGU+Y3ljbGUuaWQsY3ljbGUuaW5wdXRzLjAudGVybS5AaWQsc291cmNlLmlkPC9jb2RlPjwvcHJlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIiAqbmdTd2l0Y2hDYXNlPVwiRXJyb3JLZXlzLk1heFNpemVcIj5cbiAgICAgIDxzcGFuPlRoZSBtYXhpbXVtIGZpbGUgc2l6ZSBsaW1pdCBpcyB7e01BWF9TSVpFfX1NYiAoY3VycmVudCBmaWxlIHNpemU6IHt7ZXJyb3IudmFsdWV9fU1iKS48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj5QbGVhc2UgcmUtdXBsb2FkIHRoZSBkYXRhIGluIG11bHRpcGxlIHN1Ym1pc3Npb25zLjwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCIgKm5nU3dpdGNoQ2FzZT1cIkVycm9yS2V5cy5NYXhSb3dzXCI+XG4gICAgICA8c3Bhbj5Zb3VyIGZpbGUgaGFzIHt7ZXJyb3IudmFsdWUgfCBudW1iZXJ9fSByb3dzLiBUaGlzIG1pZ2h0IGJlIGFuIGVycm9yIGNhdXNlZCBieSBhZGRpbmcgc29tZSBkYXRhIGF0IHRoZSBib3R0b20gb2YgYSBzcHJlYWRzaGVldCBieSBhY2NpZGVudDogZGVsZXRlIGFueSB1bnVzZWQgcm93cyBhbmQgcmVzdWJtaXQgdGhlIGZpbGUuPC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm15LTNcIiAqbmdJZj1cImNvbHVtbnMubGVuZ3RoIHx8IChlcnJvci5pbmRleCAmJiAhaXNTY2hlbWFFcnJvcilcIj5cbiAgICAgIDxiPkhpbnQ6PC9iPlxuICAgICAgPHNwYW4gY2xhc3M9XCJwbC0xXCI+dGhlIGVycm9yIG1pZ2h0IGJlIGxvY2F0ZWQ8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIiAqbmdJZj1cImVycm9yLmluZGV4ICYmICFpc1NjaGVtYUVycm9yXCI+b24gcm93IHt7ZXJyb3IuaW5kZXh9fTwvc3Bhbj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW5zLmxlbmd0aFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj5pbiB7eydjb2x1bW4nIHwgcGx1cmFsaXplOmNvbHVtbnMubGVuZ3RofX06PC9zcGFuPlxuICAgICAgICA8dWwgY2xhc3M9XCJtdC0xIGNvbnRlbnQgaXMtbGlzdC1zdHlsZS1kaXNjIHBsLTVcIj5cbiAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCI+XG4gICAgICAgICAgICA8YiBjbGFzcz1cInByLTJcIj57e2NvbHVtbi5jb2x1bW59fTwvYj5cbiAgICAgICAgICAgIDxjb2RlPnt7Y29sdW1uLm5hbWV9fTwvY29kZT5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibXktM1wiICpuZ0lmPVwiZXJyb3Iuc3VnZ2VzdGlvbnM/Lmxlbmd0aFwiPlxuICAgICAgPGI+U3VnZ2VzdGlvbnM6PC9iPlxuICAgICAgPHNwYW4gY2xhc3M9XCJwbC0xXCI+ZGlkIHlvdSBtZWFuIGluc3RlYWQ6PC9zcGFuPlxuICAgICAgPHVsIGNsYXNzPVwibXQtMSBjb250ZW50IGlzLWxpc3Qtc3R5bGUtZGlzYyBwbC01XCI+XG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgc3VnZ2VzdGlvbiBvZiBlcnJvci5zdWdnZXN0aW9uc1wiPlxuICAgICAgICAgIDxjb2RlPnt7c3VnZ2VzdGlvbn19PC9jb2RlPlxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJzaG93Q3N2UHJldmlld1wiIGNsYXNzPVwiaXMtbXktMlwiPlxuICAgICAgPGI+UHJldmlldzxzdXA+MTwvc3VwPjo8L2I+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyIGlzLW10LTJcIj5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtYm9yZGVyZWQgaXMtZnVsbHdpZHRoIGlzLWhvdmVyYWJsZSBpcy1uYXJyb3cgbWItMFwiPlxuICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgIDx0aCAqbmdJZj1cImVycm9yLmluZGV4XCI+PC90aD5cbiAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgaGVhZGVyIG9mIGhlYWRlcnNcIj57e2hlYWRlcn19PC90aD5cbiAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmJpbmRPbmNlPVwicm93c1wiPlxuICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzXCI+XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiaGFzLXRleHQtZGFuZ2VyXCIgKm5nSWY9XCJlcnJvci5pbmRleFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1ub3dyYXBcIj5Sb3cge3tlcnJvci5pbmRleH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2wgb2Ygcm93OyBsZXQgY29sSW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhhcy10ZXh0LWRhbmdlcl09XCJlcnJvcj8ubWVzc2FnZSA9PT0gRXJyb3JLZXlzLkR1cGxpY2F0ZWRJZHMgJiYgaGFzRHVwbGljYXRlZEVycm9yKGNvbCwgY29sSW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgID57e2NvbCB8IGVsbGlwc2lzOjUwfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIGNsYXNzPVwiaXMtc2l6ZS03XCI+PGk+MS4gVGhlIHByZXZpZXcgZG9lcyBub3QgbmVjZXNzYXJpbHkgcmVmbGVjdCB0aGUgb3JpZ2luYWwgU3VibWlzc2lvbidzIG9yZGVyIG9yIGNvbnRlbnQuPC9pPjwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJzaG93SnNvblByZXZpZXdcIiBjbGFzcz1cImlzLW15LTJcIj5cbiAgICAgIDxiPlByZXZpZXc6PC9iPlxuICAgICAgPHByZSBjbGFzcz1cImlzLW10LTJcIj48Y29kZT57e3N0cmluZ2lmeShlcnJvci5ub2RlKX19PC9jb2RlPjwvcHJlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRFcnJvcj5cbiAgPHAgY2xhc3M9XCJpcy1tdC0yIGhhcy10ZXh0LWJsYWNrXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJpcy1wci0xXCI+SWYgeW91IGFyZSBzdGlsbCBzdHVjaywgcGxlYXNlIHNlZTwvc3Bhbj5cbiAgICA8YSBbaHJlZl09XCJiYXNlVXJsICsgJy91cGxvYWQjZXhhbXBsZSdcIiB0YXJnZXQ9XCJfYmxhbmtcIj50aGUgZXhhbXBsZSBzdWJtaXNzaW9ucyBhbmQgdmlkZW9zPC9hPlxuICAgIDxzcGFuIGNsYXNzPVwiaXMtcHgtMVwiPm9yIHRyeSB1c2luZyB0aGUgV2l6YXJkIHRvIGdldCB0aGUgZmlyc3QgZmV3IHJvd3Mgb2YgZGF0YSBmb3JtYXR0ZWQgY29ycmVjdGx5LCBvciB1c2UgdGhlIGNoYXQgdG8gYXNrIGZvciBoZWxwLjwvc3Bhbj5cbiAgPC9wPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtdXBsb2FkLWVycm9ycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmlsZXMvZmlsZXMtdXBsb2FkLWVycm9ycy9maWxlcy11cGxvYWQtZXJyb3JzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9maWxlcy9maWxlcy11cGxvYWQtZXJyb3JzL2ZpbGVzLXVwbG9hZC1lcnJvcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsVUFBVSxFQUFFLFFBQVEsRUFBc0IsV0FBVyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFDdEYsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQVEsUUFBUSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXJELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7QUFFdkMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLElBQWMsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUVuRyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFekcsTUFBTSxD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SEEzRFUsMEJBQTBCOzJHQUExQiwwQkFBMEIsd0dDakd2QyxpM1hBNlFBOzJGRDVLYSwwQkFBMEI7a0JBTnRDLFNBQVM7K0JBQ0Usd0JBQXdCLG1CQUdqQix1QkFBdUIsQ0FBQyxNQUFNOzhCQUl2QyxJQUFJO3NCQURYLEtBQUs7Z0JBR0MsS0FBSztzQkFEWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdwYXBhcGFyc2UnO1xuaW1wb3J0IHtcbiAgU2NoZW1hVHlwZSwgTm9kZVR5cGUsIEpTT04gYXMgSGVzdGlhSnNvbiwgVXBsb2FkTGltaXQsIGlzRXhwYW5kYWJsZSwgdHlwZVRvU2NoZW1hVHlwZVxufSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgeyBGaWxlLCBNQVhfU0laRSwgU3VwcG9ydGVkRXh0ZW5zaW9ucyB9IGZyb20gJ0BoZXN0aWEtZWFydGgvYXBpJztcbmltcG9ydCB7IHRvQ3N2IH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEtY29udmVydCc7XG5cbmltcG9ydCB7IGJhc2VVcmwgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuXG5jb25zdCBub2RlVHlwZVRvU3RyaW5nID0gKHR5cGU6IE5vZGVUeXBlKSA9PiBgJHt0eXBlLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpfSR7dHlwZS5zdWJzdHJpbmcoMSl9YDtcblxuY29uc3QgYWNjZXB0ZWRUeXBlcyA9IE9iamVjdC52YWx1ZXMoTm9kZVR5cGUpLmZpbHRlcih2YWwgPT4gdmFsICE9PSBOb2RlVHlwZS5UZXJtKS5tYXAobm9kZVR5cGVUb1N0cmluZyk7XG5cbmV4cG9ydCBlbnVtIEVycm9yS2V5cyB7XG4gIE5vRGF0YSA9ICduby1kYXRhJyxcbiAgTm9IZWFkZXJzID0gJ25vLWhlYWRlcnMnLFxuICBJbnZhbGlkSlNPTiA9ICdpbnZhbGlkLWpzb24nLFxuICBJbnZhbGlkU2hlZXROYW1lID0gJ2ludmFsaWQtc2hlZXQtbmFtZScsXG4gIEludmFsaWRGaXJzdENvbHVtbiA9ICdpbnZhbGlkLWZpcnN0LWNvbHVtbicsXG4gIER1cGxpY2F0ZWRIZWFkZXJzID0gJ2R1cGxpY2F0ZWQtaGVhZGVycycsXG4gIER1cGxpY2F0ZWRJZHMgPSAnZHVwbGljYXRlZC1pZHMnLFxuICBQcm9wZXJ0eUludmFsaWRGb3JtYXQgPSAncHJvcGVydHktaW52YWxpZC1mb3JtYXQnLFxuICBQcm9wZXJ0eU5vdEZvdW5kID0gJ3Byb3BlcnR5LW5vdC1mb3VuZCcsXG4gIFByb3BlcnR5UmVxdWlyZWQgPSAncHJvcGVydHktcmVxdWlyZWQnLFxuICBQcm9wZXJ0eUludGVybmFsID0gJ3Byb3BlcnR5LWludGVybmFsJyxcbiAgU2NoZW1hTm90Rm91bmQgPSAnc2NoZW1hLW5vdC1mb3VuZCcsXG4gIFVwbG9hZHNMaW1pdCA9ICd1cGxvYWQtbGltaXQnLFxuICBOZXN0ZWRIZWFkZXJzID0gJ25lc3RlZC1oZWFkZXJzJyxcbiAgUmVmZXJlbmNlRXhpc3RpbmdIZWFkZXJzID0gJ3JlZmVyZW5jZS1leGlzdGluZy1oZWFkZXJzJyxcbiAgTWF4U2l6ZSA9ICdtYXgtc2l6ZScsXG4gIE1heFJvd3MgPSAnbWF4LXJvd3MnXG59XG5cbmludGVyZmFjZSBJQ1NWSGVhZGVyIHtcbiAgbmFtZTogc3RyaW5nO1xuICBpbmRleDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSUNTVkNvbHVtbiBleHRlbmRzIElDU1ZIZWFkZXIge1xuICBjb2x1bW46IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRXJyb3Ige1xuICBtZXNzYWdlOiBFcnJvcktleXM7XG4gIHNjaGVtYT86IFNjaGVtYVR5cGU7XG4gIHNjaGVtYUtleT86IHN0cmluZztcbiAga2V5Pzogc3RyaW5nO1xuICBwcm9wZXJ0eT86IHN0cmluZztcbiAgdmFsdWU/OiBhbnk7XG4gIG1pbj86IGFueTtcbiAgbWF4PzogYW55O1xuICBlcnJvcj86IHN0cmluZztcbiAgbm9kZT86IEhlc3RpYUpzb248U2NoZW1hVHlwZT47XG4gIGluZGV4PzogbnVtYmVyO1xuICBoZWFkZXJzPzogSUNTVkhlYWRlcltdO1xuICBzdWdnZXN0aW9ucz86IHN0cmluZ1tdO1xufVxuXG5jb25zdCB2YWx1ZVRvTm9kZXMgPSAodmFsdWU6IGFueSwgdHlwZTogU2NoZW1hVHlwZSkgPT5cbiAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAoXG4gICAgaXNFeHBhbmRhYmxlKHZhbHVlKSA/IHZhbHVlLm1hcCh2YWwgPT4gKHtcbiAgICAgIHR5cGUsXG4gICAgICAuLi52YWxcbiAgICB9KSkgOiBudWxsXG4gICkgOiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IFt7XG4gICAgICB0eXBlLFxuICAgICAgLi4udmFsdWVcbiAgICB9XSA6IG51bGxcbiAgKTtcblxuY29uc3Qgbm9kZXNGcm9tRXJyb3IgPSAoZXJyb3I/OiBJRXJyb3IsIHR5cGU/OiBTY2hlbWFUeXBlKSA9PlxuICBlcnJvciA/ICh2YWx1ZVRvTm9kZXMoZXJyb3Iubm9kZSwgdHlwZSkgfHwgdmFsdWVUb05vZGVzKGVycm9yLnZhbHVlLCBlcnJvci5zY2hlbWEpIHx8IFtdKSA6IFtdO1xuXG5jb25zdCBlcnJvckNzdiA9IChub2RlcykgPT4ge1xuICB0cnkgeyByZXR1cm4gdG9Dc3Yobm9kZXMsIHRydWUpOyB9IGNhdGNoIChfZXJyKSB7IHJldHVybiAnJzsgfVxufTtcblxuY29uc3QgbnVtYmVyVG9Db2wgPSAobnVtOiBudW1iZXIpID0+IHtcbiAgbGV0IHRvdGFsID0gbnVtICsgMTsgLy8gc3RhcnRzIGF0IDBcbiAgbGV0IHN0ciA9ICcnO1xuICB3aGlsZSAodG90YWwgPiAwKSB7XG4gICAgY29uc3QgcSA9ICh0b3RhbCAtIDEpIC8gMjY7XG4gICAgY29uc3QgciA9ICh0b3RhbCAtIDEpICUgMjY7XG4gICAgdG90YWwgPSBNYXRoLmZsb29yKHEpO1xuICAgIHN0ciA9IGAke1N0cmluZy5mcm9tQ2hhckNvZGUoNjUgKyByKX0ke3N0cn1gO1xuICB9XG4gIHJldHVybiBzdHI7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZS1maWxlcy11cGxvYWQtZXJyb3JzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbGVzLXVwbG9hZC1lcnJvcnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWxlcy11cGxvYWQtZXJyb3JzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVzVXBsb2FkRXJyb3JzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBmaWxlOiBGaWxlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZXJyb3I6IElFcnJvcjtcblxuICBwdWJsaWMgYmFzZVVybCA9IGJhc2VVcmwoKTtcbiAgcHVibGljIG5vZGVUeXBlcyA9IGFjY2VwdGVkVHlwZXM7XG4gIHB1YmxpYyBFcnJvcktleXMgPSBFcnJvcktleXM7XG4gIHB1YmxpYyBVcGxvYWRMaW1pdCA9IFVwbG9hZExpbWl0O1xuICBwdWJsaWMgTUFYX1NJWkUgPSBNQVhfU0laRTtcbiAgcHVibGljIGNvbHVtbnM6IElDU1ZDb2x1bW5bXSA9IFtdO1xuICBwdWJsaWMgaGVhZGVyczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIHJvd3M6IHN0cmluZ1tdW10gPSBbXTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbHVtbnMgPSAodGhpcy5lcnJvcj8uaGVhZGVycyB8fCBbXSkubWFwKGhlYWRlciA9PiAoe1xuICAgICAgLi4uaGVhZGVyLFxuICAgICAgY29sdW1uOiBudW1iZXJUb0NvbChoZWFkZXIuaW5kZXgpXG4gICAgfSkpO1xuICAgIGNvbnN0IHNjaGVtYVR5cGUgPSB0aGlzLmVycm9yPy5rZXkgPyB0eXBlVG9TY2hlbWFUeXBlKHRoaXMuZXJyb3Iua2V5LnNwbGl0KCcuJylbMF0pIDogbnVsbDtcbiAgICBjb25zdCBub2RlVHlwZSA9IE9iamVjdC52YWx1ZXMoU2NoZW1hVHlwZSkuaW5jbHVkZXMoc2NoZW1hVHlwZSkgPyBzY2hlbWFUeXBlIDogdGhpcy5lcnJvcj8uc2NoZW1hO1xuICAgIGNvbnN0IG5vZGVzID0gbm9kZXNGcm9tRXJyb3IodGhpcy5lcnJvciwgbm9kZVR5cGUpO1xuICAgIGNvbnN0IGNzdiA9IGVycm9yQ3N2KG5vZGVzKS50cmltKCk7XG4gICAgY29uc3QgeyBkYXRhOiBbaGVhZGVycywgLi4ucm93c10gfSA9IGNzdiA/IHBhcnNlKGNzdikgOiB7IGRhdGE6IFtbXV0gfTtcbiAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgIHRoaXMucm93cyA9IHJvd3M7XG4gIH1cblxuICBwcml2YXRlIGdldCBpc0pTT05GaWxlKCkge1xuICAgIHJldHVybiB0aGlzLmZpbGU/LmZpbGVuYW1lPy5lbmRzV2l0aChTdXBwb3J0ZWRFeHRlbnNpb25zLmpzb24pO1xuICB9XG5cbiAgcHVibGljIHN0cmluZ2lmeSh2YWx1ZSkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMik7XG4gIH1cblxuICBwdWJsaWMgaGFzRHVwbGljYXRlZEVycm9yKHZhbHVlOiBzdHJpbmcsIGNvbEluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBmaXJzdFZhbCA9IHRoaXMucm93c1swXVtjb2xJbmRleF07XG4gICAgcmV0dXJuIHZhbHVlICE9PSBmaXJzdFZhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzTnVtYmVyV2l0aENvbW1hc0Vycm9yKCkge1xuICAgIHJldHVybiB0aGlzLmVycm9yPy5lcnJvciA9PT0gJ2ZhaWxlZCB0byBwYXJzZSBudW1iZXInICYmIChgJHt0aGlzLmVycm9yPy52YWx1ZX1gIHx8ICcnKS5pbmNsdWRlcygnLCcpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1NjaGVtYUVycm9yKCkge1xuICAgIHJldHVybiBbXG4gICAgICBFcnJvcktleXMuUHJvcGVydHlOb3RGb3VuZCxcbiAgICAgIEVycm9yS2V5cy5TY2hlbWFOb3RGb3VuZFxuICAgIF0uaW5jbHVkZXModGhpcy5lcnJvcj8ubWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNob3dDc3ZQcmV2aWV3KCkge1xuICAgIHJldHVybiB0aGlzLmhlYWRlcnM/Lmxlbmd0aCAmJiB0aGlzLnJvd3M/Lmxlbmd0aCAmJiAhdGhpcy5pc1NjaGVtYUVycm9yICYmICF0aGlzLmlzSlNPTkZpbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNob3dKc29uUHJldmlldygpIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcj8ubm9kZSAmJiB0aGlzLmlzSlNPTkZpbGU7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhIWVycm9yXCI+XG4gIDxkaXYgY2xhc3M9XCJoYXMtdGV4dC1kYW5nZXJcIiBbbmdTd2l0Y2hdPVwiZXJyb3I/Lm1lc3NhZ2VcIj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJFcnJvcktleXMuSW52YWxpZEpTT05cIj5cbiAgICAgIDxwPlRoZSBTdWJtaXNzaW9uIGRvZXMgbm90IGFwcGVhciB0byBjb250YWluIHZhbGlkIEpTT04gZGF0YTo8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJpcy1tdC0yXCI+XG4gICAgICAgIDxwcmU+PGNvZGU+e3tlcnJvci5lcnJvcn19PC9jb2RlPjwvcHJlPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxwPlBsZWFzZSB2YWxpZGF0ZSB5b3VyIEpTT04gY29udGVudCBiZWZvcmUgdXBsb2FkaW5nIGl0IHVzaW5nIGFuIDxhIGhyZWY9XCJodHRwczovL2pzb25lZGl0b3JvbmxpbmUub3JnXCIgdGFyZ2V0PVwiX2JsYW5rXCI+b25saW5lIHRvb2w8L2E+IGZvciBleGFtcGxlLjwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiICpuZ1N3aXRjaENhc2U9XCJFcnJvcktleXMuTm9EYXRhXCI+XG4gICAgICA8cD5cbiAgICAgICAgTm8gTm9kZXMgY291bGQgYmUgZm91bmQgaW4geW91ciBTdWJtaXNzaW9uLlxuICAgICAgICBQbGVhc2UgdmVyaWZ5IHRoZSBjb2x1bW4gaGVhZGVycyBtYXRjaCB0aGUgSGVzdGlhIHNjaGVtYS5cbiAgICAgIDwvcD5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlZmF1bHRFcnJvclwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIiAqbmdTd2l0Y2hDYXNlPVwiRXJyb3JLZXlzLlByb3BlcnR5Tm90Rm91bmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24gaXMtZGFuZ2VyXCIgcm9sZT1cImFsZXJ0XCI+XG4gICAgICAgIDxwPlxuICAgICAgICAgIDxmYS1pY29uIGNsYXNzPVwicHItMlwiIGljb249XCJleGNsYW1hdGlvbi10cmlhbmdsZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICA8c3Bhbj5Zb3UgaGF2ZSBjb2x1bW4gaGVhZGVycyB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgSGVzdGlhIHNjaGVtYS48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJweC0xXCI+UGxlYXNlIHJlZmVyIHRvIHRoZTwvc3Bhbj5cbiAgICAgICAgICA8YSBbaHJlZl09XCJiYXNlVXJsICsgJy9zY2hlbWEvJyArIGVycm9yLnNjaGVtYVwiIHRhcmdldD1cIl9ibGFua1wiPnNjaGVtYTwvYT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj5hbmQgdGhlbiBjb3JyZWN0IHRoZSBjb2x1bW4gaGVhZGVycyBpbmRpY2F0ZWQgYmVsb3cuPC9zcGFuPlxuICAgICAgICA8L3A+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlZmF1bHRFcnJvclwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCI+XG4gICAgICAgIDxwcmU+PGNvZGU+e3tlcnJvci5rZXl9fTwvY29kZT48L3ByZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIiAqbmdTd2l0Y2hDYXNlPVwiRXJyb3JLZXlzLlByb3BlcnR5SW52YWxpZEZvcm1hdFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIj5cbiAgICAgICAgPHNwYW4+VGhlIGZvbGxvd2luZyB2YWx1ZSBpbiB0aGUgY29sdW1uIDxpPnt7ZXJyb3Iua2V5fX08L2k+IGlzIG5vdCBpbiB0aGUgY29ycmVjdCBmb3JtYXQ6PC9zcGFuPlxuICAgICAgICA8YnI+XG4gICAgICAgIDxwcmUgY2xhc3M9XCJpcy1tdC0yXCI+PGNvZGU+e3tzdHJpbmdpZnkoZXJyb3IudmFsdWUpfX08L2NvZGU+PC9wcmU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImhhc051bWJlcldpdGhDb21tYXNFcnJvclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJpcy1tdC0yXCI+XG4gICAgICAgICAgICBQbGVhc2UgZm9ybWF0IHlvdXIgbnVtYmVycyB0byByZW1vdmUgY29tbWFzIGFuZCB1c2UgYSBkZWNpbWFsIHBvaW50IHRvIHNlcGFyYXRlIHRoZSB3aG9sZSBwYXJ0IG9mIHRoZSBudW1iZXIgZnJvbSB0aGUgZnJhY3Rpb25hbCBwYXJ0IG9mIHRoZSBudW1iZXIuXG4gICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgPHAgY2xhc3M9XCJpcy1tdC0yIGhhcy10ZXh0LWRhbmdlciBoYXMtdGV4dC11bmRlcmxpbmVcIj5JbmNvcnJlY3Q6PC9wPlxuICAgICAgICAgIDxwcmUgY2xhc3M9XCJpcy1tdC0yXCI+PGNvZGU+Myw1MTAuMTwvY29kZT48L3ByZT5cblxuICAgICAgICAgIDxwIGNsYXNzPVwiaXMtbXQtMiBoYXMtdGV4dC1zdWNjZXNzIGhhcy10ZXh0LXVuZGVybGluZVwiPkNvcnJlY3Q6PC9wPlxuICAgICAgICAgIDxwcmUgY2xhc3M9XCJpcy1tdC0yXCI+PGNvZGU+MzUxMC4xPC9jb2RlPjwvcHJlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJmYWxzZVwiPlxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwci0xXCI+WW91IGNhbiBzZWUgdGhlIGFjY2VwdGVkIGZpZWxkIHR5cGUgYW5kIHNvbWUgZXhhbXBsZXM8L3NwYW4+XG4gICAgICAgICAgICA8YSBbaHJlZl09XCJiYXNlVXJsICsgJy9zY2hlbWEvJyArIGVycm9yLnNjaGVtYSArICcjJyArIChlcnJvci5zY2hlbWFLZXkgfHwgZXJyb3Iua2V5KVwiIHRhcmdldD1cIl9ibGFua1wiPmhlcmU8L2E+XG4gICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxuICAgICAgICAgIDwvcD5cblxuICAgICAgICAgIDxwPlRoZSBlcnJvciBjb3VsZCBlaXRoZXIgYmUgYSB2YWx1ZSBpbiB0aGUgY29sdW1uLCBvciBhbiBlcnJvciB3aXRoIHRoZSBjb2x1bW4gaGVhZGVyLjwvcD5cbiAgICAgICAgICA8cD5JZiB5b3UgYXJlIHRyeWluZyB0byBzZXQgbm8gZGF0YSwgd2UgYWNjZXB0IGVpdGhlciA8Y29kZT4tPC9jb2RlPiBvciBhbiBlbXB0eSBjZWxsLjwvcD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCIgKm5nU3dpdGNoQ2FzZT1cIkVycm9yS2V5cy5Qcm9wZXJ0eVJlcXVpcmVkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInByLTFcIj5UaGUgZm9sbG93aW5nIGZpZWxkIGlzIHJlcXVpcmVkIGluIHRoZTwvc3Bhbj5cbiAgICAgICAgPGEgY2xhc3M9XCJwci0xXCIgKm5nSWY9XCJlcnJvci5zY2hlbWFcIiBbaHJlZl09XCJiYXNlVXJsICsgJy9zY2hlbWEvJyArIGVycm9yLnNjaGVtYVwiIHRhcmdldD1cIl9ibGFua1wiPnt7ZXJyb3Iuc2NoZW1hfX08L2E+XG4gICAgICAgIDxzcGFuPnNjaGVtYTo8L3NwYW4+XG4gICAgICAgIDxicj5cbiAgICAgICAgPHByZSBjbGFzcz1cImlzLW10LTJcIj48Y29kZT57e2Vycm9yLnByb3BlcnR5fX08L2NvZGU+PC9wcmU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIFtuZ1N3aXRjaF09XCJlcnJvci5wcm9wZXJ0eVwiPlxuICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2lkJ1wiPllvdSBtdXN0IGFzc2lnbiBhIHVuaXF1ZSA8Y29kZT5pZDwvY29kZT4gZm9yIGV2ZXJ5IHJlY29yZCBpbiB5b3VyIGRhdGEuPC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3R5cGUnXCI+RXZlcnkgcmVjb3JkIGluIHlvdXIgZGF0YSBtdXN0IGNvbnRhaW4gYSA8Y29kZT50eXBlPC9jb2RlPi48L3NwYW4+XG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiICpuZ1N3aXRjaENhc2U9XCJFcnJvcktleXMuUHJvcGVydHlJbnRlcm5hbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJwci0xXCI+VGhlIGZvbGxvd2luZyBmaWVsZCBpcyA8Y29kZT5pbnRlcm5hbDwvY29kZT4gaW4gdGhlPC9zcGFuPlxuICAgICAgICA8YSBbaHJlZl09XCJiYXNlVXJsICsgJy9zY2hlbWEvJyArIGVycm9yLnNjaGVtYSArICcjJyArIChlcnJvci5zY2hlbWFLZXkgfHwgZXJyb3Iua2V5KVwiIHRhcmdldD1cIl9ibGFua1wiPnt7ZXJyb3Iuc2NoZW1hfX0gc2NoZW1hPC9hPlxuICAgICAgICA8c3Bhbj46PC9zcGFuPlxuICAgICAgICA8YnI+XG4gICAgICAgIDxwcmUgY2xhc3M9XCJpcy1tdC0yXCI+PGNvZGU+e3tlcnJvci5zY2hlbWFLZXkgfHwgZXJyb3Iua2V5fX08L2NvZGU+PC9wcmU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwPllvdSBjYW5ub3QgdXBsb2FkIDxjb2RlPmludGVybmFsPC9jb2RlPiBmaWVsZHMgdG8gSGVzdGlhLjwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCIgKm5nU3dpdGNoQ2FzZT1cIkVycm9yS2V5cy5TY2hlbWFOb3RGb3VuZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIj5cbiAgICAgICAgPHNwYW4+VGhlIGZvbGxvd2luZyBOb2RlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBzY2hlbWE6PC9zcGFuPlxuICAgICAgICA8YnI+XG4gICAgICAgIDxwcmUgY2xhc3M9XCJpcy1tdC0yXCI+PGNvZGU+e3tlcnJvci5rZXl9fTwvY29kZT48L3ByZT5cbiAgICAgIDwvZGl2PlxuICAgICAgPHA+XG4gICAgICAgIDxzcGFuPlRoZSBsaXN0IG9mIGFjY2VwdGVkIHZhbHVlcyBpczo8L3NwYW4+XG4gICAgICA8L3A+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiPlxuICAgICAgICA8dWw+XG4gICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCB0eXBlIG9mIG5vZGVUeXBlc1wiPjxpPnt7dHlwZX19PC9pPjwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIkVycm9yS2V5cy5VcGxvYWRzTGltaXRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCI+XG4gICAgICAgIDxzcGFuPllvdSBoYXZlIHJlYWNoZWQgdGhlIHVwbG9hZCBsaW1pdCBvZjwvc3Bhbj5cbiAgICAgICAgPGNvZGUgY2xhc3M9XCJteC0xXCI+e3tVcGxvYWRMaW1pdFtlcnJvci5zY2hlbWFdfX08L2NvZGU+XG4gICAgICAgIDxzcGFuPnt7ZXJyb3Iuc2NoZW1hfX0gaW4gYSBzaW5nbGUgc3VibWlzc2lvbiAoPGI+e3tlcnJvci52YWx1ZX19PC9iPiBoYXZlIGJlZW4gZm91bmQpLjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8cD5cbiAgICAgICAgPHNwYW4+UGxlYXNlIHJlLXVwbG9hZCB0aGUgZGF0YSBpbiBtdWx0aXBsZSBzdWJtaXNzaW9ucyB3aXRoIGEgbWF4aW11bSBvZjwvc3Bhbj5cbiAgICAgICAgPGNvZGUgY2xhc3M9XCJteC0xXCI+e3tVcGxvYWRMaW1pdFtlcnJvci5zY2hlbWFdfX08L2NvZGU+XG4gICAgICAgIDxzcGFuPnt7ZXJyb3Iuc2NoZW1hfX0gaW4gZWFjaCBzdWJtaXNzaW9uLjwvc3Bhbj5cbiAgICAgIDwvcD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCIgKm5nU3dpdGNoQ2FzZT1cIkVycm9yS2V5cy5JbnZhbGlkRmlyc3RDb2x1bW5cIj5cbiAgICAgIDxzcGFuPlxuICAgICAgICBObyBkYXRhIGluIHRoZSBIZXN0aWEgZm9ybWF0IHdhcyBkZXRlY3RlZCBvbiB0aGUgZmlyc3Qgc2hlZXQuXG4gICAgICAgIEVpdGhlciB0cnkgc2VsZWN0aW5nIGEgZGlmZmVyZW50IHNoZWV0IGluIHRoZSB1cGxvYWQgc2NyZWVuLCBvciBjaGVjayB0aGUgc2hlZXQgdG8gZW5zdXJlIHRoZSBoZWFkZXJzIGZvbGxvdyB0aGUgc2NoZW1hIC0gc2VlIGV4YW1wbGVzXG4gICAgICA8L3NwYW4+XG4gICAgICA8YSBjbGFzcz1cInBsLTFcIiByb3V0ZXJMaW5rPVwiL3VwbG9hZFwiIGZyYWdtZW50PVwiZXhhbXBsZVwiPmhlcmU8L2E+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiICpuZ1N3aXRjaENhc2U9XCJFcnJvcktleXMuTm9IZWFkZXJzXCI+XG4gICAgICA8cD5cbiAgICAgICAgTm8gaGVhZGVycyBtYXRjaGluZyB0aGUgSGVzdGlhIHNjaGVtYSB3ZXJlIGZvdW5kIG9uIHRoZSBmaXJzdCByb3cuXG4gICAgICAgIFBsZWFzZSByZW1vdmUgYWxsIGVtcHR5IHJvd3MgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBmaWxlIGFuZCB0cnkgdXBsb2FkaW5nIGFnYWluLlxuICAgICAgPC9wPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGVmYXVsdEVycm9yXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiICpuZ1N3aXRjaENhc2U9XCJFcnJvcktleXMuSW52YWxpZFNoZWV0TmFtZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJwci0xXCI+VGhlIEV4Y2VsIHNoZWV0PC9zcGFuPlxuICAgICAgICA8Y29kZT57e2Vycm9yLnZhbHVlfX08L2NvZGU+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiPmRvZXMgbm90IGV4aXN0Ljwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0xXCI+WW91ciBFeGNlbCBmaWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgc2hlZXRzOjwvc3Bhbj5cbiAgICAgICAgPHVsIGNsYXNzPVwibXQtMSBjb250ZW50IGlzLWxpc3Qtc3R5bGUtZGlzYyBwbC01XCI+XG4gICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBlIG9mIGVycm9yLmVycm9yLnNwbGl0KCc7JylcIj5cbiAgICAgICAgICAgIDxjb2RlPnt7ZX19PC9jb2RlPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHA+XG4gICAgICAgIDxzcGFuPlBsZWFzZSByZS11cGxvYWQgc2VsZWN0aW5nIG9uZSBvZiB0aGUgc2hlZXRzIGFib3ZlLjwvc3Bhbj5cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJpcy1tYi0yXCIgKm5nU3dpdGNoQ2FzZT1cIkVycm9yS2V5cy5EdXBsaWNhdGVkSGVhZGVyc1wiPlxuICAgICAgPHNwYW4+WW91ciBzdWJtaXNzaW9uIGNvbnRhaW5zIGR1cGxpY2F0ZWQgY29sdW1uIGhlYWRlcnMuPC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIiAqbmdTd2l0Y2hDYXNlPVwiRXJyb3JLZXlzLkR1cGxpY2F0ZWRJZHNcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwicHItMVwiPllvdSBoYXZlIG11bHRpcGxlPC9zcGFuPlxuICAgICAgPGNvZGU+e3tlcnJvci5zY2hlbWEgfCBwbHVyYWxpemV9fTwvY29kZT5cbiAgICAgIDxzcGFuIGNsYXNzPVwicHgtMVwiPndpdGggdGhlIHNhbWU8L3NwYW4+XG4gICAgICA8YSBbaHJlZl09XCJiYXNlVXJsICsgJy9zY2hlbWEvJyArIGVycm9yLnNjaGVtYSArICcjJyArIGVycm9yLnNjaGVtYUtleVwiIHRhcmdldD1cIl9ibGFua1wiPnt7ZXJyb3Iuc2NoZW1hS2V5fX08L2E+XG4gICAgICA8c3BhbiBjbGFzcz1cInB4LTFcIj5idXQgZGlmZmVyZW50IGRhdGEuIFRoZTwvc3Bhbj5cbiAgICAgIDxhIFtocmVmXT1cImJhc2VVcmwgKyAnL3NjaGVtYS8nICsgZXJyb3Iuc2NoZW1hICsgJyMnICsgZXJyb3Iuc2NoZW1hS2V5XCIgdGFyZ2V0PVwiX2JsYW5rXCI+e3tlcnJvci5zY2hlbWFLZXl9fTwvYT5cbiAgICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiPmlzOjwvc3Bhbj5cbiAgICAgIDxicj5cbiAgICAgIDxwcmUgY2xhc3M9XCJpcy1tdC0yXCI+PGNvZGU+e3tlcnJvci52YWx1ZX19PC9jb2RlPjwvcHJlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIiAqbmdTd2l0Y2hDYXNlPVwiRXJyb3JLZXlzLk5lc3RlZEhlYWRlcnNcIj5cbiAgICAgIDxwPlxuICAgICAgICBUbyBsaW5rIG5vZGVzIHRvZ2V0aGVyLCB5b3UgZmlyc3QgbmVlZCB0byBkZWZpbmUgdGhlIG5vZGUgKGUuZy4sIDxjb2RlPnNvdXJjZS5pZDwvY29kZT4sIDxjb2RlPnNvdXJjZS5iaWJsaW9ncmFwaHkudGl0bGU8L2NvZGU+KSBhbmQgdGhlbiBjcmVhdGUgdGhlIGxpbmsgKGUuZy4sIDxjb2RlPmN5Y2xlLmRlZmF1bHRTb3VyY2UuaWQ8L2NvZGU+KS5cbiAgICAgICAgV2UgZG8gbm90IGFsbG93IG5lc3RpbmcgKGUuZy4sIDxjb2RlPmN5Y2xlLmRlZmF1bHRTb3VyY2UuYmlibGlvZ3JhcGh5LnRpdGxlPC9jb2RlPikuXG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiICpuZ1N3aXRjaENhc2U9XCJFcnJvcktleXMuUmVmZXJlbmNlRXhpc3RpbmdIZWFkZXJzXCI+XG4gICAgICA8cD5Zb3UgaGF2ZSB1c2VkIHRoZSBpbnRlcm5hbCA8Y29kZT5AaWQ8L2NvZGU+IGZpZWxkIHRvIHVwbG9hZCBhIG5ldyBOb2RlLjwvcD5cbiAgICAgIDxwPlRoZSA8Y29kZT5AaWQ8L2NvZGU+IGZpZWxkIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gcmVmZXJlbmNlIGV4aXN0aW5nIE5vZGUgb3IgVGVybXMuIEV4YW1wbGU6PC9wPlxuXG4gICAgICA8cCBjbGFzcz1cImlzLW10LTIgaGFzLXRleHQtZGFuZ2VyIGhhcy10ZXh0LXVuZGVybGluZVwiPkluY29ycmVjdDo8L3A+XG4gICAgICA8cHJlIGNsYXNzPVwiaXMtbXQtMlwiPjxjb2RlPmN5Y2xlLkBpZCxjeWNsZS5pbnB1dHMuMC50ZXJtLkBpZCxzb3VyY2UuaWQ8L2NvZGU+PC9wcmU+XG5cbiAgICAgIDxwIGNsYXNzPVwiaXMtbXQtMiBoYXMtdGV4dC1zdWNjZXNzIGhhcy10ZXh0LXVuZGVybGluZVwiPkNvcnJlY3Q6PC9wPlxuICAgICAgPHByZSBjbGFzcz1cImlzLW10LTJcIj48Y29kZT5jeWNsZS5pZCxjeWNsZS5pbnB1dHMuMC50ZXJtLkBpZCxzb3VyY2UuaWQ8L2NvZGU+PC9wcmU+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaXMtbWItMlwiICpuZ1N3aXRjaENhc2U9XCJFcnJvcktleXMuTWF4U2l6ZVwiPlxuICAgICAgPHNwYW4+VGhlIG1heGltdW0gZmlsZSBzaXplIGxpbWl0IGlzIHt7TUFYX1NJWkV9fU1iIChjdXJyZW50IGZpbGUgc2l6ZToge3tlcnJvci52YWx1ZX19TWIpLjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiPlBsZWFzZSByZS11cGxvYWQgdGhlIGRhdGEgaW4gbXVsdGlwbGUgc3VibWlzc2lvbnMuPC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImlzLW1iLTJcIiAqbmdTd2l0Y2hDYXNlPVwiRXJyb3JLZXlzLk1heFJvd3NcIj5cbiAgICAgIDxzcGFuPllvdXIgZmlsZSBoYXMge3tlcnJvci52YWx1ZSB8IG51bWJlcn19IHJvd3MuIFRoaXMgbWlnaHQgYmUgYW4gZXJyb3IgY2F1c2VkIGJ5IGFkZGluZyBzb21lIGRhdGEgYXQgdGhlIGJvdHRvbSBvZiBhIHNwcmVhZHNoZWV0IGJ5IGFjY2lkZW50OiBkZWxldGUgYW55IHVudXNlZCByb3dzIGFuZCByZXN1Ym1pdCB0aGUgZmlsZS48L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibXktM1wiICpuZ0lmPVwiY29sdW1ucy5sZW5ndGggfHwgKGVycm9yLmluZGV4ICYmICFpc1NjaGVtYUVycm9yKVwiPlxuICAgICAgPGI+SGludDo8L2I+XG4gICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj50aGUgZXJyb3IgbWlnaHQgYmUgbG9jYXRlZDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiICpuZ0lmPVwiZXJyb3IuaW5kZXggJiYgIWlzU2NoZW1hRXJyb3JcIj5vbiByb3cge3tlcnJvci5pbmRleH19PC9zcGFuPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbnMubGVuZ3RoXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiPmluIHt7J2NvbHVtbicgfCBwbHVyYWxpemU6Y29sdW1ucy5sZW5ndGh9fTo8L3NwYW4+XG4gICAgICAgIDx1bCBjbGFzcz1cIm10LTEgY29udGVudCBpcy1saXN0LXN0eWxlLWRpc2MgcGwtNVwiPlxuICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIj5cbiAgICAgICAgICAgIDxiIGNsYXNzPVwicHItMlwiPnt7Y29sdW1uLmNvbHVtbn19PC9iPlxuICAgICAgICAgICAgPGNvZGU+e3tjb2x1bW4ubmFtZX19PC9jb2RlPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJteS0zXCIgKm5nSWY9XCJlcnJvci5zdWdnZXN0aW9ucz8ubGVuZ3RoXCI+XG4gICAgICA8Yj5TdWdnZXN0aW9uczo8L2I+XG4gICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj5kaWQgeW91IG1lYW4gaW5zdGVhZDo8L3NwYW4+XG4gICAgICA8dWwgY2xhc3M9XCJtdC0xIGNvbnRlbnQgaXMtbGlzdC1zdHlsZS1kaXNjIHBsLTVcIj5cbiAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBzdWdnZXN0aW9uIG9mIGVycm9yLnN1Z2dlc3Rpb25zXCI+XG4gICAgICAgICAgPGNvZGU+e3tzdWdnZXN0aW9ufX08L2NvZGU+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cInNob3dDc3ZQcmV2aWV3XCIgY2xhc3M9XCJpcy1teS0yXCI+XG4gICAgICA8Yj5QcmV2aWV3PHN1cD4xPC9zdXA+OjwvYj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXIgaXMtbXQtMlwiPlxuICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBpcy1ib3JkZXJlZCBpcy1mdWxsd2lkdGggaXMtaG92ZXJhYmxlIGlzLW5hcnJvdyBtYi0wXCI+XG4gICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgPHRoICpuZ0lmPVwiZXJyb3IuaW5kZXhcIj48L3RoPlxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBoZWFkZXIgb2YgaGVhZGVyc1wiPnt7aGVhZGVyfX08L3RoPlxuICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqYmluZE9uY2U9XCJyb3dzXCI+XG4gICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHJvd3NcIj5cbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJoYXMtdGV4dC1kYW5nZXJcIiAqbmdJZj1cImVycm9yLmluZGV4XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLW5vd3JhcFwiPlJvdyB7e2Vycm9yLmluZGV4fX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGNvbCBvZiByb3c7IGxldCBjb2xJbmRleCA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLXRleHQtZGFuZ2VyXT1cImVycm9yPy5tZXNzYWdlID09PSBFcnJvcktleXMuRHVwbGljYXRlZElkcyAmJiBoYXNEdXBsaWNhdGVkRXJyb3IoY29sLCBjb2xJbmRleClcIlxuICAgICAgICAgICAgICAgICAgPnt7Y29sIHwgZWxsaXBzaXM6NTB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgY2xhc3M9XCJpcy1zaXplLTdcIj48aT4xLiBUaGUgcHJldmlldyBkb2VzIG5vdCBuZWNlc3NhcmlseSByZWZsZWN0IHRoZSBvcmlnaW5hbCBTdWJtaXNzaW9uJ3Mgb3JkZXIgb3IgY29udGVudC48L2k+PC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cInNob3dKc29uUHJldmlld1wiIGNsYXNzPVwiaXMtbXktMlwiPlxuICAgICAgPGI+UHJldmlldzo8L2I+XG4gICAgICA8cHJlIGNsYXNzPVwiaXMtbXQtMlwiPjxjb2RlPnt7c3RyaW5naWZ5KGVycm9yLm5vZGUpfX08L2NvZGU+PC9wcmU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEVycm9yPlxuICA8cCBjbGFzcz1cImlzLW10LTIgaGFzLXRleHQtYmxhY2tcIj5cbiAgICA8c3BhbiBjbGFzcz1cImlzLXByLTFcIj5JZiB5b3UgYXJlIHN0aWxsIHN0dWNrLCBwbGVhc2Ugc2VlPC9zcGFuPlxuICAgIDxhIFtocmVmXT1cImJhc2VVcmwgKyAnL3VwbG9hZCNleGFtcGxlJ1wiIHRhcmdldD1cIl9ibGFua1wiPnRoZSBleGFtcGxlIHN1Ym1pc3Npb25zIGFuZCB2aWRlb3M8L2E+XG4gICAgPHNwYW4gY2xhc3M9XCJpcy1weC0xXCI+b3IgdHJ5IHVzaW5nIHRoZSBXaXphcmQgdG8gZ2V0IHRoZSBmaXJzdCBmZXcgcm93cyBvZiBkYXRhIGZvcm1hdHRlZCBjb3JyZWN0bHksIG9yIHVzZSB0aGUgY2hhdCB0byBhc2sgZm9yIGhlbHAuPC9zcGFuPlxuICA8L3A+XG48L25nLXRlbXBsYXRlPlxuIl19