@softheon/armature 17.15.4 → 17.15.5

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.
@@ -85,9 +85,6 @@ export class SofTableComponent {
85
85
  this.populateFilters();
86
86
  this.handlePageChangeText();
87
87
  }
88
- if (changes.colDefs && !changes.colDefs.firstChange && !!this.gridApi) {
89
- this.populateFilters();
90
- }
91
88
  }
92
89
  /**
93
90
  * Called when the grid has ingested the input data
@@ -432,4 +429,4 @@ class SofTableFilter {
432
429
  /** A filter combining multiple conditions, taken from AgGrid*/
433
430
  class CombinedSimpleModel {
434
431
  }
435
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FybWF0dXJlL2FnLWdyaWQtY29tcG9uZW50cy9zcmMvc29mLXRhYmxlL3NvZi10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcm1hdHVyZS9hZy1ncmlkLWNvbXBvbmVudHMvc3JjL3NvZi10YWJsZS9zb2YtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sTUFBTSxFQUVOLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFckQsT0FBTyxFQUdMLHlCQUF5QixFQUMxQixNQUFNLGtEQUFrRCxDQUFDOzs7Ozs7Ozs7Ozs7O0FBYzFELDRDQUE0QztBQU01QyxNQUFNLE9BQU8saUJBQWlCO0lBTDlCO1FBT0Usc0VBQXNFO1FBQ3RELFlBQU8sR0FBZSxFQUFFLENBQUM7UUFFekMsMkRBQTJEO1FBQzNDLFlBQU8sR0FBa0IsRUFBRSxDQUFDO1FBSzVDLGtCQUFrQjtRQUNGLCtCQUEwQixHQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTlFLG9CQUFvQjtRQUNKLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBRTdDLDBDQUEwQztRQUMxQixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUU3Qyw0Q0FBNEM7UUFDNUIsd0JBQW1CLEdBQVksSUFBSSxDQUFDO1FBRXBEOzs7Ozs7OztVQVFFO1FBQ2MsOEJBQXlCLEdBQVks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QixLQUFLO2dCQUdVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBR1UsbUJBQW1CO3NCQUFsQyxLQUFLO2dCQVdVLHlCQUF5QjtzQkFBeEMsS0FBSztnQkFHVSxTQUFTO3NCQUF4QixLQUFLO2dCQUdXLGdCQUFnQjtzQkFBaEMsS0FBSztnQkFHSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBRzJCLG1CQUFtQjtzQkFBcEQsU0FBUzt1QkFBQyxxQkFBcUI7O0FBOFlsQyxxQ0FBcUM7QUFDckMsTUFBTSxjQUFjO0lBQXBCO1FBS0UsZ0NBQWdDO1FBQ2hDLFlBQU8sR0FBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztDQUFBO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sbUJBQW1CO0NBT3hCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgXHJcbiAgQ29tcG9uZW50LCBcclxuICBFbGVtZW50UmVmLCBcclxuICBFdmVudEVtaXR0ZXIsIFxyXG4gIGluamVjdCwgXHJcbiAgSW5wdXQsIFxyXG4gIE9uQ2hhbmdlcywgXHJcbiAgT25Jbml0LCBcclxuICBPdXRwdXQsIFxyXG4gIHNpZ25hbCwgXHJcbiAgU2ltcGxlQ2hhbmdlcywgXHJcbiAgVmlld0NoaWxkLCBcclxuICBXcml0YWJsZVNpZ25hbCBcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IHRha2UsIHRhcCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5cclxuaW1wb3J0IHsgXHJcbiAgQ29sdW1uRGF0YSwgXHJcbiAgQ29sdW1uT3B0aW9uc0RhdGEsIFxyXG4gIFNvZkNvbHVtbk9wdGlvbnNDb21wb25lbnQgXHJcbn0gZnJvbSAnLi4vY29sdW1uLW9wdGlvbnMtbW9kYWwvY29sdW1uLW9wdGlvbnMuY29tcG9uZW50JztcclxuXHJcbmltcG9ydCB7XHJcbiAgQXBwbHlDb2x1bW5TdGF0ZVBhcmFtcyxcclxuICBDb2xEZWYsXHJcbiAgQ29sdW1uU3RhdGUsXHJcbiAgRmlsdGVyTW9kZWwsXHJcbiAgR3JpZEFwaSxcclxuICBHcmlkUmVhZHlFdmVudCxcclxuICBQYWdpbmF0aW9uQ2hhbmdlZEV2ZW50LFxyXG4gIFRleHRGaWx0ZXJNb2RlbFxyXG59IGZyb20gXCJhZy1ncmlkLWNvbW11bml0eVwiO1xyXG5cclxuXHJcbi8qKiBUaGUgU29mdGhlb24gQXJtYXR1cmUgVGFibGUgY29tcG9uZW50ICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc29mLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc29mLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc29mLXRhYmxlLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU29mVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIC8qKiBUaGUgbGFuZ3VhZ2UgdGV4dCBvciBhIGtleSB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhpcyBjb21wb25lbnQgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgcm93RGF0YTogQXJyYXk8YW55PiA9IFtdO1xyXG5cclxuICAvKiogQ29sdW1uIERlZmluaXRpb25zOiBEZWZpbmVzICYgY29udHJvbHMgZ3JpZCBjb2x1bW5zLiAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjb2xEZWZzOiBBcnJheTxDb2xEZWY+ID0gW107XHJcblxyXG4gIC8qKiBTaXplIG1vZGVzIGZvciB0YWJsZSAqL1xyXG4gIEBJbnB1dCgpIHByaXZhdGUgc2l6ZU1vZGU6ICdDb21wYWN0JyB8ICdSb29teScgfCAnRGVmYXVsdCc7XHJcblxyXG4gIC8qKiBQYWdlcyBzaXplcyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBwYWdpbmF0aW9uUGFnZVNpemVTZWxlY3RvcjogQXJyYXk8bnVtYmVyPiA9IFsxMCwgMjAsIDUwLCAxMDBdO1xyXG5cclxuICAvKiogRW5hYmxlIHNlYXJjaCAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVTZWFyY2g6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKiogRW5hYmxlIGN1c3RvbSB0ZXh0IGZpbHRlciBkcm9wZG93bnMgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlRmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqIEVuYWJsZSBDb2x1bW4gb3B0aW9ucyBtb2RhbCBzZWxlY3Rpb24gKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlQ29sdW1uT3B0aW9uczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKiBcclxuICAgKiBUbyBkaXNwbGF5IHRoZSB0ZXh0IG9uIHRoZSBjb2x1bW4gb3B0aW9ucyBtb2RhbCwgd2hpY2ggc3RhdGVzIC1cclxuICAgKiBgXCJPcHRpb25zIHdpbGwgYmUgc2F2ZWQgZm9yIHRoZSBuZXh0IHRpbWUgeW91IGxvZyBpbi5cImBcclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqIEBkZXNjcmlwdGlvbiBzZXQgdG8gdHJ1ZSBpZiBzZXQtdXAgZm9yIHNhdmluZyBwcmVmZXJlbmNlcyB0byBVc2VyIGRhdGEuXHJcbiAgICogQG5vdGUgWW91IGNhbiBzdGlsbCBzYXZlIHByZWZlcmVuY2VzIHRvIF9sb2NhbF8gb3IgX3Nlc3Npb25fIHN0b3JhZ2VcclxuICAgKiB1c2luZyB0aGUgYHNhdmVkQ29sdW1uU3RhdGVgIGlucHV0LCBhbmQgYHVwZGF0ZWRDb2x1bW5TdGF0ZWAgb3V0cHV0IGV2ZW50LlxyXG4gICAqIEBzZWUgVGhlIERlbW8gc2l0ZSBpcyBzYXZpbmcgdG8gbG9jYWwgc3RvcmFnZS5cclxuICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93U2F2ZUNvbHVtbk9wdGlvbnNUZXh0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBOYW1lL2xhYmVsIG9mIHRoZSB0YWJsZSAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB0YWJsZU5hbWU6IHN0cmluZztcclxuXHJcbiAgLyoqIFVzZXJzIHNhdmVkIGNvbHVtbiBvcHRpb25zIHN0YXRlICovXHJcbiAgQElucHV0KCkgcHJpdmF0ZSBzYXZlZENvbHVtblN0YXRlOiBBcHBseUNvbHVtblN0YXRlUGFyYW1zO1xyXG5cclxuICAvKiogT3V0cHV0IHVwZGF0ZWQgY29sdW1uIG9wdGlvbnMgZXZlbnQgdG8gc2F2ZSB0byB1c2VyIG9yIGJyb3dzZXIgc3RvcmFnZSAqL1xyXG4gIEBPdXRwdXQoKSB1cGRhdGVkQ29sdW1uU3RhdGU6IEV2ZW50RW1pdHRlcjxBcHBseUNvbHVtblN0YXRlUGFyYW1zPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLyoqIHRoZSBzZWFyY2ggaW5wdXQgKi9cclxuICBAVmlld0NoaWxkKCdncmlkU2VhcmNoVGV4dElucHV0JykgZ3JpZFNlYXJjaFRleHRJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuXHJcbiAgLyoqIENvbHVtbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBmaWx0ZXJhYmxlICovXHJcbiAgcHVibGljIGNvbEZpbHRlcnM6IEFycmF5PFNvZlRhYmxlRmlsdGVyPiA9IFtdO1xyXG5cclxuICAvKiogU2hvdyBmaWx0ZXIgKi9cclxuICBwdWJsaWMgc2hvd0ZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogUm93IEhlaWdodCBmb3IgdGFibGUgKi9cclxuICBwdWJsaWMgcm93SGVpZ2h0OiBudW1iZXIgPSA0ODtcclxuXHJcbiAgLyoqIEN1cnJlbnQgUGFnZSBJbmRleCAqL1xyXG4gIHB1YmxpYyBjdXJyZW50UGFnZTogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqIEdyaWQgQVBJICovXHJcbiAgcHJpdmF0ZSBncmlkQXBpITogR3JpZEFwaTtcclxuXHJcbiAgLyoqIElzIHRoZSB0YWJsZSByZWFkeSB0byBiZSBkaXNwbGF5ZWQgKi9cclxuICBwdWJsaWMgaXNHcmlkRGF0YVJlbmRlcmVkOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XHJcblxyXG4gIC8qKiBEZWZhdWx0IFBhZ2UgU2l6ZSAqL1xyXG4gIHB1YmxpYyBwYWdpbmF0aW9uUGFnZVNpemU6IG51bWJlciA9IDIwOyBcclxuXHJcbiAgLyoqIFRvb2wgdGlwIHNob3cgZGVsYXkgKi9cclxuICBwdWJsaWMgdG9vbHRpcFNob3dEZWxheTogbnVtYmVyID0gNTAwO1xyXG5cclxuICAvKiogRGVmYXVsdCBDb2x1bW4gRGVmaW5pdGlvbiAqL1xyXG4gIHB1YmxpYyBkZWZhdWx0Q29sRGVmOiBDb2xEZWYgPSB7XHJcbiAgICByZXNpemFibGU6IGZhbHNlLCAvLyBkaXNhYmxlIHJlc2l6ZSBcclxuICAgIHN1cHByZXNzSGVhZGVyTWVudUJ1dHRvbjogdHJ1ZSwgLy8gZGlzYWJsZSBkZWZhdWx0IGZpbHRlciBtZW51IFxyXG4gICAgc3VwcHJlc3NNb3ZhYmxlOiB0cnVlLCAvLyBkaXNhYmxlIGRlZmF1bHQgZHJhZyAmIGRyb3AgZm9yIGNvbHVtbnMgXHJcbiAgICBjZWxsU3R5bGU6IHsganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIgfVxyXG4gIH07XHJcblxyXG4gIC8qKiBMZW5ndGggb2YgZGF0YSAqL1xyXG4gIHB1YmxpYyB0b3RhbExlbmd0aDogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqVG90YWwgbnVtYmVyIG9mIHBhZ2VzICovXHJcbiAgcHVibGljIHRvdGFsTnVtYmVyT2ZQYWdlczogbnVtYmVyO1xyXG5cclxuICAvKiogUGFnZSBDaGFuZ2UgdGV4dCAqL1xyXG4gIHB1YmxpYyBwYWdlQ2hhbmdlVGV4dDogc3RyaW5nO1xyXG5cclxuICAvKiogUGFnZSBzZWxlY3RvciBhcnJheSAqL1xyXG4gIHB1YmxpYyBwYWdlU2VsZWN0b3I6IEFycmF5PG51bWJlcj4gPSBbXTtcclxuXHJcbiAgLyoqIEZpbHRlciBQYW5lbCBvcGVuIHN0YXRlICovXHJcbiAgcHVibGljIGZpbHRlck9wZW5TdGF0ZTogYm9vbGVhbjtcclxuXHJcbiAgLyoqIFRoZSBsaXN0IG9mIGZpbHRlcnMgYW5kIHRoZSBzZWxlY3RlZCB2YWx1ZXMgKi9cclxuICBwdWJsaWMgZmlsdGVyU2VsZWN0aW9uczogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTtcclxuXHJcbiAgLyoqIG1hdC1kaWFsb2cgKi9cclxuICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XHJcblxyXG4gIC8qKiBPbiBjb21wb25lbnQgaW5pdCAqL1xyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVzaXplR3JpZCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW5ndWxhciBPbiBDaGFuZ2VzXHJcbiAgICogQHBhcmFtIGNoYW5nZXMgVGhlIGlucHV0IGNoYW5nZXNcclxuICAgKi9cclxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXMucm93RGF0YSAmJiAhY2hhbmdlcy5yb3dEYXRhLmZpcnN0Q2hhbmdlICYmICEhdGhpcy5ncmlkQXBpKSB7XHJcbiAgICAgIHRoaXMudG90YWxMZW5ndGggPSB0aGlzLnJvd0RhdGEubGVuZ3RoO1xyXG4gICAgICB0aGlzLnBvcHVsYXRlRmlsdGVycygpO1xyXG4gICAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2VUZXh0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlcy5jb2xEZWZzICYmICFjaGFuZ2VzLmNvbERlZnMuZmlyc3RDaGFuZ2UgJiYgISF0aGlzLmdyaWRBcGkpIHtcclxuICAgICAgdGhpcy5wb3B1bGF0ZUZpbHRlcnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSBncmlkIGhhcyBpbmdlc3RlZCB0aGUgaW5wdXQgZGF0YVxyXG4gICAqIEBwYXJhbSBwYXJhbXMgR3JpZCBSZWFkeSBFdmVudCxcclxuICAgKiBUaGUgZ3JpZCBoYXMgaW5pdGlhbGl6ZWQgYW5kIGlzIHJlYWR5IGZvciBtb3N0IGFwaSBjYWxscywgYnV0IG1heSBub3QgYmUgZnVsbHkgcmVuZGVyZWQgeWV0LlxyXG4gICAqIEBub3RlIHlvdSBjYW4gbm90IGFjY2VzcyB0aGlzLmdyaWRBcGkgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgcnVuLCBcclxuICAgKiBhbnkgYXR0ZW1wdHMgdG8gYWNjZXNzIHRoaXMuZ3JpZEFwaSBpbiB0aGlzIGNvbXBvbmVudHMgbmdPbkluaXQgb3IgdGhlIGZpcnN0IG5nT25DaGFuZ2VzIGN5Y2xlXHJcbiAgICogd2lsbCByZXN1bHQgaW4gYSB0eXBlIGVycm9yOyBiZWluZyB0aGlzLmdyaWRBcGkgaXMgdW5kZWZpbmVkIGF0IHRoYXQgdGltZS5cclxuICAgKi9cclxuICBwdWJsaWMgb25HcmlkUmVhZHkocGFyYW1zOiBHcmlkUmVhZHlFdmVudCkge1xyXG4gICAgdGhpcy5ncmlkQXBpID0gcGFyYW1zLmFwaTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdldEN1cnJlbnRQYWdlKCkgKyAxO1xyXG4gICAgdGhpcy50b3RhbExlbmd0aCA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Um93Q291bnQoKTtcclxuICAgIHdpbmRvdy5vbnJlc2l6ZSA9ICgpID0+IHtcclxuICAgICAgY29uc3QgbW9iaWxlV2lkdGhUaHJlc2hvbGQgPSA3NTI7XHJcbiAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8PSBtb2JpbGVXaWR0aFRocmVzaG9sZCkge1xyXG4gICAgICAgIHRoaXMucm93SGVpZ2h0ID0gNDA7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUgPSAxMDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnJlc2l6ZUdyaWQoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2VUZXh0KCk7XHJcbiAgICB9XHJcbiAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBjb2x1bW4gZGVmaW5pdGlvbnMsIHBvcHVsYXRlIHRoZSBmaWx0ZXJzXHJcbiAgICB0aGlzLnBvcHVsYXRlRmlsdGVycygpO1xyXG4gICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlVGV4dCgpO1xyXG4gICAgaWYgKCF0aGlzLnJvd0RhdGEubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuaXNHcmlkRGF0YVJlbmRlcmVkLnNldCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBGaXJlZCB0aGUgZmlyc3QgdGltZSBkYXRhIGlzIHJlbmRlcmVkIGludG8gdGhlIGdyaWQuICovXHJcbiAgcHVibGljIG9uRmlyc3REYXRhUmVuZGVyZWQoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2F2ZWRDb2x1bW5TdGF0ZT8uc3RhdGUubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtblN0YXRlOiBBcnJheTxDb2x1bW5TdGF0ZT4gPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5ncmlkQXBpLmdldENvbHVtblN0YXRlKCkpO1xyXG4gICAgICB0aGlzLnNhdmVkQ29sdW1uU3RhdGUgPSB7XHJcbiAgICAgICAgc3RhdGU6IGNvbHVtblN0YXRlLFxyXG4gICAgICAgIGFwcGx5T3JkZXI6IHRydWVcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZEFwaS5hcHBseUNvbHVtblN0YXRlKHRoaXMuc2F2ZWRDb2x1bW5TdGF0ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZWRDb2x1bW5TdGF0ZS5lbWl0KHRoaXMuc2F2ZWRDb2x1bW5TdGF0ZSk7XHJcbiAgICB0aGlzLmlzR3JpZERhdGFSZW5kZXJlZC5zZXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVzaXplIGdyaWQgZnJvbSBzaXplIG1vZGUgKi9cclxuICBwcml2YXRlIHJlc2l6ZUdyaWQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zaXplTW9kZSA9PT0gJ0NvbXBhY3QnKSB7XHJcbiAgICAgIHRoaXMucm93SGVpZ2h0ID0gNDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNpemVNb2RlID09PSAnUm9vbXknKSB7XHJcbiAgICAgIHRoaXMucm93SGVpZ2h0ID0gNTY7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5yb3dIZWlnaHQgPSA0ODtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIHBhZ2Ugc2VsZWN0aW9uIGNoYW5nZVxyXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgc2VsZWN0ZWQgcGFnZSBudW1iZXJcclxuICAgKi9cclxuICBwdWJsaWMgb25QYWdlTnVtYmVyQ2hhbmdlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIC8vIFRoZSBwYWdlIHZhbHVlcyBhcmUgMSBvZmYgdG8gbWFrZSBhIDEtYmFzZWQgYXJyYXksIGJ1dCB0aGUgYWN0dWFsIHBhZ2VzIGFyZSBhIDAtYmFzZWQgYXJyYXkuXHJcbiAgICB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdvVG9QYWdlKHZhbHVlIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKiogT24gbmV4dCBwYWdlIGV2ZW50ICovXHJcbiAgcHVibGljIG5leHRQYWdlKCkge1xyXG4gICAgdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25Hb1RvTmV4dFBhZ2UoKTtcclxuICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZVRleHQoKVxyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSArIDE7XHJcbiAgfVxyXG5cclxuICAvKiogT24gUHJldmlvdXMgUGFnZSBFdmVudCAqL1xyXG4gIHB1YmxpYyBwcmV2aW91c1BhZ2UoKSB7XHJcbiAgICB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdvVG9QcmV2aW91c1BhZ2UoKTtcclxuICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZVRleHQoKVxyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSArIDE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPbiBDaGFuZ2UgUGFnZSBTaXplIEV2ZW50XHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBwYWdpbmF0aW9uIGV2ZW50XHJcbiAgICovXHJcbiAgcHVibGljIGNoYW5nZVBhZ2VTaXplKGV2ZW50OiBQYWdpbmF0aW9uQ2hhbmdlZEV2ZW50KSB7XHJcbiAgICAvLyBPbmx5IG5lZWQgdG8gZG8gdGhpcyB3b3JrIGlmIHRoZSBwYWdlIHNpemUgaGFzIGNoYW5nZWQuXHJcbiAgICBpZiAoZXZlbnQubmV3UGFnZVNpemUpIHtcclxuICAgICAgLy8gVXBkYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgZmlsdGVyZWQgcm93cy5cclxuICAgICAgdGhpcy50b3RhbExlbmd0aCA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Um93Q291bnQoKTtcclxuICAgICAgLy8gSGFuZGxlIHRleHQgY2hhbmdlc1xyXG4gICAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2VUZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQ2FsbGVkIHdoZW4gdGhlIGdyaWQgZmlsdGVyIGlzIGNoYW5nZWQgKi9cclxuICBwdWJsaWMgb25GaWx0ZXJDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgLy8gVE9ETyB1cGRhdGUgdGhlIGZpbHRlciBkcm9wZG93biBvcHRpb25zIGJhc2VkIG9uIHRoZSBmaWx0ZXJlZCBkYXRhIHNldCwgaW5zdGVhZCBvZiB0aGUgY29tcGxldGUgZGF0YSBzZXQuXHJcbiAgICAvLyBVcGRhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBmaWx0ZXJlZCByb3dzLlxyXG4gICAgdGhpcy50b3RhbExlbmd0aCA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Um93Q291bnQoKTtcclxuICAgIC8vIEhhbmRsZSB0ZXh0IGNoYW5nZXNcclxuICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZVRleHQoKTtcclxuICB9XHJcblxyXG4gIC8qKiBHZW5lcmF0ZWQgdGV4dCBmb3Igc2hvd2luZyBwYWdlcyBpbiBmb3JtYXQ6IDEtMTEgb2YgMTEgKi9cclxuICBwcml2YXRlIGhhbmRsZVBhZ2VDaGFuZ2VUZXh0KCk6IHZvaWQge1xyXG4gICAgLy8gSGFuZGxlIGVtcHR5IHRhYmxlXHJcbiAgICBpZiAoIXRoaXMudG90YWxMZW5ndGggfHwgdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUgPT09IDApIHtcclxuICAgICAgLy8gUmVzZXQgdGhlIHBhZ2luYXRpb24gVUlcclxuICAgICAgdGhpcy50b3RhbE51bWJlck9mUGFnZXMgPSAxO1xyXG4gICAgICB0aGlzLnBhZ2VTZWxlY3RvciA9IFsxXTtcclxuICAgICAgdGhpcy5wYWdlQ2hhbmdlVGV4dCA9IGAwYDtcclxuICAgICAgdGhpcy5ncmlkQXBpLnNob3dOb1Jvd3NPdmVybGF5KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZ3JpZEFwaS5oaWRlT3ZlcmxheSgpO1xyXG4gICAgfVxyXG4gICAgLy8gVXBkYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcclxuICAgIHRoaXMudG90YWxOdW1iZXJPZlBhZ2VzID0gdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25HZXRUb3RhbFBhZ2VzKCkgfHwgTWF0aC5jZWlsKHRoaXMudG90YWxMZW5ndGggLyB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSkgfHwgMTtcclxuICAgIC8vIFJlc2V0IHRoZSBwYWdlIHNlbGVjdG9yXHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgIGNvbnN0IHBhZ2VTZWxlY3RvciA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdGhpcy50b3RhbE51bWJlck9mUGFnZXM7IGkrKykge1xyXG4gICAgICBwYWdlU2VsZWN0b3IucHVzaChpKTtcclxuICAgIH1cclxuICAgIHRoaXMucGFnZVNlbGVjdG9yID0gcGFnZVNlbGVjdG9yO1xyXG4gICAgY29uc3QgbGVuZ3RoID0gTWF0aC5tYXgodGhpcy50b3RhbExlbmd0aCwgMCk7XHJcbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMucGFnaW5hdGlvblBhZ2VTaXplO1xyXG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKSAqIHBhZ2VTaXplO1xyXG4gICAgY29uc3QgZW5kSW5kZXggPSBzdGFydEluZGV4IDwgbGVuZ3RoID8gTWF0aC5taW4oc3RhcnRJbmRleCArIHBhZ2VTaXplLCBsZW5ndGgpIDogc3RhcnRJbmRleCArIHBhZ2VTaXplO1xyXG4gICAgdGhpcy5wYWdlQ2hhbmdlVGV4dCA9IGAke3N0YXJ0SW5kZXggKyAxfSAtICR7ZW5kSW5kZXh9YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IHRoZSBzZWFyY2ggZmlsdGVyIG9uIGRhdGEgd2hlbiBzZWFyY2ggdGV4dCBjaGFuZ2VkXHJcbiAgICovXHJcbiAgcHVibGljIG9uU2VhcmNoVGV4dENoYW5nZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWRBcGkuc2V0R3JpZE9wdGlvbihcInF1aWNrRmlsdGVyVGV4dFwiLCB0aGlzLmdyaWRTZWFyY2hUZXh0SW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogVG9nZ2xlIHRoZSBmaWx0ZXIgcGFuZWwgZGlzcGxheSAqL1xyXG4gIHB1YmxpYyB0b2dnbGVGaWx0ZXJQYW5lbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsdGVyT3BlblN0YXRlID0gIXRoaXMuZmlsdGVyT3BlblN0YXRlO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFwcGx5IHRoZSBzZWxlY3RlZCBmaWx0ZXJzICovXHJcbiAgcHVibGljIGFwcGx5RmlsdGVycygpOiB2b2lkIHtcclxuICAgIGxldCB0YWJsZUZpbHRlck1vZGVsOiBGaWx0ZXJNb2RlbCA9IHt9O1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbEZpbHRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY29sRmlsdGVyID0gdGhpcy5jb2xGaWx0ZXJzW2ldO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gdGhpcy5maWx0ZXJTZWxlY3Rpb25zW2ldO1xyXG4gICAgICBpZiAoIXNlbGVjdGVkRWxlbWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gUmVzZXQgb3V0IHRoZSBjb2x1bW4gZmlsdGVyc1xyXG4gICAgICAgIHRoaXMuZ3JpZEFwaS5zZXRDb2x1bW5GaWx0ZXJNb2RlbChjb2xGaWx0ZXIuaGVhZGVyLCBudWxsKTtcclxuICAgICAgICB0YWJsZUZpbHRlck1vZGVsW2NvbEZpbHRlci5oZWFkZXJdID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgLy8gU2V0IHRoZSBzaW5nbGUgZmlsdGVyIGZvciB0aGUgY29sdW1uXHJcbiAgICAgICAgbGV0IGZpbHRlck1vZGVsOiBUZXh0RmlsdGVyTW9kZWwgPSB7IGZpbHRlclR5cGU6ICd0ZXh0JywgdHlwZTogJ2VxdWFscycsIGZpbHRlcjogc2VsZWN0ZWRFbGVtZW50c1swXSB9O1xyXG4gICAgICAgIC8vIEFwcGx5IHRoZSBmaWx0ZXIgbW9kZWwgdG8gdGhlIGNvbHVtblxyXG4gICAgICAgIHRhYmxlRmlsdGVyTW9kZWxbY29sRmlsdGVyLmhlYWRlcl0gPSBmaWx0ZXJNb2RlbDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBTZXQgbXVsdGlwbGUgT1IgZmlsdGVycyBmb3IgdGhlIGNvbHVtblxyXG4gICAgICAgIGxldCBmaWx0ZXJNb2RlbHM6IENvbWJpbmVkU2ltcGxlTW9kZWw8VGV4dEZpbHRlck1vZGVsPiA9IHsgZmlsdGVyVHlwZTogJ3RleHQnLCBvcGVyYXRvcjogJ09SJywgY29uZGl0aW9uczogW10gfTtcclxuICAgICAgICAvLyBTZXQgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIGluIHRoZSBtb2RlbFxyXG4gICAgICAgIGZvciAoY29uc3Qgc2VsZWN0ZWRFbGVtZW50IG9mIHNlbGVjdGVkRWxlbWVudHMpIHtcclxuICAgICAgICAgIGZpbHRlck1vZGVscy5jb25kaXRpb25zLnB1c2goeyBmaWx0ZXJUeXBlOiAndGV4dCcsIHR5cGU6ICdlcXVhbHMnLCBmaWx0ZXI6IHNlbGVjdGVkRWxlbWVudCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQXBwbHkgdGhlIGZpbHRlciBtb2RlbCBjb2xsZWN0aW9uIHRvIHRoZSBjb2x1bW5cclxuICAgICAgICB0YWJsZUZpbHRlck1vZGVsW2NvbEZpbHRlci5oZWFkZXJdID0gZmlsdGVyTW9kZWxzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBPbmNlIGV2ZXJ5dGhpbmcgaXMgc2V0LCB1cGRhdGUgdGhlIGZpbHRlcnNcclxuICAgIHRoaXMuZ3JpZEFwaS5zZXRGaWx0ZXJNb2RlbCh0YWJsZUZpbHRlck1vZGVsKTtcclxuICAgIHRoaXMuZ3JpZEFwaS5vbkZpbHRlckNoYW5nZWQoKTtcclxuICB9XHJcblxyXG4gIC8qKiBDbGVhciBhbGwgZmlsdGVycyAqL1xyXG4gIHB1YmxpYyBjbGVhckZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICAvLyBDbGVhciBhbGwgc2VsZWN0aW9uc1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbHRlclNlbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5maWx0ZXJTZWxlY3Rpb25zW2ldID0gW107XHJcbiAgICB9XHJcbiAgICAvLyBTZXQgdGhlIGZ1bGwgZ3JpZCBmaWx0ZXIgbW9kZWwgdG8gbnVsbFxyXG4gICAgdGhpcy5ncmlkQXBpLnNldEZpbHRlck1vZGVsKG51bGwpO1xyXG4gICAgLy8gVXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgICB0aGlzLmdyaWRBcGkub25GaWx0ZXJDaGFuZ2VkKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgaWYgbm8gZmlsdGVycyBhcmUgc2VsZWN0ZWRcclxuICAgKiBAcmV0dXJucyBUcnVlIGlmIGEgZmlsdGVyIGlzIHNlbGVjdGVkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGhhc0VtcHR5RmlsdGVycygpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5maWx0ZXJTZWxlY3Rpb25zIHx8ICF0aGlzLmZpbHRlclNlbGVjdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBmaWx0ZXJTZWxlY3Qgb2YgdGhpcy5maWx0ZXJTZWxlY3Rpb25zKSB7XHJcbiAgICAgIC8vIElmIGF0IGxlYXN0IG9uZSBmaWx0ZXIgaGFzIGJlZW4gc2VsZWN0ZWQsIHJldHVybiBmYWxzZVxyXG4gICAgICBpZiAoZmlsdGVyU2VsZWN0Lmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKiogQ2FuY2VsIHRoZSBjaGFuZ2VzIHRvIHRoZSBmaWx0ZXIgYW5kIGNsb3NlcyB0aGUgZmlsdGVyIHBhbmVsICovXHJcbiAgcHVibGljIGNhbmNlbEZpbHRlckNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sRmlsdGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAvLyBHZXQgdGhlIHN0b3JlZCBmaWx0ZXJzIGZvciB0aGUgZ2l2ZW4gbW9kZWxcclxuICAgICAgY29uc3QgY29sRmlsdGVyID0gdGhpcy5jb2xGaWx0ZXJzW2ldO1xyXG4gICAgICBjb25zdCBtb2RlbCA9IHRoaXMuZ3JpZEFwaS5nZXRDb2x1bW5GaWx0ZXJNb2RlbChjb2xGaWx0ZXIuaGVhZGVyKTtcclxuICAgICAgbGV0IGZpbHRlclNlbGVjdGlvbkRhdGEgPSBbXTtcclxuICAgICAgaWYgKG1vZGVsICYmIG1vZGVsW1wiY29uZGl0aW9uc1wiXSkge1xyXG4gICAgICAgIC8vIFRoZSBtb2RlbCBpcyBhIGNvbWJpbmVkIG1vZGVsIHdpdGggbXVsdGlwbGUgc2VsZWN0aW9uc1xyXG4gICAgICAgIGNvbnN0IGZpbHRlck1vZGVsID0gbW9kZWwgYXMgQ29tYmluZWRTaW1wbGVNb2RlbDxUZXh0RmlsdGVyTW9kZWw+O1xyXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBmaWx0ZXJNb2RlbC5jb25kaXRpb25zKSB7XHJcbiAgICAgICAgICBmaWx0ZXJTZWxlY3Rpb25EYXRhLnB1c2goZWxlbWVudC5maWx0ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChtb2RlbCkge1xyXG4gICAgICAgIC8vIEFzc3VtZSB0aGUgbW9kZWwgaXMgYSBzaW5nbGUgVGV4dCBGaWx0ZXIgTW9kZWxcclxuICAgICAgICBsZXQgZmlsdGVyU2VsZWN0aW9uOiBUZXh0RmlsdGVyTW9kZWwgPSBtb2RlbDtcclxuICAgICAgICBmaWx0ZXJTZWxlY3Rpb25EYXRhLnB1c2goZmlsdGVyU2VsZWN0aW9uLmZpbHRlcik7XHJcbiAgICAgIH1cclxuICAgICAgLy8gU2V0IHRoZSBmaWx0ZXIgc2VsZWN0aW9uc1xyXG4gICAgICB0aGlzLmZpbHRlclNlbGVjdGlvbnNbaV0gPSBmaWx0ZXJTZWxlY3Rpb25EYXRhO1xyXG4gICAgfVxyXG4gICAgLy8gQ2xvc2UgdGhlIGZpbHRlciBwYW5lbFxyXG4gICAgdGhpcy50b2dnbGVGaWx0ZXJQYW5lbCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBvcHVsYXRlcyB0aGUgZmlsdGVyIGRyb3Bkb3ducyAqL1xyXG4gIHByaXZhdGUgcG9wdWxhdGVGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgLy8gUmVzZXQgdGhlIGZpbHRlciBkcm9wZG93bnNcclxuICAgIHRoaXMuZmlsdGVyU2VsZWN0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5jb2xGaWx0ZXJzID0gW107XHJcbiAgICAvLyBHZXQgdGhlIGNvbHVtbiBkZWZpbml0aW9uc1xyXG4gICAgbGV0IGNvbERlZnMgPSB0aGlzLmdyaWRBcGkuZ2V0Q29sdW1uRGVmcygpO1xyXG4gICAgZm9yIChjb25zdCBkZWYgb2YgY29sRGVmcykge1xyXG4gICAgICAvLyBEZXRlcm1pbmUgaWYgYSBmaWx0ZXIgZXhpc3RzIGZvciB0aGlzIGNvbHVtblxyXG4gICAgICBpZiAoZGVmW1wiZmlsdGVyXCJdKSB7XHJcbiAgICAgICAgLy8gRW5zdXJlIHRoZXJlIGFyZSBlbm91Z2ggZmlsdGVyIHNlbGVjdGlvbiBhcnJheXNcclxuICAgICAgICB0aGlzLmZpbHRlclNlbGVjdGlvbnMucHVzaChbXSk7XHJcbiAgICAgICAgLy8gSWYgYXQgbGVhc3Qgb25lIGZpbHRlciBpcyBwcmVzZW50IGFuZCB3ZSBhcmUgbm90IHVzaW5nIG5hdGl2ZSBmaWx0ZXIsIHNob3cgdGhlIGN1c3RvbSBmaWx0ZXIgYnV0dG9uLlxyXG4gICAgICAgIHRoaXMuc2hvd0ZpbHRlciA9IHRoaXMuZW5hYmxlRmlsdGVyO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlck5hbWUgPSBkZWZbXCJmaWVsZFwiXTtcclxuICAgICAgICBjb25zdCBsYWJlbCA9IGRlZltcImhlYWRlck5hbWVcIl07XHJcbiAgICAgICAgLy8gU2V0IGZpbHRlciBvcHRpb25zLCBpZiBwcmVzZW50XHJcbiAgICAgICAgbGV0IHVuaXF1ZUZpbHRlclZhbHVlcyA9IFtdO1xyXG4gICAgICAgIC8vIEdldCBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gVGhpcyBhbGxvd3MgbW9yZSBkaXJlY3QgZGF0YSBwb3B1bGF0aW9uIGZvciB0aGUgZmlsdGVycy5cclxuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnJvd0RhdGEpIHtcclxuICAgICAgICAgIC8vIEdldCB0aGUgdmFsdWUgYXMgYSBzdHJpbmdcclxuICAgICAgICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gcm93W2hlYWRlck5hbWVdO1xyXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdmFsdWUgZXhpc3RzLCBhbmQgaWYgaXQgaXMgbm90IGFscmVhZHkgbm90ZWQgaW4gdGhlIGFycmF5XHJcbiAgICAgICAgICBpZiAoc3RyaW5nVmFsdWUgJiYgIXVuaXF1ZUZpbHRlclZhbHVlcy5pbmNsdWRlcyhzdHJpbmdWYWx1ZSkpIHtcclxuICAgICAgICAgICAgLy8gQWRkIHRoZSBub2RlIHZhbHVlXHJcbiAgICAgICAgICAgIHVuaXF1ZUZpbHRlclZhbHVlcy5wdXNoKHN0cmluZ1ZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdW5pcXVlRmlsdGVyVmFsdWVzID0gdW5pcXVlRmlsdGVyVmFsdWVzLnNvcnQoKTtcclxuICAgICAgICAvLyBBZGQgdG8gdGhlIGNvbHVtbiBmaWx0ZXJzIGRyb3Bkb3duc1xyXG4gICAgICAgIHRoaXMuY29sRmlsdGVycy5wdXNoKHsgaGVhZGVyOiBoZWFkZXJOYW1lLCBsYWJlbDogbGFiZWwsIG9wdGlvbnM6IHVuaXF1ZUZpbHRlclZhbHVlcyB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIE9wZW4gdGhlIGNvbHVtbiBvcHRpb25zIG1vZGFsICovXHJcbiAgcHVibGljIG9wZW5Db2x1bW5PcHRpb25zKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29sdW1uU3RhdGU6IEFycmF5PENvbHVtblN0YXRlPiA9IHRoaXMuZ3JpZEFwaS5nZXRDb2x1bW5TdGF0ZSgpO1xyXG4gICAgY29uc3QgY29sdW1uRGF0YTogQXJyYXk8Q29sdW1uRGF0YT4gPSB0aGlzLmNvbHVtblN0YXRlVG9EYXRhKGNvbHVtblN0YXRlKTtcclxuICAgIGNvbnN0IGluaXRpYWxDb2x1bW5EYXRhOiBBcnJheTxDb2x1bW5EYXRhPiA9IHRoaXMuY29sdW1uU3RhdGVUb0RhdGEodGhpcy5zYXZlZENvbHVtblN0YXRlLnN0YXRlKTtcclxuICAgIGNvbnN0IGNvbHVtbk9wdGlvbnNEYXRhOiBDb2x1bW5PcHRpb25zRGF0YSA9IHtcclxuICAgICAgdGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcclxuICAgICAgY29sdW1uRGF0YSxcclxuICAgICAgaW5pdGlhbENvbHVtbkRhdGEsXHJcbiAgICAgIHNob3dTYXZlQ29sdW1uT3B0aW9uc1RleHQ6IHRoaXMuc2hvd1NhdmVDb2x1bW5PcHRpb25zVGV4dFxyXG4gICAgfTtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oU29mQ29sdW1uT3B0aW9uc0NvbXBvbmVudCwge1xyXG4gICAgICB3aWR0aDogJzUwMHB4JyxcclxuICAgICAgcG9zaXRpb246IHsgYm90dG9tOiAnNDBweCcsIHJpZ2h0OiAnNDBweCcgfSxcclxuICAgICAgYXJpYUxhYmVsbGVkQnk6ICdjb2x1bW4tb3B0aW9ucy1oZWFkaW5nJyxcclxuICAgICAgZGF0YTogY29sdW1uT3B0aW9uc0RhdGFcclxuICAgIH0pO1xyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkucGlwZShcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgdGFwKCh1cGRhdGVkQ29sdW1uU3RhdGU6IEFwcGx5Q29sdW1uU3RhdGVQYXJhbXMpID0+IHtcclxuICAgICAgICBpZiAodXBkYXRlZENvbHVtblN0YXRlICYmIHVwZGF0ZWRDb2x1bW5TdGF0ZS5zdGF0ZS5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZEFwaS5hcHBseUNvbHVtblN0YXRlKHVwZGF0ZWRDb2x1bW5TdGF0ZSk7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZWRDb2x1bW5TdGF0ZS5lbWl0KHVwZGF0ZWRDb2x1bW5TdGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hcHMgYEFycmF5PENvbHVtblN0YXRlPmAgdG8gYEFycmF5PENvbHVtbkRhdGE+YCBcclxuICAgKiBAbm90ZSBmaWx0ZXJzIG91dCBhbnkgY29sdW1ucyBtYXJrZWQgYXMgJ3Bpbm5lZCcgYnkgdGhlIGNvbHVtbiBkZWZpbml0aW9ucy5cclxuICAgKiBAbm90ZSBmaWx0ZXJzIGFueSBjb2x1bW5zIHdpdGhvdXQgYSAnaGVhZGVyTmFtZScuXHJcbiAgICogQHBhcmFtIGNvbHVtblN0YXRlIHRoZSBjb2x1bW4gc3RhdGUgdG8gbW9kaWZ5XHJcbiAgICogQHJldHVybnMgYW4gYXJyYXkgb2YgY29sdW1uIGRhdGEgZm9ybWF0dGVkIHRvIGJlIGluZ2VzdGVkIGJ5IHRoZSBgU29mQ29sdW1uT3B0aW9uc0NvbXBvbmVudGBcclxuICAqL1xyXG4gIHByaXZhdGUgY29sdW1uU3RhdGVUb0RhdGEoY29sdW1uU3RhdGU6IEFycmF5PENvbHVtblN0YXRlPik6IEFycmF5PENvbHVtbkRhdGE+IHtcclxuICAgIHJldHVybiBjb2x1bW5TdGF0ZVxyXG4gICAgICAuZmlsdGVyKChjb2x1bW4pID0+IHtcclxuICAgICAgICBjb25zdCBoZWFkZXJOYW1lOiBzdHJpbmcgPSB0aGlzLmdyaWRBcGkuZ2V0Q29sdW1uRGVmKGNvbHVtbi5jb2xJZCk/LmhlYWRlck5hbWUgfHwgXCJcIjtcclxuICAgICAgICBpZiAoaGVhZGVyTmFtZSAmJiBoZWFkZXJOYW1lLmxlbmd0aCAmJiAhY29sdW1uLnBpbm5lZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlck5hbWU6IHN0cmluZyA9IHRoaXMuZ3JpZEFwaS5nZXRDb2x1bW5EZWYoY29sdW1uLmNvbElkKS5oZWFkZXJOYW1lO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBpZDogY29sdW1uLmNvbElkLFxyXG4gICAgICAgICAgaXNDaGVja2VkOiAhY29sdW1uLmhpZGUsXHJcbiAgICAgICAgICB0ZXh0OiBoZWFkZXJOYW1lXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKiBVc2VkIGZvciBzZXR0aW5nIGZpbHRlciB2YWx1ZXMgKi9cclxuY2xhc3MgU29mVGFibGVGaWx0ZXIge1xyXG4gIC8qKiBUaGUgY29sdW1uIGhlYWRlciAqL1xyXG4gIGhlYWRlcjogc3RyaW5nO1xyXG4gIC8qKiBUaGUgY29sdW1uIGxhYmVsIG9yIHRyYW5zbGF0aW9uIGtleSAqL1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBjb2x1bW4gZmlsdGVyIG9wdGlvbnMgKi9cclxuICBvcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG59XHJcblxyXG4vKiogQSBmaWx0ZXIgY29tYmluaW5nIG11bHRpcGxlIGNvbmRpdGlvbnMsIHRha2VuIGZyb20gQWdHcmlkKi9cclxuY2xhc3MgQ29tYmluZWRTaW1wbGVNb2RlbDxUPiB7XHJcbiAgLyoqIFRoZSBmaWx0ZXIgdHlwZS4gVXN1YWxseSAndGV4dCcgKi9cclxuICBmaWx0ZXJUeXBlOiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBvcGVyYXRvci4gVXN1YWxseSAnT1InICovXHJcbiAgb3BlcmF0b3I6ICdBTkQnIHwgJ09SJztcclxuICAvKiogbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBGaWx0ZXIgTW9kZWwgKi9cclxuICBjb25kaXRpb25zOiBUW107XHJcbn1cclxuIiwiPGRpdiBcclxuICBbZnhTaG93XT1cImlzR3JpZERhdGFSZW5kZXJlZCgpXCJcclxuICBmeExheW91dEdhcD1cIjE2cHhcIiBtLWItMjQ+XHJcbiAgQGlmIChlbmFibGVGaWx0ZXIgJiYgc2hvd0ZpbHRlcikge1xyXG4gICAgPGJ1dHRvbiBcclxuICAgICAgKGNsaWNrKT1cInRvZ2dsZUZpbHRlclBhbmVsKClcIiBcclxuICAgICAgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi12MlwiXHJcbiAgICAgIFtjbGFzcy5maWx0ZXItc2VsZWN0ZWRdPVwiZmlsdGVyT3BlblN0YXRlXCIgXHJcbiAgICAgIGlkPVwiYnRuLWVuYWJsZS1maWx0ZXJcIiBjb2xvcj1cInNlY29uZGFyeVwiIHNpemU9XCJzbWFsbFwiPlxyXG4gICAgICA8aSBjbGFzcz1cInBoIHBoLWJvbGQgcGgtc2xpZGVycy1ob3Jpem9udGFsXCI+PC9pPlxyXG4gICAgICB7eydhcm1hdHVyZS5zb2YtdGFibGUuZmlsdGVyJyB8IHRyYW5zbGF0ZX19XHJcbiAgICA8L2J1dHRvbj5cclxuICB9XHJcbiAgQGlmIChlbmFibGVTZWFyY2gpIHtcclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInNvZi1mb3JtLWZpZWxkIHRhYmxlLXNlYXJjaC1maWVsZCBkZW5zZS00XCIgZnhGbGV4PVwiYXV0b1wiPlxyXG4gICAgICA8c3BhbiBtYXRQcmVmaXg+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJwaC1ib2xkIHBoLW1hZ25pZnlpbmctZ2xhc3Mgc2VhcmNoLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cInNlYXJjaC1sYWJlbFwiPnt7J2FybWF0dXJlLnNvZi10YWJsZS5zZWFyY2gnIHwgdHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IFxyXG4gICAgICAgIChpbnB1dCk9XCJvblNlYXJjaFRleHRDaGFuZ2VkKClcIiAjZ3JpZFNlYXJjaFRleHRJbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZ3JpZFNlYXJjaFRleHRJbnB1dFwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInYXJtYXR1cmUuc29mLXRhYmxlLnNlYXJjaCcgfCB0cmFuc2xhdGVcIi8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIH1cclxuICBAaWYgKGVuYWJsZUNvbHVtbk9wdGlvbnMpIHtcclxuICAgIDxidXR0b24gXHJcbiAgICAgIChjbGljayk9XCJvcGVuQ29sdW1uT3B0aW9ucygpXCJcclxuICAgICAgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mdC1idXR0b24taWNvbi12MlwiIFxyXG4gICAgICBjb2xvcj1cInNlY29uZGFyeVwiIHNpemU9XCJzbWFsbFwiPlxyXG4gICAgICA8aSBjbGFzcz1cInBoLWJvbGQgcGgtcGF1c2VcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICA8L2J1dHRvbj5cclxuICB9XHJcbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3NvZi10YWJsZS1yaWdodC1idXR0b25zXVwiPjwvbmctY29udGVudD5cclxuICA8IS0tIFxyXG4gIE9ubHkgaW5qZWN0IDxidXR0b24+J3MgaW5zaWRlIGFuIDxuZy1jb250YWluZXIgc29mLXRhYmxlLXJpZ2h0LWJ1dHRvbnM+LlxyXG4gIGV4OiBmb3IgYnJva2VyIHRoaXMgd291bGQgYmUgdGhlICdleHBvcnQgdGFibGUnIGJ1dHRvbixcclxuICAuLi4gXHJcbiAgPG5nLWNvbnRhaW5lciBzb2YtdGFibGUtcmlnaHQtYnV0dG9ucz5cclxuICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mdC1idXR0b24taWNvbi12MlwiIGNvbG9yPVwic2Vjb25kYXJ5XCIgc2l6ZT1cInNtYWxsXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwicGgtYm9sZCBwaC1leHBvcnRcIj48L2k+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuICAuLi4gXHJcbiAgbm90ZTogbWFrZSBzdXJlIGJ1dHRvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgdG8gbWF0Y2ggb3RoZXJzID1cclxuICBgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mdC1idXR0b24taWNvbi12MlwiIGNvbG9yPVwic2Vjb25kYXJ5XCIgc2l6ZT1cInNtYWxsXCJgXHJcbiAgLS0+XHJcbjwvZGl2PlxyXG5cclxuQGlmIChmaWx0ZXJPcGVuU3RhdGUpIHtcclxuICA8ZmllbGRzZXQgY2xhc3M9XCJmaWx0ZXItcGFuZWxcIj5cclxuICAgIDxwPlxyXG4gICAgICA8aSBjbGFzcz1cInBoIHBoLWJvbGQgcGgtc2xpZGVycy1ob3Jpem9udGFsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cIm0tbC04XCI+e3snYXJtYXR1cmUuc29mLXRhYmxlLmZpbHRlcicgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgIDwvcD5cclxuICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItcGFuZWwtc2VsZWN0LWNvbnRhaW5lciBtLXQtMjBcIj5cclxuICAgICAgQGZvciAoY29sRmlsdGVyIG9mIGNvbEZpbHRlcnM7IGxldCBpID0gJGluZGV4OyB0cmFjayBpKSB7XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJzb2YtZm9ybS1maWVsZFwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD57e2NvbEZpbHRlci5sYWJlbCB8IHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8bWF0LXNlbGVjdCBcclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJTZWxlY3Rpb25zW2ldXCIgXHJcbiAgICAgICAgICAgIG11bHRpcGxlIFxyXG4gICAgICAgICAgICBpZD1cImZpbHRlckRyb3Bkb3due3tpfX1cIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7J2FybWF0dXJlLnNvZi10YWJsZS5hbGwnIHwgdHJhbnNsYXRlfX1cIiBkaXNhYmxlUmlwcGxlPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICBAZm9yIChjb2xPcHRpb24gb2YgY29sRmlsdGVyLm9wdGlvbnM7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJjb2xPcHRpb25cIj5cclxuICAgICAgICAgICAgICAgIHt7Y29sT3B0aW9ufX1cclxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIj5cclxuICAgICAgPGRpdiBmeEZsZXg9XCI1MCVcIj5cclxuICAgICAgICA8YnV0dG9uIFxyXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmlsdGVycygpXCIgW2Rpc2FibGVkXT1cImhhc0VtcHR5RmlsdGVycygpXCIgXHJcbiAgICAgICAgICBtYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi12MlwiIHNpemU9XCJtZWRpdW1cIlxyXG4gICAgICAgICAgaWQ9XCJ0YWJsZUZpbHRlckNsZWFyXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiPlxyXG4gICAgICAgICAge3snYXJtYXR1cmUuc29mLXRhYmxlLnJlc2V0JyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIjUwJVwiPlxyXG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEdhcD1cIjIlXCIgZnhMYXlvdXRBbGlnbj1cImZsZXgtZW5kXCI+XHJcbiAgICAgICAgICA8ZGl2IGZ4RmxleD1cIjAgMSBhdXRvXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbEZpbHRlckNoYW5nZXMoKVwiIG1hdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLXYyXCIgXHJcbiAgICAgICAgICAgICAgc2l6ZT1cIm1lZGl1bVwiIGlkPVwidGFibGVGaWx0ZXJDYW5jZWxcIiBjb2xvcj1cInRlcnRpYXJ5XCI+XHJcbiAgICAgICAgICAgICAge3snYXJtYXR1cmUuc29mLXRhYmxlLmNhbmNlbCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBmeEZsZXg9XCIwIDEgYXV0b1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIFxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBseUZpbHRlcnMoKVwiIG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZi1idXR0b24tdjJcIlxyXG4gICAgICAgICAgICAgIHNpemU9XCJtZWRpdW1cIiBpZD1cInRhYmxlRmlsdGVyQXBwbHlcIiBjb2xvcj1cInByaW1hcnlcIj5cclxuICAgICAgICAgICAgICB7eydhcm1hdHVyZS5zb2YtdGFibGUucmVzdWx0cycgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZmllbGRzZXQ+XHJcbn1cclxuXHJcbjxhZy1ncmlkLWFuZ3VsYXIgXHJcbiAgW2Z4U2hvd109XCJpc0dyaWREYXRhUmVuZGVyZWQoKVwiXHJcbiAgKGdyaWRSZWFkeSk9XCJvbkdyaWRSZWFkeSgkZXZlbnQpXCIgXHJcbiAgKGZpcnN0RGF0YVJlbmRlcmVkKT1cIm9uRmlyc3REYXRhUmVuZGVyZWQoKVwiXHJcbiAgKGZpbHRlckNoYW5nZWQpPVwib25GaWx0ZXJDaGFuZ2VkKClcIlxyXG4gIChwYWdpbmF0aW9uQ2hhbmdlZCk9XCJjaGFuZ2VQYWdlU2l6ZSgkZXZlbnQpXCIgXHJcbiAgW3Jvd0RhdGFdPVwicm93RGF0YVwiIFxyXG4gIFtjb2x1bW5EZWZzXT1cImNvbERlZnNcIiBcclxuICBbZGVmYXVsdENvbERlZl09XCJkZWZhdWx0Q29sRGVmXCIgXHJcbiAgW3BhZ2luYXRpb25dPVwidHJ1ZVwiIFxyXG4gIFtzdXBwcmVzc1BhZ2luYXRpb25QYW5lbF09XCJ0cnVlXCJcclxuICBbcGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3JdPVwicGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3JcIiBcclxuICBbcGFnaW5hdGlvblBhZ2VTaXplXT1cInBhZ2luYXRpb25QYWdlU2l6ZVwiXHJcbiAgW2hlYWRlckhlaWdodF09XCJyb3dIZWlnaHRcIiBcclxuICBbcm93SGVpZ2h0XT1cInJvd0hlaWdodFwiIFxyXG4gIFtkb21MYXlvdXRdPVwiJ2F1dG9IZWlnaHQnXCIgXHJcbiAgW3Rvb2x0aXBTaG93RGVsYXldPVwidG9vbHRpcFNob3dEZWxheVwiXHJcbiAgW292ZXJsYXlOb1Jvd3NUZW1wbGF0ZV09XCIoJ2FybWF0dXJlLnNvZi10YWJsZS5uby1yb3dzJyB8IHRyYW5zbGF0ZSkgfHwgJ05vIHJlc3VsdHMgZm91bmQuJ1wiXHJcbiAgW2NsYXNzLm5vLXJvd3NdPVwiIXRvdGFsTGVuZ3RoXCJcclxuICBjbGFzcz1cImFnLXRoZW1lLW1hdGVyaWFsXCI+XHJcbjwvYWctZ3JpZC1hbmd1bGFyPlxyXG5cclxuPGRpdiBcclxuICBbZnhTaG93XT1cImlzR3JpZERhdGFSZW5kZXJlZCgpXCJcclxuICBjbGFzcz1cImN1c3RvbS1wYWdpbmF0b3JcIj5cclxuICA8ZGl2IGNsYXNzPVwiZmlyc3Qtc2VjdGlvblwiPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbi1wYXJ0LTFcIiB0eXBlPVwiYnV0dG9uXCI+XHJcbiAgICAgIDxtYXQtc2VsZWN0IFxyXG4gICAgICAgICNwYWdlU2l6ZVNlbGVjdFxyXG4gICAgICAgIGlkPVwicGFnZVNpemVJbnB1dFwiIG5hbWU9XCJwYWdlU2l6ZUlucHV0XCIgXHJcbiAgICAgICAgWyh2YWx1ZSldPVwicGFnaW5hdGlvblBhZ2VTaXplXCIgZGlzYWJsZVJpcHBsZT1cInRydWVcIj5cclxuICAgICAgICBAZm9yIChzaXplIG9mIHBhZ2luYXRpb25QYWdlU2l6ZVNlbGVjdG9yOyBsZXQgaSA9ICRpbmRleDsgdHJhY2sgaSkge1xyXG4gICAgICAgICAgPG1hdC1vcHRpb24gXHJcbiAgICAgICAgICAgIGNsYXNzPVwicGFnZS1vcHRpb25cIiBpZD1cInNpemV7e2l9fVwiXHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJwYWdpbmF0aW9uUGFnZVNpemVTZWxlY3RvcltpXVwiPlxyXG4gICAgICAgICAgICB7e3NpemV9fVxyXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIH1cclxuICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3VycmVudC1wYWdlXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdlXCI+e3twYWdpbmF0aW9uUGFnZVNpemV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC1pY29uXCI+XHJcbiAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cIidwaC1ib2xkIHBoLWNhcmV0LScgKyAocGFnZVNpemVTZWxlY3QucGFuZWxPcGVuID8gJ3VwJzonZG93bicpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8c3BhbiBjbGFzcz1cInBhZ2VDaGFuZ2VUZXh0XCI+XHJcbiAgICAgIHt7cGFnZUNoYW5nZVRleHR9fSB7eydhcm1hdHVyZS5zb2YtdGFibGUub2YnIHwgdHJhbnNsYXRlfX0ge3t0b3RhbExlbmd0aH19XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImdvLXRvLXBhZ2VcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJvdXRlci1ib3hcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbi1wYXJ0XCIgdHlwZT1cImJ1dHRvblwiPlxyXG4gICAgICAgIDxtYXQtc2VsZWN0IFxyXG4gICAgICAgICAgI3BhZ2VOdW1iZXJTZWxlY3RcclxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25QYWdlTnVtYmVyQ2hhbmdlKCRldmVudC52YWx1ZSlcIlxyXG4gICAgICAgICAgWyh2YWx1ZSldPVwiY3VycmVudFBhZ2VcIiBcclxuICAgICAgICAgIGlkPVwicGFnZVNlbGVsY3RvclwiIG5hbWU9XCJwYWdlU2VsZWN0b3JcIiBkaXNhYmxlUmlwcGxlPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgQGZvciAocGFnZSBvZiBwYWdlU2VsZWN0b3I7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwicGFnZVwiIGNsYXNzPVwicGFnZS1vcHRpb25cIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnJlbnQtcGFnZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdlXCI+e3twYWdlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnJlbnQtcGFnZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdlXCI+e3tjdXJyZW50UGFnZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvZi1wYWdlXCI+IHt7J2FybWF0dXJlLnNvZi10YWJsZS5vZicgfCB0cmFuc2xhdGV9fSB7e3RvdGFsTnVtYmVyT2ZQYWdlc319IDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cIidwaC1ib2xkIHBoLWNhcmV0LScgKyAocGFnZU51bWJlclNlbGVjdC5wYW5lbE9wZW4gPyAndXAnOidkb3duJylcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxuYXYgY2xhc3M9XCJzZWNvbmQtc2VjdGlvblwiPlxyXG4gICAgICA8YnV0dG9uIFxyXG4gICAgICAgIChjbGljayk9XCJwcmV2aW91c1BhZ2UoKVwiXHJcbiAgICAgICAgaWQ9XCJwcmV2LWJ1dHRvblwiIG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZnQtYnV0dG9uLWljb24tdjJcIiBjb2xvcj1cInNlY29uZGFyeVwiIHNpemU9XCJzbWFsbFwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRQYWdlID09PSAxXCIgXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInc2NyZWVuLXJlYWRlci5wYWdpbmF0aW9uLnByZXZpb3VzJyB8IHRyYW5zbGF0ZVwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwicGgtYm9sZCBwaC1jYXJldC1sZWZ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAoY2xpY2spPVwibmV4dFBhZ2UoKVwiIFxyXG4gICAgICAgIGlkPVwibmV4dC1idXR0b25cIiBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2Z0LWJ1dHRvbi1pY29uLXYyXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBzaXplPVwic21hbGxcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJjdXJyZW50UGFnZSA9PT0gdG90YWxOdW1iZXJPZlBhZ2VzXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidzY3JlZW4tcmVhZGVyLnBhZ2luYXRpb24ubmV4dCcgfCB0cmFuc2xhdGVcIj5cclxuICAgICAgICA8aSBjbGFzcz1cInBoLWJvbGQgcGgtY2FyZXQtcmlnaHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9uYXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuQGlmICghaXNHcmlkRGF0YVJlbmRlcmVkKCkpIHtcclxuICA8ZGl2IGNsYXNzPVwibG9hZGluZy1jb250YWluZXJcIj5cclxuICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjb2xvcj1cInByaW1hcnlcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiLz5cclxuICA8L2Rpdj5cclxufVxyXG4iXX0=
432
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FybWF0dXJlL2FnLWdyaWQtY29tcG9uZW50cy9zcmMvc29mLXRhYmxlL3NvZi10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcm1hdHVyZS9hZy1ncmlkLWNvbXBvbmVudHMvc3JjL3NvZi10YWJsZS9zb2YtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sTUFBTSxFQUVOLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFckQsT0FBTyxFQUdMLHlCQUF5QixFQUMxQixNQUFNLGtEQUFrRCxDQUFDOzs7Ozs7Ozs7Ozs7O0FBYzFELDRDQUE0QztBQU01QyxNQUFNLE9BQU8saUJBQWlCO0lBTDlCO1FBT0Usc0VBQXNFO1FBQ3RELFlBQU8sR0FBZSxFQUFFLENBQUM7UUFFekMsMkRBQTJEO1FBQzNDLFlBQU8sR0FBa0IsRUFBRSxDQUFDO1FBSzVDLGtCQUFrQjtRQUNGLCtCQUEwQixHQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTlFLG9CQUFvQjtRQUNKLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBRTdDLDBDQUEwQztRQUMxQixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUU3Qyw0Q0FBNEM7UUFDNUIsd0JBQW1CLEdBQVksSUFBSSxDQUFDO1FBRXBEOzs7Ozs7OztVQVFFO1FBQ2MsOEJBQXlCLEdBQVks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SSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBRzJCLG1CQUFtQjtzQkFBcEQsU0FBUzt1QkFBQyxxQkFBcUI7O0FBMllsQyxxQ0FBcUM7QUFDckMsTUFBTSxjQUFjO0lBQXBCO1FBS0UsZ0NBQWdDO1FBQ2hDLFlBQU8sR0FBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztDQUFBO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sbUJBQW1CO0NBT3hCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgXHJcbiAgQ29tcG9uZW50LCBcclxuICBFbGVtZW50UmVmLCBcclxuICBFdmVudEVtaXR0ZXIsIFxyXG4gIGluamVjdCwgXHJcbiAgSW5wdXQsIFxyXG4gIE9uQ2hhbmdlcywgXHJcbiAgT25Jbml0LCBcclxuICBPdXRwdXQsIFxyXG4gIHNpZ25hbCwgXHJcbiAgU2ltcGxlQ2hhbmdlcywgXHJcbiAgVmlld0NoaWxkLCBcclxuICBXcml0YWJsZVNpZ25hbCBcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IHRha2UsIHRhcCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5cclxuaW1wb3J0IHsgXHJcbiAgQ29sdW1uRGF0YSwgXHJcbiAgQ29sdW1uT3B0aW9uc0RhdGEsIFxyXG4gIFNvZkNvbHVtbk9wdGlvbnNDb21wb25lbnQgXHJcbn0gZnJvbSAnLi4vY29sdW1uLW9wdGlvbnMtbW9kYWwvY29sdW1uLW9wdGlvbnMuY29tcG9uZW50JztcclxuXHJcbmltcG9ydCB7XHJcbiAgQXBwbHlDb2x1bW5TdGF0ZVBhcmFtcyxcclxuICBDb2xEZWYsXHJcbiAgQ29sdW1uU3RhdGUsXHJcbiAgRmlsdGVyTW9kZWwsXHJcbiAgR3JpZEFwaSxcclxuICBHcmlkUmVhZHlFdmVudCxcclxuICBQYWdpbmF0aW9uQ2hhbmdlZEV2ZW50LFxyXG4gIFRleHRGaWx0ZXJNb2RlbFxyXG59IGZyb20gXCJhZy1ncmlkLWNvbW11bml0eVwiO1xyXG5cclxuXHJcbi8qKiBUaGUgU29mdGhlb24gQXJtYXR1cmUgVGFibGUgY29tcG9uZW50ICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc29mLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc29mLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc29mLXRhYmxlLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU29mVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIC8qKiBUaGUgbGFuZ3VhZ2UgdGV4dCBvciBhIGtleSB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhpcyBjb21wb25lbnQgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgcm93RGF0YTogQXJyYXk8YW55PiA9IFtdO1xyXG5cclxuICAvKiogQ29sdW1uIERlZmluaXRpb25zOiBEZWZpbmVzICYgY29udHJvbHMgZ3JpZCBjb2x1bW5zLiAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjb2xEZWZzOiBBcnJheTxDb2xEZWY+ID0gW107XHJcblxyXG4gIC8qKiBTaXplIG1vZGVzIGZvciB0YWJsZSAqL1xyXG4gIEBJbnB1dCgpIHByaXZhdGUgc2l6ZU1vZGU6ICdDb21wYWN0JyB8ICdSb29teScgfCAnRGVmYXVsdCc7XHJcblxyXG4gIC8qKiBQYWdlcyBzaXplcyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBwYWdpbmF0aW9uUGFnZVNpemVTZWxlY3RvcjogQXJyYXk8bnVtYmVyPiA9IFsxMCwgMjAsIDUwLCAxMDBdO1xyXG5cclxuICAvKiogRW5hYmxlIHNlYXJjaCAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVTZWFyY2g6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKiogRW5hYmxlIGN1c3RvbSB0ZXh0IGZpbHRlciBkcm9wZG93bnMgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlRmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqIEVuYWJsZSBDb2x1bW4gb3B0aW9ucyBtb2RhbCBzZWxlY3Rpb24gKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlQ29sdW1uT3B0aW9uczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKiBcclxuICAgKiBUbyBkaXNwbGF5IHRoZSB0ZXh0IG9uIHRoZSBjb2x1bW4gb3B0aW9ucyBtb2RhbCwgd2hpY2ggc3RhdGVzIC1cclxuICAgKiBgXCJPcHRpb25zIHdpbGwgYmUgc2F2ZWQgZm9yIHRoZSBuZXh0IHRpbWUgeW91IGxvZyBpbi5cImBcclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqIEBkZXNjcmlwdGlvbiBzZXQgdG8gdHJ1ZSBpZiBzZXQtdXAgZm9yIHNhdmluZyBwcmVmZXJlbmNlcyB0byBVc2VyIGRhdGEuXHJcbiAgICogQG5vdGUgWW91IGNhbiBzdGlsbCBzYXZlIHByZWZlcmVuY2VzIHRvIF9sb2NhbF8gb3IgX3Nlc3Npb25fIHN0b3JhZ2VcclxuICAgKiB1c2luZyB0aGUgYHNhdmVkQ29sdW1uU3RhdGVgIGlucHV0LCBhbmQgYHVwZGF0ZWRDb2x1bW5TdGF0ZWAgb3V0cHV0IGV2ZW50LlxyXG4gICAqIEBzZWUgVGhlIERlbW8gc2l0ZSBpcyBzYXZpbmcgdG8gbG9jYWwgc3RvcmFnZS5cclxuICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93U2F2ZUNvbHVtbk9wdGlvbnNUZXh0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBOYW1lL2xhYmVsIG9mIHRoZSB0YWJsZSAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB0YWJsZU5hbWU6IHN0cmluZztcclxuXHJcbiAgLyoqIFVzZXJzIHNhdmVkIGNvbHVtbiBvcHRpb25zIHN0YXRlICovXHJcbiAgQElucHV0KCkgcHJpdmF0ZSBzYXZlZENvbHVtblN0YXRlOiBBcHBseUNvbHVtblN0YXRlUGFyYW1zO1xyXG5cclxuICAvKiogT3V0cHV0IHVwZGF0ZWQgY29sdW1uIG9wdGlvbnMgZXZlbnQgdG8gc2F2ZSB0byB1c2VyIG9yIGJyb3dzZXIgc3RvcmFnZSAqL1xyXG4gIEBPdXRwdXQoKSB1cGRhdGVkQ29sdW1uU3RhdGU6IEV2ZW50RW1pdHRlcjxBcHBseUNvbHVtblN0YXRlUGFyYW1zPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLyoqIHRoZSBzZWFyY2ggaW5wdXQgKi9cclxuICBAVmlld0NoaWxkKCdncmlkU2VhcmNoVGV4dElucHV0JykgZ3JpZFNlYXJjaFRleHRJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuXHJcbiAgLyoqIENvbHVtbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBmaWx0ZXJhYmxlICovXHJcbiAgcHVibGljIGNvbEZpbHRlcnM6IEFycmF5PFNvZlRhYmxlRmlsdGVyPiA9IFtdO1xyXG5cclxuICAvKiogU2hvdyBmaWx0ZXIgKi9cclxuICBwdWJsaWMgc2hvd0ZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogUm93IEhlaWdodCBmb3IgdGFibGUgKi9cclxuICBwdWJsaWMgcm93SGVpZ2h0OiBudW1iZXIgPSA0ODtcclxuXHJcbiAgLyoqIEN1cnJlbnQgUGFnZSBJbmRleCAqL1xyXG4gIHB1YmxpYyBjdXJyZW50UGFnZTogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqIEdyaWQgQVBJICovXHJcbiAgcHJpdmF0ZSBncmlkQXBpITogR3JpZEFwaTtcclxuXHJcbiAgLyoqIElzIHRoZSB0YWJsZSByZWFkeSB0byBiZSBkaXNwbGF5ZWQgKi9cclxuICBwdWJsaWMgaXNHcmlkRGF0YVJlbmRlcmVkOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XHJcblxyXG4gIC8qKiBEZWZhdWx0IFBhZ2UgU2l6ZSAqL1xyXG4gIHB1YmxpYyBwYWdpbmF0aW9uUGFnZVNpemU6IG51bWJlciA9IDIwOyBcclxuXHJcbiAgLyoqIFRvb2wgdGlwIHNob3cgZGVsYXkgKi9cclxuICBwdWJsaWMgdG9vbHRpcFNob3dEZWxheTogbnVtYmVyID0gNTAwO1xyXG5cclxuICAvKiogRGVmYXVsdCBDb2x1bW4gRGVmaW5pdGlvbiAqL1xyXG4gIHB1YmxpYyBkZWZhdWx0Q29sRGVmOiBDb2xEZWYgPSB7XHJcbiAgICByZXNpemFibGU6IGZhbHNlLCAvLyBkaXNhYmxlIHJlc2l6ZSBcclxuICAgIHN1cHByZXNzSGVhZGVyTWVudUJ1dHRvbjogdHJ1ZSwgLy8gZGlzYWJsZSBkZWZhdWx0IGZpbHRlciBtZW51IFxyXG4gICAgc3VwcHJlc3NNb3ZhYmxlOiB0cnVlLCAvLyBkaXNhYmxlIGRlZmF1bHQgZHJhZyAmIGRyb3AgZm9yIGNvbHVtbnMgXHJcbiAgICBjZWxsU3R5bGU6IHsganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIgfVxyXG4gIH07XHJcblxyXG4gIC8qKiBMZW5ndGggb2YgZGF0YSAqL1xyXG4gIHB1YmxpYyB0b3RhbExlbmd0aDogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqVG90YWwgbnVtYmVyIG9mIHBhZ2VzICovXHJcbiAgcHVibGljIHRvdGFsTnVtYmVyT2ZQYWdlczogbnVtYmVyO1xyXG5cclxuICAvKiogUGFnZSBDaGFuZ2UgdGV4dCAqL1xyXG4gIHB1YmxpYyBwYWdlQ2hhbmdlVGV4dDogc3RyaW5nO1xyXG5cclxuICAvKiogUGFnZSBzZWxlY3RvciBhcnJheSAqL1xyXG4gIHB1YmxpYyBwYWdlU2VsZWN0b3I6IEFycmF5PG51bWJlcj4gPSBbXTtcclxuXHJcbiAgLyoqIEZpbHRlciBQYW5lbCBvcGVuIHN0YXRlICovXHJcbiAgcHVibGljIGZpbHRlck9wZW5TdGF0ZTogYm9vbGVhbjtcclxuXHJcbiAgLyoqIFRoZSBsaXN0IG9mIGZpbHRlcnMgYW5kIHRoZSBzZWxlY3RlZCB2YWx1ZXMgKi9cclxuICBwdWJsaWMgZmlsdGVyU2VsZWN0aW9uczogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTtcclxuXHJcbiAgLyoqIG1hdC1kaWFsb2cgKi9cclxuICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XHJcblxyXG4gIC8qKiBPbiBjb21wb25lbnQgaW5pdCAqL1xyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVzaXplR3JpZCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW5ndWxhciBPbiBDaGFuZ2VzXHJcbiAgICogQHBhcmFtIGNoYW5nZXMgVGhlIGlucHV0IGNoYW5nZXNcclxuICAgKi9cclxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXMucm93RGF0YSAmJiAhY2hhbmdlcy5yb3dEYXRhLmZpcnN0Q2hhbmdlICYmICEhdGhpcy5ncmlkQXBpKSB7XHJcbiAgICAgIHRoaXMudG90YWxMZW5ndGggPSB0aGlzLnJvd0RhdGEubGVuZ3RoO1xyXG4gICAgICB0aGlzLnBvcHVsYXRlRmlsdGVycygpO1xyXG4gICAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2VUZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZ3JpZCBoYXMgaW5nZXN0ZWQgdGhlIGlucHV0IGRhdGFcclxuICAgKiBAcGFyYW0gcGFyYW1zIEdyaWQgUmVhZHkgRXZlbnQsXHJcbiAgICogVGhlIGdyaWQgaGFzIGluaXRpYWxpemVkIGFuZCBpcyByZWFkeSBmb3IgbW9zdCBhcGkgY2FsbHMsIGJ1dCBtYXkgbm90IGJlIGZ1bGx5IHJlbmRlcmVkIHlldC5cclxuICAgKiBAbm90ZSB5b3UgY2FuIG5vdCBhY2Nlc3MgdGhpcy5ncmlkQXBpIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIHJ1biwgXHJcbiAgICogYW55IGF0dGVtcHRzIHRvIGFjY2VzcyB0aGlzLmdyaWRBcGkgaW4gdGhpcyBjb21wb25lbnRzIG5nT25Jbml0IG9yIHRoZSBmaXJzdCBuZ09uQ2hhbmdlcyBjeWNsZVxyXG4gICAqIHdpbGwgcmVzdWx0IGluIGEgdHlwZSBlcnJvcjsgYmVpbmcgdGhpcy5ncmlkQXBpIGlzIHVuZGVmaW5lZCBhdCB0aGF0IHRpbWUuXHJcbiAgICovXHJcbiAgcHVibGljIG9uR3JpZFJlYWR5KHBhcmFtczogR3JpZFJlYWR5RXZlbnQpIHtcclxuICAgIHRoaXMuZ3JpZEFwaSA9IHBhcmFtcy5hcGk7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25HZXRDdXJyZW50UGFnZSgpICsgMTtcclxuICAgIHRoaXMudG90YWxMZW5ndGggPSB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdldFJvd0NvdW50KCk7XHJcbiAgICB3aW5kb3cub25yZXNpemUgPSAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vYmlsZVdpZHRoVGhyZXNob2xkID0gNzUyO1xyXG4gICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gbW9iaWxlV2lkdGhUaHJlc2hvbGQpIHtcclxuICAgICAgICB0aGlzLnJvd0hlaWdodCA9IDQwO1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplID0gMTA7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZXNpemVHcmlkKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlVGV4dCgpO1xyXG4gICAgfVxyXG4gICAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgY29sdW1uIGRlZmluaXRpb25zLCBwb3B1bGF0ZSB0aGUgZmlsdGVyc1xyXG4gICAgdGhpcy5wb3B1bGF0ZUZpbHRlcnMoKTtcclxuICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZVRleHQoKTtcclxuICAgIGlmICghdGhpcy5yb3dEYXRhLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmlzR3JpZERhdGFSZW5kZXJlZC5zZXQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogRmlyZWQgdGhlIGZpcnN0IHRpbWUgZGF0YSBpcyByZW5kZXJlZCBpbnRvIHRoZSBncmlkLiAqL1xyXG4gIHB1YmxpYyBvbkZpcnN0RGF0YVJlbmRlcmVkKCkge1xyXG4gICAgaWYgKCF0aGlzLnNhdmVkQ29sdW1uU3RhdGU/LnN0YXRlLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBjb2x1bW5TdGF0ZTogQXJyYXk8Q29sdW1uU3RhdGU+ID0gc3RydWN0dXJlZENsb25lKHRoaXMuZ3JpZEFwaS5nZXRDb2x1bW5TdGF0ZSgpKTtcclxuICAgICAgdGhpcy5zYXZlZENvbHVtblN0YXRlID0ge1xyXG4gICAgICAgIHN0YXRlOiBjb2x1bW5TdGF0ZSxcclxuICAgICAgICBhcHBseU9yZGVyOiB0cnVlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICB0aGlzLmdyaWRBcGkuYXBwbHlDb2x1bW5TdGF0ZSh0aGlzLnNhdmVkQ29sdW1uU3RhdGUpO1xyXG4gICAgdGhpcy51cGRhdGVkQ29sdW1uU3RhdGUuZW1pdCh0aGlzLnNhdmVkQ29sdW1uU3RhdGUpO1xyXG4gICAgdGhpcy5pc0dyaWREYXRhUmVuZGVyZWQuc2V0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlc2l6ZSBncmlkIGZyb20gc2l6ZSBtb2RlICovXHJcbiAgcHJpdmF0ZSByZXNpemVHcmlkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2l6ZU1vZGUgPT09ICdDb21wYWN0Jykge1xyXG4gICAgICB0aGlzLnJvd0hlaWdodCA9IDQwO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zaXplTW9kZSA9PT0gJ1Jvb215Jykge1xyXG4gICAgICB0aGlzLnJvd0hlaWdodCA9IDU2O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucm93SGVpZ2h0ID0gNDg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPbiBwYWdlIHNlbGVjdGlvbiBjaGFuZ2VcclxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHNlbGVjdGVkIHBhZ2UgbnVtYmVyXHJcbiAgICovXHJcbiAgcHVibGljIG9uUGFnZU51bWJlckNoYW5nZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAvLyBUaGUgcGFnZSB2YWx1ZXMgYXJlIDEgb2ZmIHRvIG1ha2UgYSAxLWJhc2VkIGFycmF5LCBidXQgdGhlIGFjdHVhbCBwYWdlcyBhcmUgYSAwLWJhc2VkIGFycmF5LlxyXG4gICAgdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25Hb1RvUGFnZSh2YWx1ZSAtIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9uIG5leHQgcGFnZSBldmVudCAqL1xyXG4gIHB1YmxpYyBuZXh0UGFnZSgpIHtcclxuICAgIHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR29Ub05leHRQYWdlKCk7XHJcbiAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2VUZXh0KClcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdldEN1cnJlbnRQYWdlKCkgKyAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9uIFByZXZpb3VzIFBhZ2UgRXZlbnQgKi9cclxuICBwdWJsaWMgcHJldmlvdXNQYWdlKCkge1xyXG4gICAgdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25Hb1RvUHJldmlvdXNQYWdlKCk7XHJcbiAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2VUZXh0KClcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdldEN1cnJlbnRQYWdlKCkgKyAxO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gQ2hhbmdlIFBhZ2UgU2l6ZSBFdmVudFxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgcGFnaW5hdGlvbiBldmVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyBjaGFuZ2VQYWdlU2l6ZShldmVudDogUGFnaW5hdGlvbkNoYW5nZWRFdmVudCkge1xyXG4gICAgLy8gT25seSBuZWVkIHRvIGRvIHRoaXMgd29yayBpZiB0aGUgcGFnZSBzaXplIGhhcyBjaGFuZ2VkLlxyXG4gICAgaWYgKGV2ZW50Lm5ld1BhZ2VTaXplKSB7XHJcbiAgICAgIC8vIFVwZGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIGZpbHRlcmVkIHJvd3MuXHJcbiAgICAgIHRoaXMudG90YWxMZW5ndGggPSB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdldFJvd0NvdW50KCk7XHJcbiAgICAgIC8vIEhhbmRsZSB0ZXh0IGNoYW5nZXNcclxuICAgICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlVGV4dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIENhbGxlZCB3aGVuIHRoZSBncmlkIGZpbHRlciBpcyBjaGFuZ2VkICovXHJcbiAgcHVibGljIG9uRmlsdGVyQ2hhbmdlZCgpOiB2b2lkIHtcclxuICAgIC8vIFRPRE8gdXBkYXRlIHRoZSBmaWx0ZXIgZHJvcGRvd24gb3B0aW9ucyBiYXNlZCBvbiB0aGUgZmlsdGVyZWQgZGF0YSBzZXQsIGluc3RlYWQgb2YgdGhlIGNvbXBsZXRlIGRhdGEgc2V0LlxyXG4gICAgLy8gVXBkYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgZmlsdGVyZWQgcm93cy5cclxuICAgIHRoaXMudG90YWxMZW5ndGggPSB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdldFJvd0NvdW50KCk7XHJcbiAgICAvLyBIYW5kbGUgdGV4dCBjaGFuZ2VzXHJcbiAgICB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2VUZXh0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogR2VuZXJhdGVkIHRleHQgZm9yIHNob3dpbmcgcGFnZXMgaW4gZm9ybWF0OiAxLTExIG9mIDExICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVQYWdlQ2hhbmdlVGV4dCgpOiB2b2lkIHtcclxuICAgIC8vIEhhbmRsZSBlbXB0eSB0YWJsZVxyXG4gICAgaWYgKCF0aGlzLnRvdGFsTGVuZ3RoIHx8IHRoaXMucGFnaW5hdGlvblBhZ2VTaXplID09PSAwKSB7XHJcbiAgICAgIC8vIFJlc2V0IHRoZSBwYWdpbmF0aW9uIFVJXHJcbiAgICAgIHRoaXMudG90YWxOdW1iZXJPZlBhZ2VzID0gMTtcclxuICAgICAgdGhpcy5wYWdlU2VsZWN0b3IgPSBbMV07XHJcbiAgICAgIHRoaXMucGFnZUNoYW5nZVRleHQgPSBgMGA7XHJcbiAgICAgIHRoaXMuZ3JpZEFwaS5zaG93Tm9Sb3dzT3ZlcmxheSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmdyaWRBcGkuaGlkZU92ZXJsYXkoKTtcclxuICAgIH1cclxuICAgIC8vIFVwZGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzXHJcbiAgICB0aGlzLnRvdGFsTnVtYmVyT2ZQYWdlcyA9IHRoaXMuZ3JpZEFwaS5wYWdpbmF0aW9uR2V0VG90YWxQYWdlcygpIHx8IE1hdGguY2VpbCh0aGlzLnRvdGFsTGVuZ3RoIC8gdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUpIHx8IDE7XHJcbiAgICAvLyBSZXNldCB0aGUgcGFnZSBzZWxlY3RvclxyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICBjb25zdCBwYWdlU2VsZWN0b3IgPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRoaXMudG90YWxOdW1iZXJPZlBhZ2VzOyBpKyspIHtcclxuICAgICAgcGFnZVNlbGVjdG9yLnB1c2goaSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnBhZ2VTZWxlY3RvciA9IHBhZ2VTZWxlY3RvcjtcclxuICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWF4KHRoaXMudG90YWxMZW5ndGgsIDApO1xyXG4gICAgY29uc3QgcGFnZVNpemUgPSB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZTtcclxuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLmdyaWRBcGkucGFnaW5hdGlvbkdldEN1cnJlbnRQYWdlKCkgKiBwYWdlU2l6ZTtcclxuICAgIGNvbnN0IGVuZEluZGV4ID0gc3RhcnRJbmRleCA8IGxlbmd0aCA/IE1hdGgubWluKHN0YXJ0SW5kZXggKyBwYWdlU2l6ZSwgbGVuZ3RoKSA6IHN0YXJ0SW5kZXggKyBwYWdlU2l6ZTtcclxuICAgIHRoaXMucGFnZUNoYW5nZVRleHQgPSBgJHtzdGFydEluZGV4ICsgMX0gLSAke2VuZEluZGV4fWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBseSB0aGUgc2VhcmNoIGZpbHRlciBvbiBkYXRhIHdoZW4gc2VhcmNoIHRleHQgY2hhbmdlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBvblNlYXJjaFRleHRDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkQXBpLnNldEdyaWRPcHRpb24oXCJxdWlja0ZpbHRlclRleHRcIiwgdGhpcy5ncmlkU2VhcmNoVGV4dElucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRvZ2dsZSB0aGUgZmlsdGVyIHBhbmVsIGRpc3BsYXkgKi9cclxuICBwdWJsaWMgdG9nZ2xlRmlsdGVyUGFuZWwoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbHRlck9wZW5TdGF0ZSA9ICF0aGlzLmZpbHRlck9wZW5TdGF0ZTtcclxuICB9XHJcblxyXG4gIC8qKiBBcHBseSB0aGUgc2VsZWN0ZWQgZmlsdGVycyAqL1xyXG4gIHB1YmxpYyBhcHBseUZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICBsZXQgdGFibGVGaWx0ZXJNb2RlbDogRmlsdGVyTW9kZWwgPSB7fTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2xGaWx0ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNvbEZpbHRlciA9IHRoaXMuY29sRmlsdGVyc1tpXTtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IHRoaXMuZmlsdGVyU2VsZWN0aW9uc1tpXTtcclxuICAgICAgaWYgKCFzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgIC8vIFJlc2V0IG91dCB0aGUgY29sdW1uIGZpbHRlcnNcclxuICAgICAgICB0aGlzLmdyaWRBcGkuc2V0Q29sdW1uRmlsdGVyTW9kZWwoY29sRmlsdGVyLmhlYWRlciwgbnVsbCk7XHJcbiAgICAgICAgdGFibGVGaWx0ZXJNb2RlbFtjb2xGaWx0ZXIuaGVhZGVyXSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgIC8vIFNldCB0aGUgc2luZ2xlIGZpbHRlciBmb3IgdGhlIGNvbHVtblxyXG4gICAgICAgIGxldCBmaWx0ZXJNb2RlbDogVGV4dEZpbHRlck1vZGVsID0geyBmaWx0ZXJUeXBlOiAndGV4dCcsIHR5cGU6ICdlcXVhbHMnLCBmaWx0ZXI6IHNlbGVjdGVkRWxlbWVudHNbMF0gfTtcclxuICAgICAgICAvLyBBcHBseSB0aGUgZmlsdGVyIG1vZGVsIHRvIHRoZSBjb2x1bW5cclxuICAgICAgICB0YWJsZUZpbHRlck1vZGVsW2NvbEZpbHRlci5oZWFkZXJdID0gZmlsdGVyTW9kZWw7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gU2V0IG11bHRpcGxlIE9SIGZpbHRlcnMgZm9yIHRoZSBjb2x1bW5cclxuICAgICAgICBsZXQgZmlsdGVyTW9kZWxzOiBDb21iaW5lZFNpbXBsZU1vZGVsPFRleHRGaWx0ZXJNb2RlbD4gPSB7IGZpbHRlclR5cGU6ICd0ZXh0Jywgb3BlcmF0b3I6ICdPUicsIGNvbmRpdGlvbnM6IFtdIH07XHJcbiAgICAgICAgLy8gU2V0IHRoZSBzZWxlY3RlZCBlbGVtZW50cyBpbiB0aGUgbW9kZWxcclxuICAgICAgICBmb3IgKGNvbnN0IHNlbGVjdGVkRWxlbWVudCBvZiBzZWxlY3RlZEVsZW1lbnRzKSB7XHJcbiAgICAgICAgICBmaWx0ZXJNb2RlbHMuY29uZGl0aW9ucy5wdXNoKHsgZmlsdGVyVHlwZTogJ3RleHQnLCB0eXBlOiAnZXF1YWxzJywgZmlsdGVyOiBzZWxlY3RlZEVsZW1lbnQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFwcGx5IHRoZSBmaWx0ZXIgbW9kZWwgY29sbGVjdGlvbiB0byB0aGUgY29sdW1uXHJcbiAgICAgICAgdGFibGVGaWx0ZXJNb2RlbFtjb2xGaWx0ZXIuaGVhZGVyXSA9IGZpbHRlck1vZGVscztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gT25jZSBldmVyeXRoaW5nIGlzIHNldCwgdXBkYXRlIHRoZSBmaWx0ZXJzXHJcbiAgICB0aGlzLmdyaWRBcGkuc2V0RmlsdGVyTW9kZWwodGFibGVGaWx0ZXJNb2RlbCk7XHJcbiAgICB0aGlzLmdyaWRBcGkub25GaWx0ZXJDaGFuZ2VkKCk7XHJcbiAgfVxyXG5cclxuICAvKiogQ2xlYXIgYWxsIGZpbHRlcnMgKi9cclxuICBwdWJsaWMgY2xlYXJGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgLy8gQ2xlYXIgYWxsIHNlbGVjdGlvbnNcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJTZWxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyU2VsZWN0aW9uc1tpXSA9IFtdO1xyXG4gICAgfVxyXG4gICAgLy8gU2V0IHRoZSBmdWxsIGdyaWQgZmlsdGVyIG1vZGVsIHRvIG51bGxcclxuICAgIHRoaXMuZ3JpZEFwaS5zZXRGaWx0ZXJNb2RlbChudWxsKTtcclxuICAgIC8vIFVwZGF0ZSB0aGUgZGlzcGxheVxyXG4gICAgdGhpcy5ncmlkQXBpLm9uRmlsdGVyQ2hhbmdlZCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIG5vIGZpbHRlcnMgYXJlIHNlbGVjdGVkXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBhIGZpbHRlciBpcyBzZWxlY3RlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBoYXNFbXB0eUZpbHRlcnMoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyU2VsZWN0aW9ucyB8fCAhdGhpcy5maWx0ZXJTZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgZmlsdGVyU2VsZWN0IG9mIHRoaXMuZmlsdGVyU2VsZWN0aW9ucykge1xyXG4gICAgICAvLyBJZiBhdCBsZWFzdCBvbmUgZmlsdGVyIGhhcyBiZWVuIHNlbGVjdGVkLCByZXR1cm4gZmFsc2VcclxuICAgICAgaWYgKGZpbHRlclNlbGVjdC5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqIENhbmNlbCB0aGUgY2hhbmdlcyB0byB0aGUgZmlsdGVyIGFuZCBjbG9zZXMgdGhlIGZpbHRlciBwYW5lbCAqL1xyXG4gIHB1YmxpYyBjYW5jZWxGaWx0ZXJDaGFuZ2VzKCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbEZpbHRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgLy8gR2V0IHRoZSBzdG9yZWQgZmlsdGVycyBmb3IgdGhlIGdpdmVuIG1vZGVsXHJcbiAgICAgIGNvbnN0IGNvbEZpbHRlciA9IHRoaXMuY29sRmlsdGVyc1tpXTtcclxuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLmdyaWRBcGkuZ2V0Q29sdW1uRmlsdGVyTW9kZWwoY29sRmlsdGVyLmhlYWRlcik7XHJcbiAgICAgIGxldCBmaWx0ZXJTZWxlY3Rpb25EYXRhID0gW107XHJcbiAgICAgIGlmIChtb2RlbCAmJiBtb2RlbFtcImNvbmRpdGlvbnNcIl0pIHtcclxuICAgICAgICAvLyBUaGUgbW9kZWwgaXMgYSBjb21iaW5lZCBtb2RlbCB3aXRoIG11bHRpcGxlIHNlbGVjdGlvbnNcclxuICAgICAgICBjb25zdCBmaWx0ZXJNb2RlbCA9IG1vZGVsIGFzIENvbWJpbmVkU2ltcGxlTW9kZWw8VGV4dEZpbHRlck1vZGVsPjtcclxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZmlsdGVyTW9kZWwuY29uZGl0aW9ucykge1xyXG4gICAgICAgICAgZmlsdGVyU2VsZWN0aW9uRGF0YS5wdXNoKGVsZW1lbnQuZmlsdGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAobW9kZWwpIHtcclxuICAgICAgICAvLyBBc3N1bWUgdGhlIG1vZGVsIGlzIGEgc2luZ2xlIFRleHQgRmlsdGVyIE1vZGVsXHJcbiAgICAgICAgbGV0IGZpbHRlclNlbGVjdGlvbjogVGV4dEZpbHRlck1vZGVsID0gbW9kZWw7XHJcbiAgICAgICAgZmlsdGVyU2VsZWN0aW9uRGF0YS5wdXNoKGZpbHRlclNlbGVjdGlvbi5maWx0ZXIpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIFNldCB0aGUgZmlsdGVyIHNlbGVjdGlvbnNcclxuICAgICAgdGhpcy5maWx0ZXJTZWxlY3Rpb25zW2ldID0gZmlsdGVyU2VsZWN0aW9uRGF0YTtcclxuICAgIH1cclxuICAgIC8vIENsb3NlIHRoZSBmaWx0ZXIgcGFuZWxcclxuICAgIHRoaXMudG9nZ2xlRmlsdGVyUGFuZWwoKTtcclxuICB9XHJcblxyXG4gIC8qKiBQb3B1bGF0ZXMgdGhlIGZpbHRlciBkcm9wZG93bnMgKi9cclxuICBwcml2YXRlIHBvcHVsYXRlRmlsdGVycygpOiB2b2lkIHtcclxuICAgIC8vIFJlc2V0IHRoZSBmaWx0ZXIgZHJvcGRvd25zXHJcbiAgICB0aGlzLmZpbHRlclNlbGVjdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuY29sRmlsdGVycyA9IFtdO1xyXG4gICAgLy8gR2V0IHRoZSBjb2x1bW4gZGVmaW5pdGlvbnNcclxuICAgIGxldCBjb2xEZWZzID0gdGhpcy5ncmlkQXBpLmdldENvbHVtbkRlZnMoKTtcclxuICAgIGZvciAoY29uc3QgZGVmIG9mIGNvbERlZnMpIHtcclxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIGEgZmlsdGVyIGV4aXN0cyBmb3IgdGhpcyBjb2x1bW5cclxuICAgICAgaWYgKGRlZltcImZpbHRlclwiXSkge1xyXG4gICAgICAgIC8vIEVuc3VyZSB0aGVyZSBhcmUgZW5vdWdoIGZpbHRlciBzZWxlY3Rpb24gYXJyYXlzXHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZWxlY3Rpb25zLnB1c2goW10pO1xyXG4gICAgICAgIC8vIElmIGF0IGxlYXN0IG9uZSBmaWx0ZXIgaXMgcHJlc2VudCBhbmQgd2UgYXJlIG5vdCB1c2luZyBuYXRpdmUgZmlsdGVyLCBzaG93IHRoZSBjdXN0b20gZmlsdGVyIGJ1dHRvbi5cclxuICAgICAgICB0aGlzLnNob3dGaWx0ZXIgPSB0aGlzLmVuYWJsZUZpbHRlcjtcclxuICAgICAgICBjb25zdCBoZWFkZXJOYW1lID0gZGVmW1wiZmllbGRcIl07XHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSBkZWZbXCJoZWFkZXJOYW1lXCJdO1xyXG4gICAgICAgIC8vIFNldCBmaWx0ZXIgb3B0aW9ucywgaWYgcHJlc2VudFxyXG4gICAgICAgIGxldCB1bmlxdWVGaWx0ZXJWYWx1ZXMgPSBbXTtcclxuICAgICAgICAvLyBHZXQgZGF0YSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uIFRoaXMgYWxsb3dzIG1vcmUgZGlyZWN0IGRhdGEgcG9wdWxhdGlvbiBmb3IgdGhlIGZpbHRlcnMuXHJcbiAgICAgICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5yb3dEYXRhKSB7XHJcbiAgICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIGFzIGEgc3RyaW5nXHJcbiAgICAgICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IHJvd1toZWFkZXJOYW1lXTtcclxuICAgICAgICAgIC8vIENoZWNrIGlmIHZhbHVlIGV4aXN0cywgYW5kIGlmIGl0IGlzIG5vdCBhbHJlYWR5IG5vdGVkIGluIHRoZSBhcnJheVxyXG4gICAgICAgICAgaWYgKHN0cmluZ1ZhbHVlICYmICF1bmlxdWVGaWx0ZXJWYWx1ZXMuaW5jbHVkZXMoc3RyaW5nVmFsdWUpKSB7XHJcbiAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB2YWx1ZVxyXG4gICAgICAgICAgICB1bmlxdWVGaWx0ZXJWYWx1ZXMucHVzaChzdHJpbmdWYWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHVuaXF1ZUZpbHRlclZhbHVlcyA9IHVuaXF1ZUZpbHRlclZhbHVlcy5zb3J0KCk7XHJcbiAgICAgICAgLy8gQWRkIHRvIHRoZSBjb2x1bW4gZmlsdGVycyBkcm9wZG93bnNcclxuICAgICAgICB0aGlzLmNvbEZpbHRlcnMucHVzaCh7IGhlYWRlcjogaGVhZGVyTmFtZSwgbGFiZWw6IGxhYmVsLCBvcHRpb25zOiB1bmlxdWVGaWx0ZXJWYWx1ZXMgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBPcGVuIHRoZSBjb2x1bW4gb3B0aW9ucyBtb2RhbCAqL1xyXG4gIHB1YmxpYyBvcGVuQ29sdW1uT3B0aW9ucygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbHVtblN0YXRlOiBBcnJheTxDb2x1bW5TdGF0ZT4gPSB0aGlzLmdyaWRBcGkuZ2V0Q29sdW1uU3RhdGUoKTtcclxuICAgIGNvbnN0IGNvbHVtbkRhdGE6IEFycmF5PENvbHVtbkRhdGE+ID0gdGhpcy5jb2x1bW5TdGF0ZVRvRGF0YShjb2x1bW5TdGF0ZSk7XHJcbiAgICBjb25zdCBpbml0aWFsQ29sdW1uRGF0YTogQXJyYXk8Q29sdW1uRGF0YT4gPSB0aGlzLmNvbHVtblN0YXRlVG9EYXRhKHRoaXMuc2F2ZWRDb2x1bW5TdGF0ZS5zdGF0ZSk7XHJcbiAgICBjb25zdCBjb2x1bW5PcHRpb25zRGF0YTogQ29sdW1uT3B0aW9uc0RhdGEgPSB7XHJcbiAgICAgIHRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXHJcbiAgICAgIGNvbHVtbkRhdGEsXHJcbiAgICAgIGluaXRpYWxDb2x1bW5EYXRhLFxyXG4gICAgICBzaG93U2F2ZUNvbHVtbk9wdGlvbnNUZXh0OiB0aGlzLnNob3dTYXZlQ29sdW1uT3B0aW9uc1RleHRcclxuICAgIH07XHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFNvZkNvbHVtbk9wdGlvbnNDb21wb25lbnQsIHtcclxuICAgICAgd2lkdGg6ICc1MDBweCcsXHJcbiAgICAgIHBvc2l0aW9uOiB7IGJvdHRvbTogJzQwcHgnLCByaWdodDogJzQwcHgnIH0sXHJcbiAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnY29sdW1uLW9wdGlvbnMtaGVhZGluZycsXHJcbiAgICAgIGRhdGE6IGNvbHVtbk9wdGlvbnNEYXRhXHJcbiAgICB9KTtcclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnBpcGUoXHJcbiAgICAgIHRha2UoMSksXHJcbiAgICAgIHRhcCgodXBkYXRlZENvbHVtblN0YXRlOiBBcHBseUNvbHVtblN0YXRlUGFyYW1zKSA9PiB7XHJcbiAgICAgICAgaWYgKHVwZGF0ZWRDb2x1bW5TdGF0ZSAmJiB1cGRhdGVkQ29sdW1uU3RhdGUuc3RhdGUubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWRBcGkuYXBwbHlDb2x1bW5TdGF0ZSh1cGRhdGVkQ29sdW1uU3RhdGUpO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVkQ29sdW1uU3RhdGUuZW1pdCh1cGRhdGVkQ29sdW1uU3RhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYXBzIGBBcnJheTxDb2x1bW5TdGF0ZT5gIHRvIGBBcnJheTxDb2x1bW5EYXRhPmAgXHJcbiAgICogQG5vdGUgZmlsdGVycyBvdXQgYW55IGNvbHVtbnMgbWFya2VkIGFzICdwaW5uZWQnIGJ5IHRoZSBjb2x1bW4gZGVmaW5pdGlvbnMuXHJcbiAgICogQG5vdGUgZmlsdGVycyBhbnkgY29sdW1ucyB3aXRob3V0IGEgJ2hlYWRlck5hbWUnLlxyXG4gICAqIEBwYXJhbSBjb2x1bW5TdGF0ZSB0aGUgY29sdW1uIHN0YXRlIHRvIG1vZGlmeVxyXG4gICAqIEByZXR1cm5zIGFuIGFycmF5IG9mIGNvbHVtbiBkYXRhIGZvcm1hdHRlZCB0byBiZSBpbmdlc3RlZCBieSB0aGUgYFNvZkNvbHVtbk9wdGlvbnNDb21wb25lbnRgXHJcbiAgKi9cclxuICBwcml2YXRlIGNvbHVtblN0YXRlVG9EYXRhKGNvbHVtblN0YXRlOiBBcnJheTxDb2x1bW5TdGF0ZT4pOiBBcnJheTxDb2x1bW5EYXRhPiB7XHJcbiAgICByZXR1cm4gY29sdW1uU3RhdGVcclxuICAgICAgLmZpbHRlcigoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyTmFtZTogc3RyaW5nID0gdGhpcy5ncmlkQXBpLmdldENvbHVtbkRlZihjb2x1bW4uY29sSWQpPy5oZWFkZXJOYW1lIHx8IFwiXCI7XHJcbiAgICAgICAgaWYgKGhlYWRlck5hbWUgJiYgaGVhZGVyTmFtZS5sZW5ndGggJiYgIWNvbHVtbi5waW5uZWQpIHtcclxuICAgICAgICAgIHJldHVybiBjb2x1bW47XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAubWFwKChjb2x1bW4pID0+IHtcclxuICAgICAgICBjb25zdCBoZWFkZXJOYW1lOiBzdHJpbmcgPSB0aGlzLmdyaWRBcGkuZ2V0Q29sdW1uRGVmKGNvbHVtbi5jb2xJZCkuaGVhZGVyTmFtZTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgaWQ6IGNvbHVtbi5jb2xJZCxcclxuICAgICAgICAgIGlzQ2hlY2tlZDogIWNvbHVtbi5oaWRlLFxyXG4gICAgICAgICAgdGV4dDogaGVhZGVyTmFtZVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG4vKiogVXNlZCBmb3Igc2V0dGluZyBmaWx0ZXIgdmFsdWVzICovXHJcbmNsYXNzIFNvZlRhYmxlRmlsdGVyIHtcclxuICAvKiogVGhlIGNvbHVtbiBoZWFkZXIgKi9cclxuICBoZWFkZXI6IHN0cmluZztcclxuICAvKiogVGhlIGNvbHVtbiBsYWJlbCBvciB0cmFuc2xhdGlvbiBrZXkgKi9cclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKiBUaGUgY29sdW1uIGZpbHRlciBvcHRpb25zICovXHJcbiAgb3B0aW9uczogc3RyaW5nW10gPSBbXTtcclxufVxyXG5cclxuLyoqIEEgZmlsdGVyIGNvbWJpbmluZyBtdWx0aXBsZSBjb25kaXRpb25zLCB0YWtlbiBmcm9tIEFnR3JpZCovXHJcbmNsYXNzIENvbWJpbmVkU2ltcGxlTW9kZWw8VD4ge1xyXG4gIC8qKiBUaGUgZmlsdGVyIHR5cGUuIFVzdWFsbHkgJ3RleHQnICovXHJcbiAgZmlsdGVyVHlwZTogc3RyaW5nO1xyXG4gIC8qKiBUaGUgb3BlcmF0b3IuIFVzdWFsbHkgJ09SJyAqL1xyXG4gIG9wZXJhdG9yOiAnQU5EJyB8ICdPUic7XHJcbiAgLyoqIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgRmlsdGVyIE1vZGVsICovXHJcbiAgY29uZGl0aW9uczogVFtdO1xyXG59XHJcbiIsIjxkaXYgXHJcbiAgW2Z4U2hvd109XCJpc0dyaWREYXRhUmVuZGVyZWQoKVwiXHJcbiAgZnhMYXlvdXRHYXA9XCIxNnB4XCIgbS1iLTI0PlxyXG4gIEBpZiAoZW5hYmxlRmlsdGVyICYmIHNob3dGaWx0ZXIpIHtcclxuICAgIDxidXR0b24gXHJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVGaWx0ZXJQYW5lbCgpXCIgXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZi1idXR0b24tdjJcIlxyXG4gICAgICBbY2xhc3MuZmlsdGVyLXNlbGVjdGVkXT1cImZpbHRlck9wZW5TdGF0ZVwiIFxyXG4gICAgICBpZD1cImJ0bi1lbmFibGUtZmlsdGVyXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBzaXplPVwic21hbGxcIj5cclxuICAgICAgPGkgY2xhc3M9XCJwaCBwaC1ib2xkIHBoLXNsaWRlcnMtaG9yaXpvbnRhbFwiPjwvaT5cclxuICAgICAge3snYXJtYXR1cmUuc29mLXRhYmxlLmZpbHRlcicgfCB0cmFuc2xhdGV9fVxyXG4gICAgPC9idXR0b24+XHJcbiAgfVxyXG4gIEBpZiAoZW5hYmxlU2VhcmNoKSB7XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJzb2YtZm9ybS1maWVsZCB0YWJsZS1zZWFyY2gtZmllbGQgZGVuc2UtNFwiIGZ4RmxleD1cImF1dG9cIj5cclxuICAgICAgPHNwYW4gbWF0UHJlZml4PlxyXG4gICAgICAgIDxpIGNsYXNzPVwicGgtYm9sZCBwaC1tYWduaWZ5aW5nLWdsYXNzIHNlYXJjaC1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJzZWFyY2gtbGFiZWxcIj57eydhcm1hdHVyZS5zb2YtdGFibGUuc2VhcmNoJyB8IHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCBcclxuICAgICAgICAoaW5wdXQpPVwib25TZWFyY2hUZXh0Q2hhbmdlZCgpXCIgI2dyaWRTZWFyY2hUZXh0SW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImdyaWRTZWFyY2hUZXh0SW5wdXRcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2FybWF0dXJlLnNvZi10YWJsZS5zZWFyY2gnIHwgdHJhbnNsYXRlXCIvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICB9XHJcbiAgQGlmIChlbmFibGVDb2x1bW5PcHRpb25zKSB7XHJcbiAgICA8YnV0dG9uIFxyXG4gICAgICAoY2xpY2spPVwib3BlbkNvbHVtbk9wdGlvbnMoKVwiXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZnQtYnV0dG9uLWljb24tdjJcIiBcclxuICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIiBzaXplPVwic21hbGxcIj5cclxuICAgICAgPGkgY2xhc3M9XCJwaC1ib2xkIHBoLXBhdXNlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgPC9idXR0b24+XHJcbiAgfVxyXG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIltzb2YtdGFibGUtcmlnaHQtYnV0dG9uc11cIj48L25nLWNvbnRlbnQ+XHJcbiAgPCEtLSBcclxuICBPbmx5IGluamVjdCA8YnV0dG9uPidzIGluc2lkZSBhbiA8bmctY29udGFpbmVyIHNvZi10YWJsZS1yaWdodC1idXR0b25zPi5cclxuICBleDogZm9yIGJyb2tlciB0aGlzIHdvdWxkIGJlIHRoZSAnZXhwb3J0IHRhYmxlJyBidXR0b24sXHJcbiAgLi4uIFxyXG4gIDxuZy1jb250YWluZXIgc29mLXRhYmxlLXJpZ2h0LWJ1dHRvbnM+XHJcbiAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZnQtYnV0dG9uLWljb24tdjJcIiBjb2xvcj1cInNlY29uZGFyeVwiIHNpemU9XCJzbWFsbFwiPlxyXG4gICAgICA8aSBjbGFzcz1cInBoLWJvbGQgcGgtZXhwb3J0XCI+PC9pPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbiAgLi4uIFxyXG4gIG5vdGU6IG1ha2Ugc3VyZSBidXR0b25zIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIHRvIG1hdGNoIG90aGVycyA9XHJcbiAgYG1hdC1mbGF0LWJ1dHRvbiBjbGFzcz1cInNvZnQtYnV0dG9uLWljb24tdjJcIiBjb2xvcj1cInNlY29uZGFyeVwiIHNpemU9XCJzbWFsbFwiYFxyXG4gIC0tPlxyXG48L2Rpdj5cclxuXHJcbkBpZiAoZmlsdGVyT3BlblN0YXRlKSB7XHJcbiAgPGZpZWxkc2V0IGNsYXNzPVwiZmlsdGVyLXBhbmVsXCI+XHJcbiAgICA8cD5cclxuICAgICAgPGkgY2xhc3M9XCJwaCBwaC1ib2xkIHBoLXNsaWRlcnMtaG9yaXpvbnRhbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtOFwiPnt7J2FybWF0dXJlLnNvZi10YWJsZS5maWx0ZXInIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICA8L3A+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXBhbmVsLXNlbGVjdC1jb250YWluZXIgbS10LTIwXCI+XHJcbiAgICAgIEBmb3IgKGNvbEZpbHRlciBvZiBjb2xGaWx0ZXJzOyBsZXQgaSA9ICRpbmRleDsgdHJhY2sgaSkge1xyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwic29mLWZvcm0tZmllbGRcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+e3tjb2xGaWx0ZXIubGFiZWwgfCB0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QgXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyU2VsZWN0aW9uc1tpXVwiIFxyXG4gICAgICAgICAgICBtdWx0aXBsZSBcclxuICAgICAgICAgICAgaWQ9XCJmaWx0ZXJEcm9wZG93bnt7aX19XCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eydhcm1hdHVyZS5zb2YtdGFibGUuYWxsJyB8IHRyYW5zbGF0ZX19XCIgZGlzYWJsZVJpcHBsZT1cInRydWVcIj5cclxuICAgICAgICAgICAgQGZvciAoY29sT3B0aW9uIG9mIGNvbEZpbHRlci5vcHRpb25zOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiY29sT3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICB7e2NvbE9wdGlvbn19XHJcbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCI+XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiNTAlXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAgIChjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiIFtkaXNhYmxlZF09XCJoYXNFbXB0eUZpbHRlcnMoKVwiIFxyXG4gICAgICAgICAgbWF0LWJ1dHRvbiBjbGFzcz1cInNvZi1idXR0b24tdjJcIiBzaXplPVwibWVkaXVtXCJcclxuICAgICAgICAgIGlkPVwidGFibGVGaWx0ZXJDbGVhclwiIGNvbG9yPVwidGVydGlhcnlcIj5cclxuICAgICAgICAgIHt7J2FybWF0dXJlLnNvZi10YWJsZS5yZXNldCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBmeEZsZXg9XCI1MCVcIj5cclxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRHYXA9XCIyJVwiIGZ4TGF5b3V0QWxpZ249XCJmbGV4LWVuZFwiPlxyXG4gICAgICAgICAgPGRpdiBmeEZsZXg9XCIwIDEgYXV0b1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIFxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWxGaWx0ZXJDaGFuZ2VzKClcIiBtYXQtYnV0dG9uIGNsYXNzPVwic29mLWJ1dHRvbi12MlwiIFxyXG4gICAgICAgICAgICAgIHNpemU9XCJtZWRpdW1cIiBpZD1cInRhYmxlRmlsdGVyQ2FuY2VsXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiPlxyXG4gICAgICAgICAgICAgIHt7J2FybWF0dXJlLnNvZi10YWJsZS5jYW5jZWwnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgZnhGbGV4PVwiMCAxIGF1dG9cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlGaWx0ZXJzKClcIiBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2YtYnV0dG9uLXYyXCJcclxuICAgICAgICAgICAgICBzaXplPVwibWVkaXVtXCIgaWQ9XCJ0YWJsZUZpbHRlckFwcGx5XCIgY29sb3I9XCJwcmltYXJ5XCI+XHJcbiAgICAgICAgICAgICAge3snYXJtYXR1cmUuc29mLXRhYmxlLnJlc3VsdHMnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2ZpZWxkc2V0PlxyXG59XHJcblxyXG48YWctZ3JpZC1hbmd1bGFyIFxyXG4gIFtmeFNob3ddPVwiaXNHcmlkRGF0YVJlbmRlcmVkKClcIlxyXG4gIChncmlkUmVhZHkpPVwib25HcmlkUmVhZHkoJGV2ZW50KVwiIFxyXG4gIChmaXJzdERhdGFSZW5kZXJlZCk9XCJvbkZpcnN0RGF0YVJlbmRlcmVkKClcIlxyXG4gIChmaWx0ZXJDaGFuZ2VkKT1cIm9uRmlsdGVyQ2hhbmdlZCgpXCJcclxuICAocGFnaW5hdGlvbkNoYW5nZWQpPVwiY2hhbmdlUGFnZVNpemUoJGV2ZW50KVwiIFxyXG4gIFtyb3dEYXRhXT1cInJvd0RhdGFcIiBcclxuICBbY29sdW1uRGVmc109XCJjb2xEZWZzXCIgXHJcbiAgW2RlZmF1bHRDb2xEZWZdPVwiZGVmYXVsdENvbERlZlwiIFxyXG4gIFtwYWdpbmF0aW9uXT1cInRydWVcIiBcclxuICBbc3VwcHJlc3NQYWdpbmF0aW9uUGFuZWxdPVwidHJ1ZVwiXHJcbiAgW3BhZ2luYXRpb25QYWdlU2l6ZVNlbGVjdG9yXT1cInBhZ2luYXRpb25QYWdlU2l6ZVNlbGVjdG9yXCIgXHJcbiAgW3BhZ2luYXRpb25QYWdlU2l6ZV09XCJwYWdpbmF0aW9uUGFnZVNpemVcIlxyXG4gIFtoZWFkZXJIZWlnaHRdPVwicm93SGVpZ2h0XCIgXHJcbiAgW3Jvd0hlaWdodF09XCJyb3dIZWlnaHRcIiBcclxuICBbZG9tTGF5b3V0XT1cIidhdXRvSGVpZ2h0J1wiIFxyXG4gIFt0b29sdGlwU2hvd0RlbGF5XT1cInRvb2x0aXBTaG93RGVsYXlcIlxyXG4gIFtvdmVybGF5Tm9Sb3dzVGVtcGxhdGVdPVwiKCdhcm1hdHVyZS5zb2YtdGFibGUubm8tcm93cycgfCB0cmFuc2xhdGUpIHx8ICdObyByZXN1bHRzIGZvdW5kLidcIlxyXG4gIFtjbGFzcy5uby1yb3dzXT1cIiF0b3RhbExlbmd0aFwiXHJcbiAgY2xhc3M9XCJhZy10aGVtZS1tYXRlcmlhbFwiPlxyXG48L2FnLWdyaWQtYW5ndWxhcj5cclxuXHJcbjxkaXYgXHJcbiAgW2Z4U2hvd109XCJpc0dyaWREYXRhUmVuZGVyZWQoKVwiXHJcbiAgY2xhc3M9XCJjdXN0b20tcGFnaW5hdG9yXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZpcnN0LXNlY3Rpb25cIj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24tcGFydC0xXCIgdHlwZT1cImJ1dHRvblwiPlxyXG4gICAgICA8bWF0LXNlbGVjdCBcclxuICAgICAgICAjcGFnZVNpemVTZWxlY3RcclxuICAgICAgICBpZD1cInBhZ2VTaXplSW5wdXRcIiBuYW1lPVwicGFnZVNpemVJbnB1dFwiIFxyXG4gICAgICAgIFsodmFsdWUpXT1cInBhZ2luYXRpb25QYWdlU2l6ZVwiIGRpc2FibGVSaXBwbGU9XCJ0cnVlXCI+XHJcbiAgICAgICAgQGZvciAoc2l6ZSBvZiBwYWdpbmF0aW9uUGFnZVNpemVTZWxlY3RvcjsgbGV0IGkgPSAkaW5kZXg7IHRyYWNrIGkpIHtcclxuICAgICAgICAgIDxtYXQtb3B0aW9uIFxyXG4gICAgICAgICAgICBjbGFzcz1cInBhZ2Utb3B0aW9uXCIgaWQ9XCJzaXple3tpfX1cIlxyXG4gICAgICAgICAgICBbdmFsdWVdPVwicGFnaW5hdGlvblBhZ2VTaXplU2VsZWN0b3JbaV1cIj5cclxuICAgICAgICAgICAge3tzaXplfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnJlbnQtcGFnZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFnZVwiPnt7cGFnaW5hdGlvblBhZ2VTaXplfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QtaWNvblwiPlxyXG4gICAgICAgICAgICAgIDxpIFtjbGFzc109XCIncGgtYm9sZCBwaC1jYXJldC0nICsgKHBhZ2VTaXplU2VsZWN0LnBhbmVsT3BlbiA/ICd1cCc6J2Rvd24nKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJwYWdlQ2hhbmdlVGV4dFwiPlxyXG4gICAgICB7e3BhZ2VDaGFuZ2VUZXh0fX0ge3snYXJtYXR1cmUuc29mLXRhYmxlLm9mJyB8IHRyYW5zbGF0ZX19IHt7dG90YWxMZW5ndGh9fVxyXG4gICAgPC9zcGFuPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJnby10by1wYWdlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwib3V0ZXItYm94XCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24tcGFydFwiIHR5cGU9XCJidXR0b25cIj5cclxuICAgICAgICA8bWF0LXNlbGVjdCBcclxuICAgICAgICAgICNwYWdlTnVtYmVyU2VsZWN0XHJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uUGFnZU51bWJlckNoYW5nZSgkZXZlbnQudmFsdWUpXCJcclxuICAgICAgICAgIFsodmFsdWUpXT1cImN1cnJlbnRQYWdlXCIgXHJcbiAgICAgICAgICBpZD1cInBhZ2VTZWxlbGN0b3JcIiBuYW1lPVwicGFnZVNlbGVjdG9yXCIgZGlzYWJsZVJpcHBsZT1cInRydWVcIj5cclxuICAgICAgICAgIEBmb3IgKHBhZ2Ugb2YgcGFnZVNlbGVjdG9yOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInBhZ2VcIiBjbGFzcz1cInBhZ2Utb3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJyZW50LXBhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFnZVwiPnt7cGFnZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJyZW50LXBhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFnZVwiPnt7Y3VycmVudFBhZ2V9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib2YtcGFnZVwiPiB7eydhcm1hdHVyZS5zb2YtdGFibGUub2YnIHwgdHJhbnNsYXRlfX0ge3t0b3RhbE51bWJlck9mUGFnZXN9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LWljb25cIj5cclxuICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCIncGgtYm9sZCBwaC1jYXJldC0nICsgKHBhZ2VOdW1iZXJTZWxlY3QucGFuZWxPcGVuID8gJ3VwJzonZG93bicpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmF2IGNsYXNzPVwic2Vjb25kLXNlY3Rpb25cIj5cclxuICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAoY2xpY2spPVwicHJldmlvdXNQYWdlKClcIlxyXG4gICAgICAgIGlkPVwicHJldi1idXR0b25cIiBtYXQtZmxhdC1idXR0b24gY2xhc3M9XCJzb2Z0LWJ1dHRvbi1pY29uLXYyXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBzaXplPVwic21hbGxcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJjdXJyZW50UGFnZSA9PT0gMVwiIFxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3NjcmVlbi1yZWFkZXIucGFnaW5hdGlvbi5wcmV2aW91cycgfCB0cmFuc2xhdGVcIj5cclxuICAgICAgICA8aSBjbGFzcz1cInBoLWJvbGQgcGgtY2FyZXQtbGVmdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gXHJcbiAgICAgICAgKGNsaWNrKT1cIm5leHRQYWdlKClcIiBcclxuICAgICAgICBpZD1cIm5leHQtYnV0dG9uXCIgbWF0LWZsYXQtYnV0dG9uIGNsYXNzPVwic29mdC1idXR0b24taWNvbi12MlwiIGNvbG9yPVwic2Vjb25kYXJ5XCIgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiY3VycmVudFBhZ2UgPT09IHRvdGFsTnVtYmVyT2ZQYWdlc1wiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInc2NyZWVuLXJlYWRlci5wYWdpbmF0aW9uLm5leHQnIHwgdHJhbnNsYXRlXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJwaC1ib2xkIHBoLWNhcmV0LXJpZ2h0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvbmF2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbkBpZiAoIWlzR3JpZERhdGFSZW5kZXJlZCgpKSB7XHJcbiAgPGRpdiBjbGFzcz1cImxvYWRpbmctY29udGFpbmVyXCI+XHJcbiAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgY29sb3I9XCJwcmltYXJ5XCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIi8+XHJcbiAgPC9kaXY+XHJcbn1cclxuIl19
@@ -141,9 +141,6 @@ class SofTableComponent {
141
141
  this.populateFilters();
142
142
  this.handlePageChangeText();
143
143
  }
144
- if (changes.colDefs && !changes.colDefs.firstChange && !!this.gridApi) {
145
- this.populateFilters();
146
- }
147
144
  }
148
145
  /**
149
146
  * Called when the grid has ingested the input data
@@ -1 +1 @@
1
- {"version":3,"file":"softheon-armature-ag-grid-components.mjs","sources":["../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.ts","../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.html","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.ts","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.html","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.ts","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.html","../../../../projects/armature/ag-grid-components/src/ag-grid-components.module.ts","../../../../projects/armature/ag-grid-components/public-api.ts","../../../../projects/armature/ag-grid-components/softheon-armature-ag-grid-components.ts"],"sourcesContent":["import { Component, inject } from \"@angular/core\";\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from \"@angular/material/dialog\";\r\nimport { ApplyColumnStateParams, ColumnState } from \"ag-grid-community\";\r\n\r\n/** Table Column options dialog */\r\n@Component({\r\n selector: 'sof-column-options',\r\n templateUrl: './column-options.component.html',\r\n styleUrl: './column-options.component.scss'\r\n})\r\nexport class SofColumnOptionsComponent {\r\n\r\n /** dialog reference */\r\n private dialogRef: MatDialogRef<SofColumnOptionsComponent> = inject(MatDialogRef<SofColumnOptionsComponent>);\r\n\r\n /** dialog data */\r\n public data: ColumnOptionsData = inject(MAT_DIALOG_DATA);\r\n\r\n /** emit the updated column state */\r\n public applyUpdatedColumnState(): void {\r\n const columnState: Array<ColumnState> = this.data.columnData.map((column) => {\r\n return {\r\n colId: column.id,\r\n hide: !column.isChecked\r\n }\r\n });\r\n const updatedColumnState: ApplyColumnStateParams = {\r\n state: [...columnState],\r\n applyOrder: true\r\n };\r\n this.dialogRef.close(updatedColumnState);\r\n }\r\n\r\n /** reset the column data to its first saved value */\r\n public resetColumnData(): void {\r\n this.data.columnData = structuredClone(this.data.initialColumnData);\r\n }\r\n}\r\n\r\n/** \r\n * Column options modal data\r\n * @description data passed from the 'SofTableComponent'\r\n * @property `tableName: string` name of the table using the column options\r\n * @property `columnData: Array<ColumnData>` column data returned from the agGrid api\r\n * @property `initialColumnData: Array<ColumnData>` column data from saved user preference or initial `columnData` \r\n * @see {@link ColumnData}\r\n */\r\nexport interface ColumnOptionsData {\r\n /** name of the table using the column options */\r\n tableName?: string;\r\n /** column data returned from the agGrid api */\r\n columnData?: Array<ColumnData>;\r\n /** column data from saved user preference or initial `columnData` */\r\n initialColumnData?: Array<ColumnData>;\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n */\r\n showSaveColumnOptionsText?: boolean;\r\n}\r\n\r\n/** \r\n * Column data \r\n * @description column data derived from the agGrid api, adds id property to type `HandleInput`\r\n * @property `id: string` columns unique id\r\n * @property `text: string` columns header text\r\n * @property `isChecked: boolean` column not hidden\r\n*/\r\nexport interface ColumnData {\r\n /** columns unique id */\r\n id?: string;\r\n /** columns header text */\r\n text?: string;\r\n /** column not hidden */\r\n isChecked?: boolean;\r\n}\r\n","<div class=\"column-options-header\">\r\n <i class=\"ph-bold ph-square-split-horizontal\" aria-hidden=\"true\"></i>\r\n <h2 id=\"column-options-heading\">{{'armature.sof-table.column-options' | translate}}</h2>\r\n <button \r\n mat-dialog-close m-l-auto \r\n disableRipple=\"true\" id=\"column-options-close\" aria-label=\"close\">\r\n <i class=\"ph-bold ph-x close\" aria-hidden=\"true\"></i>\r\n </button>\r\n</div>\r\n<div class=\"column-options-container\">\r\n <div class=\"column-options-description\">\r\n <p>\r\n {{'armature.sof-table.column-options-description' | translate}} \r\n {{ data.showSaveColumnOptionsText ? ('armature.sof-table.column-options-description-saving' | translate) : ''}}\r\n </p>\r\n <p class=\"table-label\">{{data.tableName | translate}} {{'armature.sof-table.columns' | translate}}</p>\r\n </div>\r\n <div class=\"column-options-selections\">\r\n <sof-handle [handleList]=\"data.columnData\"/>\r\n </div>\r\n <div class=\"column-options-bottom\">\r\n <button\r\n (click)=\"resetColumnData()\"\r\n mat-flat-button color=\"tertiary\" \r\n size=\"small\" class=\"sof-button-v2\" m-r-auto\r\n id=\"column-options-reset\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n <button \r\n mat-flat-button mat-dialog-close \r\n color=\"secondary\" size=\"small\" class=\"sof-button-v2\"\r\n id=\"column-options-cancel\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n <button \r\n (click)=\"applyUpdatedColumnState()\"\r\n mat-flat-button color=\"primary\" \r\n size=\"small\" class=\"sof-button-v2\"\r\n id=\"column-options-update\">\r\n {{'armature.sof-table.update' | translate}}\r\n </button>\r\n </div>\r\n</div>\r\n","import { \r\n Component, \r\n ElementRef, \r\n EventEmitter, \r\n inject, \r\n Input, \r\n OnChanges, \r\n OnInit, \r\n Output, \r\n signal, \r\n SimpleChanges, \r\n ViewChild, \r\n WritableSignal \r\n} from '@angular/core';\r\n\r\nimport { take, tap } from 'rxjs';\r\nimport { MatDialog } from '@angular/material/dialog';\r\n\r\nimport { \r\n ColumnData, \r\n ColumnOptionsData, \r\n SofColumnOptionsComponent \r\n} from '../column-options-modal/column-options.component';\r\n\r\nimport {\r\n ApplyColumnStateParams,\r\n ColDef,\r\n ColumnState,\r\n FilterModel,\r\n GridApi,\r\n GridReadyEvent,\r\n PaginationChangedEvent,\r\n TextFilterModel\r\n} from \"ag-grid-community\";\r\n\r\n\r\n/** The Softheon Armature Table component */\r\n@Component({\r\n selector: 'sof-table',\r\n templateUrl: './sof-table.component.html',\r\n styleUrl: './sof-table.component.scss'\r\n})\r\nexport class SofTableComponent implements OnInit, OnChanges {\r\n\r\n /** The language text or a key that will be shown in this component */\r\n @Input() public rowData: Array<any> = [];\r\n\r\n /** Column Definitions: Defines & controls grid columns. */\r\n @Input() public colDefs: Array<ColDef> = [];\r\n\r\n /** Size modes for table */\r\n @Input() private sizeMode: 'Compact' | 'Roomy' | 'Default';\r\n\r\n /** Pages sizes */\r\n @Input() public paginationPageSizeSelector: Array<number> = [10, 20, 50, 100];\r\n\r\n /** Enable search */\r\n @Input() public enableSearch: boolean = true;\r\n\r\n /** Enable custom text filter dropdowns */\r\n @Input() public enableFilter: boolean = true;\r\n\r\n /** Enable Column options modal selection */\r\n @Input() public enableColumnOptions: boolean = true;\r\n\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n * @default false\r\n * @description set to true if set-up for saving preferences to User data.\r\n * @note You can still save preferences to _local_ or _session_ storage\r\n * using the `savedColumnState` input, and `updatedColumnState` output event.\r\n * @see The Demo site is saving to local storage.\r\n */\r\n @Input() public showSaveColumnOptionsText: boolean = false;\r\n\r\n /** Name/label of the table */\r\n @Input() public tableName: string;\r\n\r\n /** Users saved column options state */\r\n @Input() private savedColumnState: ApplyColumnStateParams;\r\n\r\n /** Output updated column options event to save to user or browser storage */\r\n @Output() updatedColumnState: EventEmitter<ApplyColumnStateParams> = new EventEmitter();\r\n\r\n /** the search input */\r\n @ViewChild('gridSearchTextInput') gridSearchTextInput: ElementRef<HTMLInputElement>;\r\n\r\n /** Column names that should be filterable */\r\n public colFilters: Array<SofTableFilter> = [];\r\n\r\n /** Show filter */\r\n public showFilter: boolean = false;\r\n\r\n /** Row Height for table */\r\n public rowHeight: number = 48;\r\n\r\n /** Current Page Index */\r\n public currentPage: number = 0;\r\n\r\n /** Grid API */\r\n private gridApi!: GridApi;\r\n\r\n /** Is the table ready to be displayed */\r\n public isGridDataRendered: WritableSignal<boolean> = signal(false);\r\n\r\n /** Default Page Size */\r\n public paginationPageSize: number = 20; \r\n\r\n /** Tool tip show delay */\r\n public tooltipShowDelay: number = 500;\r\n\r\n /** Default Column Definition */\r\n public defaultColDef: ColDef = {\r\n resizable: false, // disable resize \r\n suppressHeaderMenuButton: true, // disable default filter menu \r\n suppressMovable: true, // disable default drag & drop for columns \r\n cellStyle: { justifyContent: \"center\" }\r\n };\r\n\r\n /** Length of data */\r\n public totalLength: number = 0;\r\n\r\n /**Total number of pages */\r\n public totalNumberOfPages: number;\r\n\r\n /** Page Change text */\r\n public pageChangeText: string;\r\n\r\n /** Page selector array */\r\n public pageSelector: Array<number> = [];\r\n\r\n /** Filter Panel open state */\r\n public filterOpenState: boolean;\r\n\r\n /** The list of filters and the selected values */\r\n public filterSelections: Array<Array<string>> = [];\r\n\r\n /** mat-dialog */\r\n private dialog: MatDialog = inject(MatDialog);\r\n\r\n /** On component init */\r\n public ngOnInit(): void {\r\n this.resizeGrid();\r\n }\r\n\r\n /**\r\n * Angular On Changes\r\n * @param changes The input changes\r\n */\r\n public ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.rowData && !changes.rowData.firstChange && !!this.gridApi) {\r\n this.totalLength = this.rowData.length;\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n }\r\n if (changes.colDefs && !changes.colDefs.firstChange && !!this.gridApi) {\r\n this.populateFilters();\r\n }\r\n }\r\n\r\n /**\r\n * Called when the grid has ingested the input data\r\n * @param params Grid Ready Event,\r\n * The grid has initialized and is ready for most api calls, but may not be fully rendered yet.\r\n * @note you can not access this.gridApi before this function is run, \r\n * any attempts to access this.gridApi in this components ngOnInit or the first ngOnChanges cycle\r\n * will result in a type error; being this.gridApi is undefined at that time.\r\n */\r\n public onGridReady(params: GridReadyEvent) {\r\n this.gridApi = params.api;\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n window.onresize = () => {\r\n const mobileWidthThreshold = 752;\r\n if (window.innerWidth <= mobileWidthThreshold) {\r\n this.rowHeight = 40;\r\n this.paginationPageSize = 10;\r\n }\r\n else {\r\n this.resizeGrid();\r\n }\r\n this.handlePageChangeText();\r\n }\r\n // Now that we have the column definitions, populate the filters\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n if (!this.rowData.length) {\r\n this.isGridDataRendered.set(true);\r\n }\r\n }\r\n\r\n /** Fired the first time data is rendered into the grid. */\r\n public onFirstDataRendered() {\r\n if (!this.savedColumnState?.state.length) {\r\n const columnState: Array<ColumnState> = structuredClone(this.gridApi.getColumnState());\r\n this.savedColumnState = {\r\n state: columnState,\r\n applyOrder: true\r\n };\r\n }\r\n this.gridApi.applyColumnState(this.savedColumnState);\r\n this.updatedColumnState.emit(this.savedColumnState);\r\n this.isGridDataRendered.set(true);\r\n }\r\n\r\n /** Resize grid from size mode */\r\n private resizeGrid(): void {\r\n if (this.sizeMode === 'Compact') {\r\n this.rowHeight = 40;\r\n }\r\n else if (this.sizeMode === 'Roomy') {\r\n this.rowHeight = 56;\r\n }\r\n else {\r\n this.rowHeight = 48;\r\n }\r\n }\r\n\r\n /**\r\n * On page selection change\r\n * @param value The selected page number\r\n */\r\n public onPageNumberChange(value: number): void {\r\n // The page values are 1 off to make a 1-based array, but the actual pages are a 0-based array.\r\n this.gridApi.paginationGoToPage(value - 1);\r\n }\r\n\r\n /** On next page event */\r\n public nextPage() {\r\n this.gridApi.paginationGoToNextPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /** On Previous Page Event */\r\n public previousPage() {\r\n this.gridApi.paginationGoToPreviousPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /**\r\n * On Change Page Size Event\r\n * @param event The pagination event\r\n */\r\n public changePageSize(event: PaginationChangedEvent) {\r\n // Only need to do this work if the page size has changed.\r\n if (event.newPageSize) {\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n // Handle text changes\r\n this.handlePageChangeText();\r\n }\r\n }\r\n\r\n /** Called when the grid filter is changed */\r\n public onFilterChanged(): void {\r\n // TODO update the filter dropdown options based on the filtered data set, instead of the complete data set.\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n // Handle text changes\r\n this.handlePageChangeText();\r\n }\r\n\r\n /** Generated text for showing pages in format: 1-11 of 11 */\r\n private handlePageChangeText(): void {\r\n // Handle empty table\r\n if (!this.totalLength || this.paginationPageSize === 0) {\r\n // Reset the pagination UI\r\n this.totalNumberOfPages = 1;\r\n this.pageSelector = [1];\r\n this.pageChangeText = `0`;\r\n this.gridApi.showNoRowsOverlay();\r\n return;\r\n } else {\r\n this.gridApi.hideOverlay();\r\n }\r\n // Update the total number of pages\r\n this.totalNumberOfPages = this.gridApi.paginationGetTotalPages() || Math.ceil(this.totalLength / this.paginationPageSize) || 1;\r\n // Reset the page selector\r\n this.currentPage = 1;\r\n const pageSelector = [];\r\n for (let i = 1; i <= this.totalNumberOfPages; i++) {\r\n pageSelector.push(i);\r\n }\r\n this.pageSelector = pageSelector;\r\n const length = Math.max(this.totalLength, 0);\r\n const pageSize = this.paginationPageSize;\r\n const startIndex = this.gridApi.paginationGetCurrentPage() * pageSize;\r\n const endIndex = startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize;\r\n this.pageChangeText = `${startIndex + 1} - ${endIndex}`;\r\n }\r\n\r\n /**\r\n * Apply the search filter on data when search text changed\r\n */\r\n public onSearchTextChanged(): void {\r\n this.gridApi.setGridOption(\"quickFilterText\", this.gridSearchTextInput.nativeElement.value);\r\n }\r\n\r\n /** Toggle the filter panel display */\r\n public toggleFilterPanel(): void {\r\n this.filterOpenState = !this.filterOpenState;\r\n }\r\n\r\n /** Apply the selected filters */\r\n public applyFilters(): void {\r\n let tableFilterModel: FilterModel = {};\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n const colFilter = this.colFilters[i];\r\n const selectedElements = this.filterSelections[i];\r\n if (!selectedElements.length) {\r\n // Reset out the column filters\r\n this.gridApi.setColumnFilterModel(colFilter.header, null);\r\n tableFilterModel[colFilter.header] = null;\r\n }\r\n else if (selectedElements.length == 1) {\r\n // Set the single filter for the column\r\n let filterModel: TextFilterModel = { filterType: 'text', type: 'equals', filter: selectedElements[0] };\r\n // Apply the filter model to the column\r\n tableFilterModel[colFilter.header] = filterModel;\r\n }\r\n else {\r\n // Set multiple OR filters for the column\r\n let filterModels: CombinedSimpleModel<TextFilterModel> = { filterType: 'text', operator: 'OR', conditions: [] };\r\n // Set the selected elements in the model\r\n for (const selectedElement of selectedElements) {\r\n filterModels.conditions.push({ filterType: 'text', type: 'equals', filter: selectedElement });\r\n }\r\n // Apply the filter model collection to the column\r\n tableFilterModel[colFilter.header] = filterModels;\r\n }\r\n }\r\n // Once everything is set, update the filters\r\n this.gridApi.setFilterModel(tableFilterModel);\r\n this.gridApi.onFilterChanged();\r\n }\r\n\r\n /** Clear all filters */\r\n public clearFilters(): void {\r\n // Clear all selections\r\n for (let i = 0; i < this.filterSelections.length; i++) {\r\n this.filterSelections[i] = [];\r\n }\r\n // Set the full grid filter model to null\r\n this.gridApi.setFilterModel(null);\r\n // Update the display\r\n this.gridApi.onFilterChanged();\r\n }\r\n\r\n /**\r\n * Returns true if no filters are selected\r\n * @returns True if a filter is selected, false otherwise.\r\n */\r\n public hasEmptyFilters(): boolean {\r\n if (!this.filterSelections || !this.filterSelections.length) {\r\n return true;\r\n }\r\n for (const filterSelect of this.filterSelections) {\r\n // If at least one filter has been selected, return false\r\n if (filterSelect.length) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** Cancel the changes to the filter and closes the filter panel */\r\n public cancelFilterChanges(): void {\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n // Get the stored filters for the given model\r\n const colFilter = this.colFilters[i];\r\n const model = this.gridApi.getColumnFilterModel(colFilter.header);\r\n let filterSelectionData = [];\r\n if (model && model[\"conditions\"]) {\r\n // The model is a combined model with multiple selections\r\n const filterModel = model as CombinedSimpleModel<TextFilterModel>;\r\n for (const element of filterModel.conditions) {\r\n filterSelectionData.push(element.filter);\r\n }\r\n }\r\n else if (model) {\r\n // Assume the model is a single Text Filter Model\r\n let filterSelection: TextFilterModel = model;\r\n filterSelectionData.push(filterSelection.filter);\r\n }\r\n // Set the filter selections\r\n this.filterSelections[i] = filterSelectionData;\r\n }\r\n // Close the filter panel\r\n this.toggleFilterPanel();\r\n }\r\n\r\n /** Populates the filter dropdowns */\r\n private populateFilters(): void {\r\n // Reset the filter dropdowns\r\n this.filterSelections = [];\r\n this.colFilters = [];\r\n // Get the column definitions\r\n let colDefs = this.gridApi.getColumnDefs();\r\n for (const def of colDefs) {\r\n // Determine if a filter exists for this column\r\n if (def[\"filter\"]) {\r\n // Ensure there are enough filter selection arrays\r\n this.filterSelections.push([]);\r\n // If at least one filter is present and we are not using native filter, show the custom filter button.\r\n this.showFilter = this.enableFilter;\r\n const headerName = def[\"field\"];\r\n const label = def[\"headerName\"];\r\n // Set filter options, if present\r\n let uniqueFilterValues = [];\r\n // Get data from the input stream. This allows more direct data population for the filters.\r\n for (const row of this.rowData) {\r\n // Get the value as a string\r\n const stringValue = row[headerName];\r\n // Check if value exists, and if it is not already noted in the array\r\n if (stringValue && !uniqueFilterValues.includes(stringValue)) {\r\n // Add the node value\r\n uniqueFilterValues.push(stringValue);\r\n }\r\n }\r\n uniqueFilterValues = uniqueFilterValues.sort();\r\n // Add to the column filters dropdowns\r\n this.colFilters.push({ header: headerName, label: label, options: uniqueFilterValues });\r\n }\r\n }\r\n }\r\n\r\n /** Open the column options modal */\r\n public openColumnOptions(): void {\r\n const columnState: Array<ColumnState> = this.gridApi.getColumnState();\r\n const columnData: Array<ColumnData> = this.columnStateToData(columnState);\r\n const initialColumnData: Array<ColumnData> = this.columnStateToData(this.savedColumnState.state);\r\n const columnOptionsData: ColumnOptionsData = {\r\n tableName: this.tableName,\r\n columnData,\r\n initialColumnData,\r\n showSaveColumnOptionsText: this.showSaveColumnOptionsText\r\n };\r\n const dialogRef = this.dialog.open(SofColumnOptionsComponent, {\r\n width: '500px',\r\n position: { bottom: '40px', right: '40px' },\r\n ariaLabelledBy: 'column-options-heading',\r\n data: columnOptionsData\r\n });\r\n dialogRef.afterClosed().pipe(\r\n take(1),\r\n tap((updatedColumnState: ApplyColumnStateParams) => {\r\n if (updatedColumnState && updatedColumnState.state.length) {\r\n this.gridApi.applyColumnState(updatedColumnState);\r\n this.updatedColumnState.emit(updatedColumnState);\r\n }\r\n })\r\n ).subscribe();\r\n }\r\n\r\n /**\r\n * Maps `Array<ColumnState>` to `Array<ColumnData>` \r\n * @note filters out any columns marked as 'pinned' by the column definitions.\r\n * @note filters any columns without a 'headerName'.\r\n * @param columnState the column state to modify\r\n * @returns an array of column data formatted to be ingested by the `SofColumnOptionsComponent`\r\n */\r\n private columnStateToData(columnState: Array<ColumnState>): Array<ColumnData> {\r\n return columnState\r\n .filter((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId)?.headerName || \"\";\r\n if (headerName && headerName.length && !column.pinned) {\r\n return column;\r\n }\r\n })\r\n .map((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId).headerName;\r\n return {\r\n id: column.colId,\r\n isChecked: !column.hide,\r\n text: headerName\r\n };\r\n }\r\n );\r\n }\r\n}\r\n\r\n/** Used for setting filter values */\r\nclass SofTableFilter {\r\n /** The column header */\r\n header: string;\r\n /** The column label or translation key */\r\n label: string;\r\n /** The column filter options */\r\n options: string[] = [];\r\n}\r\n\r\n/** A filter combining multiple conditions, taken from AgGrid*/\r\nclass CombinedSimpleModel<T> {\r\n /** The filter type. Usually 'text' */\r\n filterType: string;\r\n /** The operator. Usually 'OR' */\r\n operator: 'AND' | 'OR';\r\n /** multiple instances of the Filter Model */\r\n conditions: T[];\r\n}\r\n","<div \r\n [fxShow]=\"isGridDataRendered()\"\r\n fxLayoutGap=\"16px\" m-b-24>\r\n @if (enableFilter && showFilter) {\r\n <button \r\n (click)=\"toggleFilterPanel()\" \r\n mat-flat-button class=\"sof-button-v2\"\r\n [class.filter-selected]=\"filterOpenState\" \r\n id=\"btn-enable-filter\" color=\"secondary\" size=\"small\">\r\n <i class=\"ph ph-bold ph-sliders-horizontal\"></i>\r\n {{'armature.sof-table.filter' | translate}}\r\n </button>\r\n }\r\n @if (enableSearch) {\r\n <mat-form-field class=\"sof-form-field table-search-field dense-4\" fxFlex=\"auto\">\r\n <span matPrefix>\r\n <i class=\"ph-bold ph-magnifying-glass search-icon\" aria-hidden=\"true\"></i>\r\n </span>\r\n <mat-label class=\"search-label\">{{'armature.sof-table.search' | translate}}</mat-label>\r\n <input \r\n (input)=\"onSearchTextChanged()\" #gridSearchTextInput matInput type=\"text\" id=\"gridSearchTextInput\"\r\n [attr.aria-label]=\"'armature.sof-table.search' | translate\"/>\r\n </mat-form-field>\r\n }\r\n @if (enableColumnOptions) {\r\n <button \r\n (click)=\"openColumnOptions()\"\r\n mat-flat-button class=\"soft-button-icon-v2\" \r\n color=\"secondary\" size=\"small\">\r\n <i class=\"ph-bold ph-pause\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n <ng-content select=\"[sof-table-right-buttons]\"></ng-content>\r\n <!-- \r\n Only inject <button>'s inside an <ng-container sof-table-right-buttons>.\r\n ex: for broker this would be the 'export table' button,\r\n ... \r\n <ng-container sof-table-right-buttons>\r\n <button mat-flat-button class=\"soft-button-icon-v2\" color=\"secondary\" size=\"small\">\r\n <i class=\"ph-bold ph-export\"></i>\r\n </button>\r\n </ng-container>\r\n ... \r\n note: make sure buttons have the following attributes to match others =\r\n `mat-flat-button class=\"soft-button-icon-v2\" color=\"secondary\" size=\"small\"`\r\n -->\r\n</div>\r\n\r\n@if (filterOpenState) {\r\n <fieldset class=\"filter-panel\">\r\n <p>\r\n <i class=\"ph ph-bold ph-sliders-horizontal\" aria-hidden=\"true\"></i>\r\n <span class=\"m-l-8\">{{'armature.sof-table.filter' | translate}}</span>\r\n </p>\r\n <div class=\"filter-panel-select-container m-t-20\">\r\n @for (colFilter of colFilters; let i = $index; track i) {\r\n <mat-form-field appearance=\"outline\" class=\"sof-form-field\">\r\n <mat-label>{{colFilter.label | translate}}</mat-label>\r\n <mat-select \r\n [(ngModel)]=\"filterSelections[i]\" \r\n multiple \r\n id=\"filterDropdown{{i}}\"\r\n placeholder=\"{{'armature.sof-table.all' | translate}}\" disableRipple=\"true\">\r\n @for (colOption of colFilter.options; track $index) {\r\n <mat-option [value]=\"colOption\">\r\n {{colOption}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div fxLayout=\"row\">\r\n <div fxFlex=\"50%\">\r\n <button \r\n (click)=\"clearFilters()\" [disabled]=\"hasEmptyFilters()\" \r\n mat-button class=\"sof-button-v2\" size=\"medium\"\r\n id=\"tableFilterClear\" color=\"tertiary\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"50%\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"2%\" fxLayoutAlign=\"flex-end\">\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"cancelFilterChanges()\" mat-button class=\"sof-button-v2\" \r\n size=\"medium\" id=\"tableFilterCancel\" color=\"tertiary\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"applyFilters()\" mat-flat-button class=\"sof-button-v2\"\r\n size=\"medium\" id=\"tableFilterApply\" color=\"primary\">\r\n {{'armature.sof-table.results' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </fieldset>\r\n}\r\n\r\n<ag-grid-angular \r\n [fxShow]=\"isGridDataRendered()\"\r\n (gridReady)=\"onGridReady($event)\" \r\n (firstDataRendered)=\"onFirstDataRendered()\"\r\n (filterChanged)=\"onFilterChanged()\"\r\n (paginationChanged)=\"changePageSize($event)\" \r\n [rowData]=\"rowData\" \r\n [columnDefs]=\"colDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [pagination]=\"true\" \r\n [suppressPaginationPanel]=\"true\"\r\n [paginationPageSizeSelector]=\"paginationPageSizeSelector\" \r\n [paginationPageSize]=\"paginationPageSize\"\r\n [headerHeight]=\"rowHeight\" \r\n [rowHeight]=\"rowHeight\" \r\n [domLayout]=\"'autoHeight'\" \r\n [tooltipShowDelay]=\"tooltipShowDelay\"\r\n [overlayNoRowsTemplate]=\"('armature.sof-table.no-rows' | translate) || 'No results found.'\"\r\n [class.no-rows]=\"!totalLength\"\r\n class=\"ag-theme-material\">\r\n</ag-grid-angular>\r\n\r\n<div \r\n [fxShow]=\"isGridDataRendered()\"\r\n class=\"custom-paginator\">\r\n <div class=\"first-section\">\r\n <button class=\"button-part-1\" type=\"button\">\r\n <mat-select \r\n #pageSizeSelect\r\n id=\"pageSizeInput\" name=\"pageSizeInput\" \r\n [(value)]=\"paginationPageSize\" disableRipple=\"true\">\r\n @for (size of paginationPageSizeSelector; let i = $index; track i) {\r\n <mat-option \r\n class=\"page-option\" id=\"size{{i}}\"\r\n [value]=\"paginationPageSizeSelector[i]\">\r\n {{size}}\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{paginationPageSize}}</span>\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageSizeSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n </button>\r\n <span class=\"pageChangeText\">\r\n {{pageChangeText}} {{'armature.sof-table.of' | translate}} {{totalLength}}\r\n </span>\r\n </div>\r\n <div class=\"go-to-page\">\r\n <div class=\"outer-box\">\r\n <button class=\"button-part\" type=\"button\">\r\n <mat-select \r\n #pageNumberSelect\r\n (selectionChange)=\"onPageNumberChange($event.value)\"\r\n [(value)]=\"currentPage\" \r\n id=\"pageSelelctor\" name=\"pageSelector\" disableRipple=\"true\">\r\n @for (page of pageSelector; track $index) {\r\n <mat-option [value]=\"page\" class=\"page-option\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{page}}</span>\r\n </span>\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{currentPage}}</span>\r\n <span class=\"of-page\"> {{'armature.sof-table.of' | translate}} {{totalNumberOfPages}} </span>\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageNumberSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n </button>\r\n </div>\r\n <nav class=\"second-section\">\r\n <button \r\n (click)=\"previousPage()\"\r\n id=\"prev-button\" mat-flat-button class=\"soft-button-icon-v2\" color=\"secondary\" size=\"small\"\r\n [disabled]=\"currentPage === 1\" \r\n [attr.aria-label]=\"'screen-reader.pagination.previous' | translate\">\r\n <i class=\"ph-bold ph-caret-left\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button \r\n (click)=\"nextPage()\" \r\n id=\"next-button\" mat-flat-button class=\"soft-button-icon-v2\" color=\"secondary\" size=\"small\"\r\n [disabled]=\"currentPage === totalNumberOfPages\"\r\n [attr.aria-label]=\"'screen-reader.pagination.next' | translate\">\r\n <i class=\"ph-bold ph-caret-right\" aria-hidden=\"true\"></i>\r\n </button>\r\n </nav>\r\n </div>\r\n</div>\r\n\r\n@if (!isGridDataRendered()) {\r\n <div class=\"loading-container\">\r\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\r\n </div>\r\n}\r\n","import { Component, Input } from '@angular/core';\r\n\r\n/** The Softheon Armature Table Cell component */\r\n@Component({\r\n selector: 'sof-table-cell',\r\n templateUrl: './table-cell.component.html',\r\n styleUrl: './table-cell.component.scss'\r\n})\r\nexport class SofTableCellComponent {\r\n\r\n /** All Components for Table Cell */\r\n @Input() public components: TableCellComponent[] = [];\r\n\r\n /** Any logic related to ag grid cell renderer data can be added here */\r\n public agInit(params): void {\r\n this.components = params['components'];\r\n }\r\n}\r\n\r\n/** Components to Render in Table Cell */\r\ninterface TableCellComponent {\r\n /** Component Class */\r\n component: any,\r\n /** Inputs needed for specific component */\r\n inputs: any\r\n}\r\n","<div class=\"table-cell\">\r\n <ng-container *ngFor=\"let currentComponent of components\">\r\n <ng-container *ngComponentOutlet=\"currentComponent.component; \r\n inputs:currentComponent.inputs;\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatOptionModule } from '@angular/material/core';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { AgGridModule } from 'ag-grid-angular';\r\nimport { SofTableComponent } from './sof-table/sof-table.component';\r\nimport { SofTableCellComponent } from './table-cell/table-cell.component';\r\nimport { SofColumnOptionsComponent } from './column-options-modal/column-options.component';\r\nimport { BaseComponentModule } from '@softheon/armature';\r\n\r\n\r\n/** The material modules */\r\nconst materialModules = [\r\n MatSelectModule,\r\n MatOptionModule,\r\n MatCheckboxModule,\r\n MatIconModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatRadioModule,\r\n MatProgressSpinnerModule\r\n];\r\n\r\n@NgModule({\r\n declarations: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n FlexLayoutModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslateModule,\r\n AgGridModule,\r\n ...materialModules,\r\n BaseComponentModule\r\n ],\r\n exports: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ]\r\n})\r\nexport class AgGridComponentsModule { }\r\n","/** Public API Surface of Ag Grid components */\r\nexport * from './src/ag-grid-components.module';\r\nexport * from './src/sof-table/sof-table.component';\r\nexport * from './src/table-cell/table-cell.component';\r\nexport * from './src/column-options-modal/column-options.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4","i8","i11"],"mappings":"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"}
1
+ {"version":3,"file":"softheon-armature-ag-grid-components.mjs","sources":["../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.ts","../../../../projects/armature/ag-grid-components/src/column-options-modal/column-options.component.html","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.ts","../../../../projects/armature/ag-grid-components/src/sof-table/sof-table.component.html","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.ts","../../../../projects/armature/ag-grid-components/src/table-cell/table-cell.component.html","../../../../projects/armature/ag-grid-components/src/ag-grid-components.module.ts","../../../../projects/armature/ag-grid-components/public-api.ts","../../../../projects/armature/ag-grid-components/softheon-armature-ag-grid-components.ts"],"sourcesContent":["import { Component, inject } from \"@angular/core\";\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from \"@angular/material/dialog\";\r\nimport { ApplyColumnStateParams, ColumnState } from \"ag-grid-community\";\r\n\r\n/** Table Column options dialog */\r\n@Component({\r\n selector: 'sof-column-options',\r\n templateUrl: './column-options.component.html',\r\n styleUrl: './column-options.component.scss'\r\n})\r\nexport class SofColumnOptionsComponent {\r\n\r\n /** dialog reference */\r\n private dialogRef: MatDialogRef<SofColumnOptionsComponent> = inject(MatDialogRef<SofColumnOptionsComponent>);\r\n\r\n /** dialog data */\r\n public data: ColumnOptionsData = inject(MAT_DIALOG_DATA);\r\n\r\n /** emit the updated column state */\r\n public applyUpdatedColumnState(): void {\r\n const columnState: Array<ColumnState> = this.data.columnData.map((column) => {\r\n return {\r\n colId: column.id,\r\n hide: !column.isChecked\r\n }\r\n });\r\n const updatedColumnState: ApplyColumnStateParams = {\r\n state: [...columnState],\r\n applyOrder: true\r\n };\r\n this.dialogRef.close(updatedColumnState);\r\n }\r\n\r\n /** reset the column data to its first saved value */\r\n public resetColumnData(): void {\r\n this.data.columnData = structuredClone(this.data.initialColumnData);\r\n }\r\n}\r\n\r\n/** \r\n * Column options modal data\r\n * @description data passed from the 'SofTableComponent'\r\n * @property `tableName: string` name of the table using the column options\r\n * @property `columnData: Array<ColumnData>` column data returned from the agGrid api\r\n * @property `initialColumnData: Array<ColumnData>` column data from saved user preference or initial `columnData` \r\n * @see {@link ColumnData}\r\n */\r\nexport interface ColumnOptionsData {\r\n /** name of the table using the column options */\r\n tableName?: string;\r\n /** column data returned from the agGrid api */\r\n columnData?: Array<ColumnData>;\r\n /** column data from saved user preference or initial `columnData` */\r\n initialColumnData?: Array<ColumnData>;\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n */\r\n showSaveColumnOptionsText?: boolean;\r\n}\r\n\r\n/** \r\n * Column data \r\n * @description column data derived from the agGrid api, adds id property to type `HandleInput`\r\n * @property `id: string` columns unique id\r\n * @property `text: string` columns header text\r\n * @property `isChecked: boolean` column not hidden\r\n*/\r\nexport interface ColumnData {\r\n /** columns unique id */\r\n id?: string;\r\n /** columns header text */\r\n text?: string;\r\n /** column not hidden */\r\n isChecked?: boolean;\r\n}\r\n","<div class=\"column-options-header\">\r\n <i class=\"ph-bold ph-square-split-horizontal\" aria-hidden=\"true\"></i>\r\n <h2 id=\"column-options-heading\">{{'armature.sof-table.column-options' | translate}}</h2>\r\n <button \r\n mat-dialog-close m-l-auto \r\n disableRipple=\"true\" id=\"column-options-close\" aria-label=\"close\">\r\n <i class=\"ph-bold ph-x close\" aria-hidden=\"true\"></i>\r\n </button>\r\n</div>\r\n<div class=\"column-options-container\">\r\n <div class=\"column-options-description\">\r\n <p>\r\n {{'armature.sof-table.column-options-description' | translate}} \r\n {{ data.showSaveColumnOptionsText ? ('armature.sof-table.column-options-description-saving' | translate) : ''}}\r\n </p>\r\n <p class=\"table-label\">{{data.tableName | translate}} {{'armature.sof-table.columns' | translate}}</p>\r\n </div>\r\n <div class=\"column-options-selections\">\r\n <sof-handle [handleList]=\"data.columnData\"/>\r\n </div>\r\n <div class=\"column-options-bottom\">\r\n <button\r\n (click)=\"resetColumnData()\"\r\n mat-flat-button color=\"tertiary\" \r\n size=\"small\" class=\"sof-button-v2\" m-r-auto\r\n id=\"column-options-reset\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n <button \r\n mat-flat-button mat-dialog-close \r\n color=\"secondary\" size=\"small\" class=\"sof-button-v2\"\r\n id=\"column-options-cancel\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n <button \r\n (click)=\"applyUpdatedColumnState()\"\r\n mat-flat-button color=\"primary\" \r\n size=\"small\" class=\"sof-button-v2\"\r\n id=\"column-options-update\">\r\n {{'armature.sof-table.update' | translate}}\r\n </button>\r\n </div>\r\n</div>\r\n","import { \r\n Component, \r\n ElementRef, \r\n EventEmitter, \r\n inject, \r\n Input, \r\n OnChanges, \r\n OnInit, \r\n Output, \r\n signal, \r\n SimpleChanges, \r\n ViewChild, \r\n WritableSignal \r\n} from '@angular/core';\r\n\r\nimport { take, tap } from 'rxjs';\r\nimport { MatDialog } from '@angular/material/dialog';\r\n\r\nimport { \r\n ColumnData, \r\n ColumnOptionsData, \r\n SofColumnOptionsComponent \r\n} from '../column-options-modal/column-options.component';\r\n\r\nimport {\r\n ApplyColumnStateParams,\r\n ColDef,\r\n ColumnState,\r\n FilterModel,\r\n GridApi,\r\n GridReadyEvent,\r\n PaginationChangedEvent,\r\n TextFilterModel\r\n} from \"ag-grid-community\";\r\n\r\n\r\n/** The Softheon Armature Table component */\r\n@Component({\r\n selector: 'sof-table',\r\n templateUrl: './sof-table.component.html',\r\n styleUrl: './sof-table.component.scss'\r\n})\r\nexport class SofTableComponent implements OnInit, OnChanges {\r\n\r\n /** The language text or a key that will be shown in this component */\r\n @Input() public rowData: Array<any> = [];\r\n\r\n /** Column Definitions: Defines & controls grid columns. */\r\n @Input() public colDefs: Array<ColDef> = [];\r\n\r\n /** Size modes for table */\r\n @Input() private sizeMode: 'Compact' | 'Roomy' | 'Default';\r\n\r\n /** Pages sizes */\r\n @Input() public paginationPageSizeSelector: Array<number> = [10, 20, 50, 100];\r\n\r\n /** Enable search */\r\n @Input() public enableSearch: boolean = true;\r\n\r\n /** Enable custom text filter dropdowns */\r\n @Input() public enableFilter: boolean = true;\r\n\r\n /** Enable Column options modal selection */\r\n @Input() public enableColumnOptions: boolean = true;\r\n\r\n /** \r\n * To display the text on the column options modal, which states -\r\n * `\"Options will be saved for the next time you log in.\"`\r\n * @default false\r\n * @description set to true if set-up for saving preferences to User data.\r\n * @note You can still save preferences to _local_ or _session_ storage\r\n * using the `savedColumnState` input, and `updatedColumnState` output event.\r\n * @see The Demo site is saving to local storage.\r\n */\r\n @Input() public showSaveColumnOptionsText: boolean = false;\r\n\r\n /** Name/label of the table */\r\n @Input() public tableName: string;\r\n\r\n /** Users saved column options state */\r\n @Input() private savedColumnState: ApplyColumnStateParams;\r\n\r\n /** Output updated column options event to save to user or browser storage */\r\n @Output() updatedColumnState: EventEmitter<ApplyColumnStateParams> = new EventEmitter();\r\n\r\n /** the search input */\r\n @ViewChild('gridSearchTextInput') gridSearchTextInput: ElementRef<HTMLInputElement>;\r\n\r\n /** Column names that should be filterable */\r\n public colFilters: Array<SofTableFilter> = [];\r\n\r\n /** Show filter */\r\n public showFilter: boolean = false;\r\n\r\n /** Row Height for table */\r\n public rowHeight: number = 48;\r\n\r\n /** Current Page Index */\r\n public currentPage: number = 0;\r\n\r\n /** Grid API */\r\n private gridApi!: GridApi;\r\n\r\n /** Is the table ready to be displayed */\r\n public isGridDataRendered: WritableSignal<boolean> = signal(false);\r\n\r\n /** Default Page Size */\r\n public paginationPageSize: number = 20; \r\n\r\n /** Tool tip show delay */\r\n public tooltipShowDelay: number = 500;\r\n\r\n /** Default Column Definition */\r\n public defaultColDef: ColDef = {\r\n resizable: false, // disable resize \r\n suppressHeaderMenuButton: true, // disable default filter menu \r\n suppressMovable: true, // disable default drag & drop for columns \r\n cellStyle: { justifyContent: \"center\" }\r\n };\r\n\r\n /** Length of data */\r\n public totalLength: number = 0;\r\n\r\n /**Total number of pages */\r\n public totalNumberOfPages: number;\r\n\r\n /** Page Change text */\r\n public pageChangeText: string;\r\n\r\n /** Page selector array */\r\n public pageSelector: Array<number> = [];\r\n\r\n /** Filter Panel open state */\r\n public filterOpenState: boolean;\r\n\r\n /** The list of filters and the selected values */\r\n public filterSelections: Array<Array<string>> = [];\r\n\r\n /** mat-dialog */\r\n private dialog: MatDialog = inject(MatDialog);\r\n\r\n /** On component init */\r\n public ngOnInit(): void {\r\n this.resizeGrid();\r\n }\r\n\r\n /**\r\n * Angular On Changes\r\n * @param changes The input changes\r\n */\r\n public ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.rowData && !changes.rowData.firstChange && !!this.gridApi) {\r\n this.totalLength = this.rowData.length;\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n }\r\n }\r\n\r\n /**\r\n * Called when the grid has ingested the input data\r\n * @param params Grid Ready Event,\r\n * The grid has initialized and is ready for most api calls, but may not be fully rendered yet.\r\n * @note you can not access this.gridApi before this function is run, \r\n * any attempts to access this.gridApi in this components ngOnInit or the first ngOnChanges cycle\r\n * will result in a type error; being this.gridApi is undefined at that time.\r\n */\r\n public onGridReady(params: GridReadyEvent) {\r\n this.gridApi = params.api;\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n window.onresize = () => {\r\n const mobileWidthThreshold = 752;\r\n if (window.innerWidth <= mobileWidthThreshold) {\r\n this.rowHeight = 40;\r\n this.paginationPageSize = 10;\r\n }\r\n else {\r\n this.resizeGrid();\r\n }\r\n this.handlePageChangeText();\r\n }\r\n // Now that we have the column definitions, populate the filters\r\n this.populateFilters();\r\n this.handlePageChangeText();\r\n if (!this.rowData.length) {\r\n this.isGridDataRendered.set(true);\r\n }\r\n }\r\n\r\n /** Fired the first time data is rendered into the grid. */\r\n public onFirstDataRendered() {\r\n if (!this.savedColumnState?.state.length) {\r\n const columnState: Array<ColumnState> = structuredClone(this.gridApi.getColumnState());\r\n this.savedColumnState = {\r\n state: columnState,\r\n applyOrder: true\r\n };\r\n }\r\n this.gridApi.applyColumnState(this.savedColumnState);\r\n this.updatedColumnState.emit(this.savedColumnState);\r\n this.isGridDataRendered.set(true);\r\n }\r\n\r\n /** Resize grid from size mode */\r\n private resizeGrid(): void {\r\n if (this.sizeMode === 'Compact') {\r\n this.rowHeight = 40;\r\n }\r\n else if (this.sizeMode === 'Roomy') {\r\n this.rowHeight = 56;\r\n }\r\n else {\r\n this.rowHeight = 48;\r\n }\r\n }\r\n\r\n /**\r\n * On page selection change\r\n * @param value The selected page number\r\n */\r\n public onPageNumberChange(value: number): void {\r\n // The page values are 1 off to make a 1-based array, but the actual pages are a 0-based array.\r\n this.gridApi.paginationGoToPage(value - 1);\r\n }\r\n\r\n /** On next page event */\r\n public nextPage() {\r\n this.gridApi.paginationGoToNextPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /** On Previous Page Event */\r\n public previousPage() {\r\n this.gridApi.paginationGoToPreviousPage();\r\n this.handlePageChangeText()\r\n this.currentPage = this.gridApi.paginationGetCurrentPage() + 1;\r\n }\r\n\r\n /**\r\n * On Change Page Size Event\r\n * @param event The pagination event\r\n */\r\n public changePageSize(event: PaginationChangedEvent) {\r\n // Only need to do this work if the page size has changed.\r\n if (event.newPageSize) {\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n // Handle text changes\r\n this.handlePageChangeText();\r\n }\r\n }\r\n\r\n /** Called when the grid filter is changed */\r\n public onFilterChanged(): void {\r\n // TODO update the filter dropdown options based on the filtered data set, instead of the complete data set.\r\n // Update the total number of filtered rows.\r\n this.totalLength = this.gridApi.paginationGetRowCount();\r\n // Handle text changes\r\n this.handlePageChangeText();\r\n }\r\n\r\n /** Generated text for showing pages in format: 1-11 of 11 */\r\n private handlePageChangeText(): void {\r\n // Handle empty table\r\n if (!this.totalLength || this.paginationPageSize === 0) {\r\n // Reset the pagination UI\r\n this.totalNumberOfPages = 1;\r\n this.pageSelector = [1];\r\n this.pageChangeText = `0`;\r\n this.gridApi.showNoRowsOverlay();\r\n return;\r\n } else {\r\n this.gridApi.hideOverlay();\r\n }\r\n // Update the total number of pages\r\n this.totalNumberOfPages = this.gridApi.paginationGetTotalPages() || Math.ceil(this.totalLength / this.paginationPageSize) || 1;\r\n // Reset the page selector\r\n this.currentPage = 1;\r\n const pageSelector = [];\r\n for (let i = 1; i <= this.totalNumberOfPages; i++) {\r\n pageSelector.push(i);\r\n }\r\n this.pageSelector = pageSelector;\r\n const length = Math.max(this.totalLength, 0);\r\n const pageSize = this.paginationPageSize;\r\n const startIndex = this.gridApi.paginationGetCurrentPage() * pageSize;\r\n const endIndex = startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize;\r\n this.pageChangeText = `${startIndex + 1} - ${endIndex}`;\r\n }\r\n\r\n /**\r\n * Apply the search filter on data when search text changed\r\n */\r\n public onSearchTextChanged(): void {\r\n this.gridApi.setGridOption(\"quickFilterText\", this.gridSearchTextInput.nativeElement.value);\r\n }\r\n\r\n /** Toggle the filter panel display */\r\n public toggleFilterPanel(): void {\r\n this.filterOpenState = !this.filterOpenState;\r\n }\r\n\r\n /** Apply the selected filters */\r\n public applyFilters(): void {\r\n let tableFilterModel: FilterModel = {};\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n const colFilter = this.colFilters[i];\r\n const selectedElements = this.filterSelections[i];\r\n if (!selectedElements.length) {\r\n // Reset out the column filters\r\n this.gridApi.setColumnFilterModel(colFilter.header, null);\r\n tableFilterModel[colFilter.header] = null;\r\n }\r\n else if (selectedElements.length == 1) {\r\n // Set the single filter for the column\r\n let filterModel: TextFilterModel = { filterType: 'text', type: 'equals', filter: selectedElements[0] };\r\n // Apply the filter model to the column\r\n tableFilterModel[colFilter.header] = filterModel;\r\n }\r\n else {\r\n // Set multiple OR filters for the column\r\n let filterModels: CombinedSimpleModel<TextFilterModel> = { filterType: 'text', operator: 'OR', conditions: [] };\r\n // Set the selected elements in the model\r\n for (const selectedElement of selectedElements) {\r\n filterModels.conditions.push({ filterType: 'text', type: 'equals', filter: selectedElement });\r\n }\r\n // Apply the filter model collection to the column\r\n tableFilterModel[colFilter.header] = filterModels;\r\n }\r\n }\r\n // Once everything is set, update the filters\r\n this.gridApi.setFilterModel(tableFilterModel);\r\n this.gridApi.onFilterChanged();\r\n }\r\n\r\n /** Clear all filters */\r\n public clearFilters(): void {\r\n // Clear all selections\r\n for (let i = 0; i < this.filterSelections.length; i++) {\r\n this.filterSelections[i] = [];\r\n }\r\n // Set the full grid filter model to null\r\n this.gridApi.setFilterModel(null);\r\n // Update the display\r\n this.gridApi.onFilterChanged();\r\n }\r\n\r\n /**\r\n * Returns true if no filters are selected\r\n * @returns True if a filter is selected, false otherwise.\r\n */\r\n public hasEmptyFilters(): boolean {\r\n if (!this.filterSelections || !this.filterSelections.length) {\r\n return true;\r\n }\r\n for (const filterSelect of this.filterSelections) {\r\n // If at least one filter has been selected, return false\r\n if (filterSelect.length) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** Cancel the changes to the filter and closes the filter panel */\r\n public cancelFilterChanges(): void {\r\n for (let i = 0; i < this.colFilters.length; i++) {\r\n // Get the stored filters for the given model\r\n const colFilter = this.colFilters[i];\r\n const model = this.gridApi.getColumnFilterModel(colFilter.header);\r\n let filterSelectionData = [];\r\n if (model && model[\"conditions\"]) {\r\n // The model is a combined model with multiple selections\r\n const filterModel = model as CombinedSimpleModel<TextFilterModel>;\r\n for (const element of filterModel.conditions) {\r\n filterSelectionData.push(element.filter);\r\n }\r\n }\r\n else if (model) {\r\n // Assume the model is a single Text Filter Model\r\n let filterSelection: TextFilterModel = model;\r\n filterSelectionData.push(filterSelection.filter);\r\n }\r\n // Set the filter selections\r\n this.filterSelections[i] = filterSelectionData;\r\n }\r\n // Close the filter panel\r\n this.toggleFilterPanel();\r\n }\r\n\r\n /** Populates the filter dropdowns */\r\n private populateFilters(): void {\r\n // Reset the filter dropdowns\r\n this.filterSelections = [];\r\n this.colFilters = [];\r\n // Get the column definitions\r\n let colDefs = this.gridApi.getColumnDefs();\r\n for (const def of colDefs) {\r\n // Determine if a filter exists for this column\r\n if (def[\"filter\"]) {\r\n // Ensure there are enough filter selection arrays\r\n this.filterSelections.push([]);\r\n // If at least one filter is present and we are not using native filter, show the custom filter button.\r\n this.showFilter = this.enableFilter;\r\n const headerName = def[\"field\"];\r\n const label = def[\"headerName\"];\r\n // Set filter options, if present\r\n let uniqueFilterValues = [];\r\n // Get data from the input stream. This allows more direct data population for the filters.\r\n for (const row of this.rowData) {\r\n // Get the value as a string\r\n const stringValue = row[headerName];\r\n // Check if value exists, and if it is not already noted in the array\r\n if (stringValue && !uniqueFilterValues.includes(stringValue)) {\r\n // Add the node value\r\n uniqueFilterValues.push(stringValue);\r\n }\r\n }\r\n uniqueFilterValues = uniqueFilterValues.sort();\r\n // Add to the column filters dropdowns\r\n this.colFilters.push({ header: headerName, label: label, options: uniqueFilterValues });\r\n }\r\n }\r\n }\r\n\r\n /** Open the column options modal */\r\n public openColumnOptions(): void {\r\n const columnState: Array<ColumnState> = this.gridApi.getColumnState();\r\n const columnData: Array<ColumnData> = this.columnStateToData(columnState);\r\n const initialColumnData: Array<ColumnData> = this.columnStateToData(this.savedColumnState.state);\r\n const columnOptionsData: ColumnOptionsData = {\r\n tableName: this.tableName,\r\n columnData,\r\n initialColumnData,\r\n showSaveColumnOptionsText: this.showSaveColumnOptionsText\r\n };\r\n const dialogRef = this.dialog.open(SofColumnOptionsComponent, {\r\n width: '500px',\r\n position: { bottom: '40px', right: '40px' },\r\n ariaLabelledBy: 'column-options-heading',\r\n data: columnOptionsData\r\n });\r\n dialogRef.afterClosed().pipe(\r\n take(1),\r\n tap((updatedColumnState: ApplyColumnStateParams) => {\r\n if (updatedColumnState && updatedColumnState.state.length) {\r\n this.gridApi.applyColumnState(updatedColumnState);\r\n this.updatedColumnState.emit(updatedColumnState);\r\n }\r\n })\r\n ).subscribe();\r\n }\r\n\r\n /**\r\n * Maps `Array<ColumnState>` to `Array<ColumnData>` \r\n * @note filters out any columns marked as 'pinned' by the column definitions.\r\n * @note filters any columns without a 'headerName'.\r\n * @param columnState the column state to modify\r\n * @returns an array of column data formatted to be ingested by the `SofColumnOptionsComponent`\r\n */\r\n private columnStateToData(columnState: Array<ColumnState>): Array<ColumnData> {\r\n return columnState\r\n .filter((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId)?.headerName || \"\";\r\n if (headerName && headerName.length && !column.pinned) {\r\n return column;\r\n }\r\n })\r\n .map((column) => {\r\n const headerName: string = this.gridApi.getColumnDef(column.colId).headerName;\r\n return {\r\n id: column.colId,\r\n isChecked: !column.hide,\r\n text: headerName\r\n };\r\n }\r\n );\r\n }\r\n}\r\n\r\n/** Used for setting filter values */\r\nclass SofTableFilter {\r\n /** The column header */\r\n header: string;\r\n /** The column label or translation key */\r\n label: string;\r\n /** The column filter options */\r\n options: string[] = [];\r\n}\r\n\r\n/** A filter combining multiple conditions, taken from AgGrid*/\r\nclass CombinedSimpleModel<T> {\r\n /** The filter type. Usually 'text' */\r\n filterType: string;\r\n /** The operator. Usually 'OR' */\r\n operator: 'AND' | 'OR';\r\n /** multiple instances of the Filter Model */\r\n conditions: T[];\r\n}\r\n","<div \r\n [fxShow]=\"isGridDataRendered()\"\r\n fxLayoutGap=\"16px\" m-b-24>\r\n @if (enableFilter && showFilter) {\r\n <button \r\n (click)=\"toggleFilterPanel()\" \r\n mat-flat-button class=\"sof-button-v2\"\r\n [class.filter-selected]=\"filterOpenState\" \r\n id=\"btn-enable-filter\" color=\"secondary\" size=\"small\">\r\n <i class=\"ph ph-bold ph-sliders-horizontal\"></i>\r\n {{'armature.sof-table.filter' | translate}}\r\n </button>\r\n }\r\n @if (enableSearch) {\r\n <mat-form-field class=\"sof-form-field table-search-field dense-4\" fxFlex=\"auto\">\r\n <span matPrefix>\r\n <i class=\"ph-bold ph-magnifying-glass search-icon\" aria-hidden=\"true\"></i>\r\n </span>\r\n <mat-label class=\"search-label\">{{'armature.sof-table.search' | translate}}</mat-label>\r\n <input \r\n (input)=\"onSearchTextChanged()\" #gridSearchTextInput matInput type=\"text\" id=\"gridSearchTextInput\"\r\n [attr.aria-label]=\"'armature.sof-table.search' | translate\"/>\r\n </mat-form-field>\r\n }\r\n @if (enableColumnOptions) {\r\n <button \r\n (click)=\"openColumnOptions()\"\r\n mat-flat-button class=\"soft-button-icon-v2\" \r\n color=\"secondary\" size=\"small\">\r\n <i class=\"ph-bold ph-pause\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n <ng-content select=\"[sof-table-right-buttons]\"></ng-content>\r\n <!-- \r\n Only inject <button>'s inside an <ng-container sof-table-right-buttons>.\r\n ex: for broker this would be the 'export table' button,\r\n ... \r\n <ng-container sof-table-right-buttons>\r\n <button mat-flat-button class=\"soft-button-icon-v2\" color=\"secondary\" size=\"small\">\r\n <i class=\"ph-bold ph-export\"></i>\r\n </button>\r\n </ng-container>\r\n ... \r\n note: make sure buttons have the following attributes to match others =\r\n `mat-flat-button class=\"soft-button-icon-v2\" color=\"secondary\" size=\"small\"`\r\n -->\r\n</div>\r\n\r\n@if (filterOpenState) {\r\n <fieldset class=\"filter-panel\">\r\n <p>\r\n <i class=\"ph ph-bold ph-sliders-horizontal\" aria-hidden=\"true\"></i>\r\n <span class=\"m-l-8\">{{'armature.sof-table.filter' | translate}}</span>\r\n </p>\r\n <div class=\"filter-panel-select-container m-t-20\">\r\n @for (colFilter of colFilters; let i = $index; track i) {\r\n <mat-form-field appearance=\"outline\" class=\"sof-form-field\">\r\n <mat-label>{{colFilter.label | translate}}</mat-label>\r\n <mat-select \r\n [(ngModel)]=\"filterSelections[i]\" \r\n multiple \r\n id=\"filterDropdown{{i}}\"\r\n placeholder=\"{{'armature.sof-table.all' | translate}}\" disableRipple=\"true\">\r\n @for (colOption of colFilter.options; track $index) {\r\n <mat-option [value]=\"colOption\">\r\n {{colOption}}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div fxLayout=\"row\">\r\n <div fxFlex=\"50%\">\r\n <button \r\n (click)=\"clearFilters()\" [disabled]=\"hasEmptyFilters()\" \r\n mat-button class=\"sof-button-v2\" size=\"medium\"\r\n id=\"tableFilterClear\" color=\"tertiary\">\r\n {{'armature.sof-table.reset' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"50%\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"2%\" fxLayoutAlign=\"flex-end\">\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"cancelFilterChanges()\" mat-button class=\"sof-button-v2\" \r\n size=\"medium\" id=\"tableFilterCancel\" color=\"tertiary\">\r\n {{'armature.sof-table.cancel' | translate}}\r\n </button>\r\n </div>\r\n <div fxFlex=\"0 1 auto\">\r\n <button \r\n (click)=\"applyFilters()\" mat-flat-button class=\"sof-button-v2\"\r\n size=\"medium\" id=\"tableFilterApply\" color=\"primary\">\r\n {{'armature.sof-table.results' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </fieldset>\r\n}\r\n\r\n<ag-grid-angular \r\n [fxShow]=\"isGridDataRendered()\"\r\n (gridReady)=\"onGridReady($event)\" \r\n (firstDataRendered)=\"onFirstDataRendered()\"\r\n (filterChanged)=\"onFilterChanged()\"\r\n (paginationChanged)=\"changePageSize($event)\" \r\n [rowData]=\"rowData\" \r\n [columnDefs]=\"colDefs\" \r\n [defaultColDef]=\"defaultColDef\" \r\n [pagination]=\"true\" \r\n [suppressPaginationPanel]=\"true\"\r\n [paginationPageSizeSelector]=\"paginationPageSizeSelector\" \r\n [paginationPageSize]=\"paginationPageSize\"\r\n [headerHeight]=\"rowHeight\" \r\n [rowHeight]=\"rowHeight\" \r\n [domLayout]=\"'autoHeight'\" \r\n [tooltipShowDelay]=\"tooltipShowDelay\"\r\n [overlayNoRowsTemplate]=\"('armature.sof-table.no-rows' | translate) || 'No results found.'\"\r\n [class.no-rows]=\"!totalLength\"\r\n class=\"ag-theme-material\">\r\n</ag-grid-angular>\r\n\r\n<div \r\n [fxShow]=\"isGridDataRendered()\"\r\n class=\"custom-paginator\">\r\n <div class=\"first-section\">\r\n <button class=\"button-part-1\" type=\"button\">\r\n <mat-select \r\n #pageSizeSelect\r\n id=\"pageSizeInput\" name=\"pageSizeInput\" \r\n [(value)]=\"paginationPageSize\" disableRipple=\"true\">\r\n @for (size of paginationPageSizeSelector; let i = $index; track i) {\r\n <mat-option \r\n class=\"page-option\" id=\"size{{i}}\"\r\n [value]=\"paginationPageSizeSelector[i]\">\r\n {{size}}\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{paginationPageSize}}</span>\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageSizeSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n </button>\r\n <span class=\"pageChangeText\">\r\n {{pageChangeText}} {{'armature.sof-table.of' | translate}} {{totalLength}}\r\n </span>\r\n </div>\r\n <div class=\"go-to-page\">\r\n <div class=\"outer-box\">\r\n <button class=\"button-part\" type=\"button\">\r\n <mat-select \r\n #pageNumberSelect\r\n (selectionChange)=\"onPageNumberChange($event.value)\"\r\n [(value)]=\"currentPage\" \r\n id=\"pageSelelctor\" name=\"pageSelector\" disableRipple=\"true\">\r\n @for (page of pageSelector; track $index) {\r\n <mat-option [value]=\"page\" class=\"page-option\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{page}}</span>\r\n </span>\r\n </mat-option>\r\n }\r\n <mat-select-trigger>\r\n <div class=\"field\">\r\n <span class=\"current-page\">\r\n <span class=\"page\">{{currentPage}}</span>\r\n <span class=\"of-page\"> {{'armature.sof-table.of' | translate}} {{totalNumberOfPages}} </span>\r\n </span>\r\n <span class=\"select-icon\">\r\n <i [class]=\"'ph-bold ph-caret-' + (pageNumberSelect.panelOpen ? 'up':'down')\" aria-hidden=\"true\"></i>\r\n </span>\r\n </div>\r\n </mat-select-trigger>\r\n </mat-select>\r\n </button>\r\n </div>\r\n <nav class=\"second-section\">\r\n <button \r\n (click)=\"previousPage()\"\r\n id=\"prev-button\" mat-flat-button class=\"soft-button-icon-v2\" color=\"secondary\" size=\"small\"\r\n [disabled]=\"currentPage === 1\" \r\n [attr.aria-label]=\"'screen-reader.pagination.previous' | translate\">\r\n <i class=\"ph-bold ph-caret-left\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button \r\n (click)=\"nextPage()\" \r\n id=\"next-button\" mat-flat-button class=\"soft-button-icon-v2\" color=\"secondary\" size=\"small\"\r\n [disabled]=\"currentPage === totalNumberOfPages\"\r\n [attr.aria-label]=\"'screen-reader.pagination.next' | translate\">\r\n <i class=\"ph-bold ph-caret-right\" aria-hidden=\"true\"></i>\r\n </button>\r\n </nav>\r\n </div>\r\n</div>\r\n\r\n@if (!isGridDataRendered()) {\r\n <div class=\"loading-container\">\r\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\r\n </div>\r\n}\r\n","import { Component, Input } from '@angular/core';\r\n\r\n/** The Softheon Armature Table Cell component */\r\n@Component({\r\n selector: 'sof-table-cell',\r\n templateUrl: './table-cell.component.html',\r\n styleUrl: './table-cell.component.scss'\r\n})\r\nexport class SofTableCellComponent {\r\n\r\n /** All Components for Table Cell */\r\n @Input() public components: TableCellComponent[] = [];\r\n\r\n /** Any logic related to ag grid cell renderer data can be added here */\r\n public agInit(params): void {\r\n this.components = params['components'];\r\n }\r\n}\r\n\r\n/** Components to Render in Table Cell */\r\ninterface TableCellComponent {\r\n /** Component Class */\r\n component: any,\r\n /** Inputs needed for specific component */\r\n inputs: any\r\n}\r\n","<div class=\"table-cell\">\r\n <ng-container *ngFor=\"let currentComponent of components\">\r\n <ng-container *ngComponentOutlet=\"currentComponent.component; \r\n inputs:currentComponent.inputs;\r\n \">\r\n </ng-container>\r\n </ng-container>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatOptionModule } from '@angular/material/core';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { AgGridModule } from 'ag-grid-angular';\r\nimport { SofTableComponent } from './sof-table/sof-table.component';\r\nimport { SofTableCellComponent } from './table-cell/table-cell.component';\r\nimport { SofColumnOptionsComponent } from './column-options-modal/column-options.component';\r\nimport { BaseComponentModule } from '@softheon/armature';\r\n\r\n\r\n/** The material modules */\r\nconst materialModules = [\r\n MatSelectModule,\r\n MatOptionModule,\r\n MatCheckboxModule,\r\n MatIconModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatRadioModule,\r\n MatProgressSpinnerModule\r\n];\r\n\r\n@NgModule({\r\n declarations: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n FlexLayoutModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslateModule,\r\n AgGridModule,\r\n ...materialModules,\r\n BaseComponentModule\r\n ],\r\n exports: [\r\n SofTableComponent,\r\n SofTableCellComponent,\r\n SofColumnOptionsComponent\r\n ]\r\n})\r\nexport class AgGridComponentsModule { }\r\n","/** Public API Surface of Ag Grid components */\r\nexport * from './src/ag-grid-components.module';\r\nexport * from './src/sof-table/sof-table.component';\r\nexport * from './src/table-cell/table-cell.component';\r\nexport * from './src/column-options-modal/column-options.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4","i8","i11"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;MAMa,yBAAyB,CAAA;AALtC,IAAA,WAAA,GAAA;;AAQU,QAAA,IAAA,CAAA,SAAS,GAA4C,MAAM,EAAC,YAAuC,EAAC,CAAC;;AAGtG,QAAA,IAAA,CAAA,IAAI,GAAsB,MAAM,CAAC,eAAe,CAAC,CAAC;AAqB1D,KAAA;;IAlBQ,uBAAuB,GAAA;AAC5B,QAAA,MAAM,WAAW,GAAuB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;YAC1E,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,EAAE;AAChB,gBAAA,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS;aACxB,CAAA;AACH,SAAC,CAAC,CAAC;AACH,QAAA,MAAM,kBAAkB,GAA2B;AACjD,YAAA,KAAK,EAAE,CAAC,GAAG,WAAW,CAAC;AACvB,YAAA,UAAU,EAAE,IAAI;SACjB,CAAC;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;KAC1C;;IAGM,eAAe,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;KACrE;8GA1BU,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,0DCVtC,mxDA2CA,EAAA,MAAA,EAAA,CAAA,22BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,kBAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,YAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FDjCa,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBALrC,SAAS;+BACE,oBAAoB,EAAA,QAAA,EAAA,mxDAAA,EAAA,MAAA,EAAA,CAAA,22BAAA,CAAA,EAAA,CAAA;;;AE8BhC;MAMa,iBAAiB,CAAA;AAL9B,IAAA,WAAA,GAAA;;QAQkB,IAAO,CAAA,OAAA,GAAe,EAAE,CAAC;;QAGzB,IAAO,CAAA,OAAA,GAAkB,EAAE,CAAC;;QAM5B,IAA0B,CAAA,0BAAA,GAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;;QAG9D,IAAY,CAAA,YAAA,GAAY,IAAI,CAAC;;QAG7B,IAAY,CAAA,YAAA,GAAY,IAAI,CAAC;;QAG7B,IAAmB,CAAA,mBAAA,GAAY,IAAI,CAAC;AAEpD;;;;;;;;AAQE;QACc,IAAyB,CAAA,yBAAA,GAAY,KAAK,CAAC;;AASjD,QAAA,IAAA,CAAA,kBAAkB,GAAyC,IAAI,YAAY,EAAE,CAAC;;QAMjF,IAAU,CAAA,UAAA,GAA0B,EAAE,CAAC;;QAGvC,IAAU,CAAA,UAAA,GAAY,KAAK,CAAC;;QAG5B,IAAS,CAAA,SAAA,GAAW,EAAE,CAAC;;QAGvB,IAAW,CAAA,WAAA,GAAW,CAAC,CAAC;;AAMxB,QAAA,IAAA,CAAA,kBAAkB,GAA4B,MAAM,CAAC,KAAK,CAAC,CAAC;;QAG5D,IAAkB,CAAA,kBAAA,GAAW,EAAE,CAAC;;QAGhC,IAAgB,CAAA,gBAAA,GAAW,GAAG,CAAC;;AAG/B,QAAA,IAAA,CAAA,aAAa,GAAW;AAC7B,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,wBAAwB,EAAE,IAAI;AAC9B,YAAA,eAAe,EAAE,IAAI;AACrB,YAAA,SAAS,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE;SACxC,CAAC;;QAGK,IAAW,CAAA,WAAA,GAAW,CAAC,CAAC;;QASxB,IAAY,CAAA,YAAA,GAAkB,EAAE,CAAC;;QAMjC,IAAgB,CAAA,gBAAA,GAAyB,EAAE,CAAC;;AAG3C,QAAA,IAAA,CAAA,MAAM,GAAc,MAAM,CAAC,SAAS,CAAC,CAAC;AAoV/C,KAAA;;IAjVQ,QAAQ,GAAA;QACb,IAAI,CAAC,UAAU,EAAE,CAAC;KACnB;AAED;;;AAGG;AACI,IAAA,WAAW,CAAC,OAAsB,EAAA;AACvC,QAAA,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE;YACrE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACvC,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC7B,SAAA;KACF;AAED;;;;;;;AAOG;AACI,IAAA,WAAW,CAAC,MAAsB,EAAA;AACvC,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;AACxD,QAAA,MAAM,CAAC,QAAQ,GAAG,MAAK;YACrB,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,YAAA,IAAI,MAAM,CAAC,UAAU,IAAI,oBAAoB,EAAE;AAC7C,gBAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,gBAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;AAC9B,aAAA;AACI,iBAAA;gBACH,IAAI,CAAC,UAAU,EAAE,CAAC;AACnB,aAAA;YACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC9B,SAAC,CAAA;;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AACxB,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACnC,SAAA;KACF;;IAGM,mBAAmB,GAAA;QACxB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,MAAM,EAAE;YACxC,MAAM,WAAW,GAAuB,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;YACvF,IAAI,CAAC,gBAAgB,GAAG;AACtB,gBAAA,KAAK,EAAE,WAAW;AAClB,gBAAA,UAAU,EAAE,IAAI;aACjB,CAAC;AACH,SAAA;QACD,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACrD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KACnC;;IAGO,UAAU,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;AAC/B,YAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACrB,SAAA;AACI,aAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE;AAClC,YAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACrB,SAAA;AACI,aAAA;AACH,YAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACrB,SAAA;KACF;AAED;;;AAGG;AACI,IAAA,kBAAkB,CAAC,KAAa,EAAA;;QAErC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;KAC5C;;IAGM,QAAQ,GAAA;AACb,QAAA,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC;QACtC,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;KAChE;;IAGM,YAAY,GAAA;AACjB,QAAA,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC;QAC1C,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;KAChE;AAED;;;AAGG;AACI,IAAA,cAAc,CAAC,KAA6B,EAAA;;QAEjD,IAAI,KAAK,CAAC,WAAW,EAAE;;YAErB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;;YAExD,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC7B,SAAA;KACF;;IAGM,eAAe,GAAA;;;QAGpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;;QAExD,IAAI,CAAC,oBAAoB,EAAE,CAAC;KAC7B;;IAGO,oBAAoB,GAAA;;QAE1B,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAAC,EAAE;;AAEtD,YAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;AAC5B,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;AACxB,YAAA,IAAI,CAAC,cAAc,GAAG,CAAA,CAAA,CAAG,CAAC;AAC1B,YAAA,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACjC,OAAO;AACR,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;AAC5B,SAAA;;QAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;;AAE/H,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE;AACjD,YAAA,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACtB,SAAA;AACD,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;AACjC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC7C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,GAAG,QAAQ,CAAC;QACtE,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,QAAQ,EAAE,MAAM,CAAC,GAAG,UAAU,GAAG,QAAQ,CAAC;QACvG,IAAI,CAAC,cAAc,GAAG,CAAG,EAAA,UAAU,GAAG,CAAC,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAE,CAAC;KACzD;AAED;;AAEG;IACI,mBAAmB,GAAA;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;KAC7F;;IAGM,iBAAiB,GAAA;AACtB,QAAA,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;KAC9C;;IAGM,YAAY,GAAA;QACjB,IAAI,gBAAgB,GAAgB,EAAE,CAAC;AACvC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAClD,YAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE;;gBAE5B,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC1D,gBAAA,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAC3C,aAAA;AACI,iBAAA,IAAI,gBAAgB,CAAC,MAAM,IAAI,CAAC,EAAE;;AAErC,gBAAA,IAAI,WAAW,GAAoB,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;;AAEvG,gBAAA,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC;AAClD,aAAA;AACI,iBAAA;;AAEH,gBAAA,IAAI,YAAY,GAAyC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;;AAEhH,gBAAA,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE;AAC9C,oBAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;AAC/F,iBAAA;;AAED,gBAAA,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC;AACnD,aAAA;AACF,SAAA;;AAED,QAAA,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AAC9C,QAAA,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;KAChC;;IAGM,YAAY,GAAA;;AAEjB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrD,YAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC/B,SAAA;;AAED,QAAA,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;;AAElC,QAAA,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;KAChC;AAED;;;AAGG;IACI,eAAe,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE;AAC3D,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AACD,QAAA,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,gBAAgB,EAAE;;YAEhD,IAAI,YAAY,CAAC,MAAM,EAAE;AACvB,gBAAA,OAAO,KAAK,CAAC;AACd,aAAA;AACF,SAAA;AACD,QAAA,OAAO,IAAI,CAAC;KACb;;IAGM,mBAAmB,GAAA;AACxB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;;YAE/C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACrC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAClE,IAAI,mBAAmB,GAAG,EAAE,CAAC;AAC7B,YAAA,IAAI,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC,EAAE;;gBAEhC,MAAM,WAAW,GAAG,KAA6C,CAAC;AAClE,gBAAA,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,UAAU,EAAE;AAC5C,oBAAA,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC1C,iBAAA;AACF,aAAA;AACI,iBAAA,IAAI,KAAK,EAAE;;gBAEd,IAAI,eAAe,GAAoB,KAAK,CAAC;AAC7C,gBAAA,mBAAmB,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;AAClD,aAAA;;AAED,YAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC;AAChD,SAAA;;QAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC1B;;IAGO,eAAe,GAAA;;AAErB,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;;QAErB,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;AAC3C,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;;AAEzB,YAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE;;AAEjB,gBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;AAE/B,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC;AACpC,gBAAA,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;AAChC,gBAAA,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;;gBAEhC,IAAI,kBAAkB,GAAG,EAAE,CAAC;;AAE5B,gBAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE;;AAE9B,oBAAA,MAAM,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;;oBAEpC,IAAI,WAAW,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;;AAE5D,wBAAA,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACtC,qBAAA;AACF,iBAAA;AACD,gBAAA,kBAAkB,GAAG,kBAAkB,CAAC,IAAI,EAAE,CAAC;;AAE/C,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;AACzF,aAAA;AACF,SAAA;KACF;;IAGM,iBAAiB,GAAA;QACtB,MAAM,WAAW,GAAuB,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QACtE,MAAM,UAAU,GAAsB,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;AAC1E,QAAA,MAAM,iBAAiB,GAAsB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACjG,QAAA,MAAM,iBAAiB,GAAsB;YAC3C,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU;YACV,iBAAiB;YACjB,yBAAyB,EAAE,IAAI,CAAC,yBAAyB;SAC1D,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;AAC5D,YAAA,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;AAC3C,YAAA,cAAc,EAAE,wBAAwB;AACxC,YAAA,IAAI,EAAE,iBAAiB;AACxB,SAAA,CAAC,CAAC;AACH,QAAA,SAAS,CAAC,WAAW,EAAE,CAAC,IAAI,CAC1B,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,CAAC,kBAA0C,KAAI;AACjD,YAAA,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE;AACzD,gBAAA,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;AAClD,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAClD,aAAA;AACH,SAAC,CAAC,CACH,CAAC,SAAS,EAAE,CAAC;KACf;AAED;;;;;;AAME;AACM,IAAA,iBAAiB,CAAC,WAA+B,EAAA;AACvD,QAAA,OAAO,WAAW;AACf,aAAA,MAAM,CAAC,CAAC,MAAM,KAAI;AACjB,YAAA,MAAM,UAAU,GAAW,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;YACrF,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AACrD,gBAAA,OAAO,MAAM,CAAC;AACf,aAAA;AACH,SAAC,CAAC;AACD,aAAA,GAAG,CAAC,CAAC,MAAM,KAAI;AACd,YAAA,MAAM,UAAU,GAAW,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;YAC9E,OAAO;gBACL,EAAE,EAAE,MAAM,CAAC,KAAK;AAChB,gBAAA,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI;AACvB,gBAAA,IAAI,EAAE,UAAU;aACjB,CAAC;AACJ,SAAC,CACF,CAAC;KACH;8GApbU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,2lBC1C9B,khRAkNA,EAAA,MAAA,EAAA,CAAA,k9uDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,4OAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,sRAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,kTAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,gNAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,+bAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,6BAAA,EAAA,gCAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,wBAAA,EAAA,6BAAA,EAAA,oBAAA,EAAA,6BAAA,EAAA,8BAAA,EAAA,8BAAA,EAAA,wBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,YAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,0BAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,uBAAA,EAAA,mBAAA,EAAA,wBAAA,EAAA,+BAAA,EAAA,wBAAA,EAAA,6BAAA,EAAA,+BAAA,EAAA,8BAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,+BAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,0BAAA,EAAA,mCAAA,EAAA,8BAAA,EAAA,qBAAA,EAAA,0BAAA,EAAA,wBAAA,EAAA,mBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,qCAAA,EAAA,mCAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,kCAAA,EAAA,sCAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,sCAAA,EAAA,sBAAA,EAAA,6BAAA,EAAA,4BAAA,EAAA,cAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,6BAAA,EAAA,+BAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,0BAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,uBAAA,EAAA,2BAAA,EAAA,eAAA,EAAA,2BAAA,EAAA,qBAAA,EAAA,+BAAA,EAAA,4BAAA,EAAA,yBAAA,EAAA,OAAA,EAAA,wBAAA,EAAA,yBAAA,EAAA,+BAAA,EAAA,wBAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,8BAAA,EAAA,uBAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,4BAAA,EAAA,wBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,0BAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,+BAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,4BAAA,EAAA,wBAAA,EAAA,6BAAA,EAAA,yBAAA,EAAA,2CAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,4BAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,8BAAA,EAAA,mCAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,6BAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,6BAAA,EAAA,oBAAA,EAAA,gCAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,yBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,2BAAA,EAAA,iCAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,wBAAA,EAAA,uCAAA,EAAA,UAAA,EAAA,2BAAA,EAAA,yBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,SAAA,EAAA,4BAAA,EAAA,2CAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,kCAAA,EAAA,uCAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,iCAAA,EAAA,yBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,yBAAA,EAAA,gCAAA,EAAA,qCAAA,EAAA,2BAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,qCAAA,EAAA,oBAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,4BAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,yBAAA,EAAA,iCAAA,EAAA,wBAAA,EAAA,4BAAA,EAAA,oCAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,yBAAA,EAAA,wBAAA,EAAA,2BAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,6BAAA,EAAA,yBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,8BAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,+BAAA,EAAA,OAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,eAAA,EAAA,2BAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,wBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,gCAAA,EAAA,0BAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,yBAAA,EAAA,wBAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,aAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,6BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,aAAA,EAAA,eAAA,EAAA,+BAAA,EAAA,gCAAA,EAAA,8BAAA,EAAA,mBAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,EAAA,aAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,yBAAA,EAAA,sBAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,UAAA,EAAA,QAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,cAAA,EAAA,eAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,wBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,cAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,qCAAA,EAAA,cAAA,EAAA,4BAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,eAAA,EAAA,aAAA,EAAA,aAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,cAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,0BAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,cAAA,EAAA,eAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,6BAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,4BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FDxKa,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAL7B,SAAS;+BACE,WAAW,EAAA,QAAA,EAAA,khRAAA,EAAA,MAAA,EAAA,CAAA,k9uDAAA,CAAA,EAAA,CAAA;8BAOL,OAAO,EAAA,CAAA;sBAAtB,KAAK;gBAGU,OAAO,EAAA,CAAA;sBAAtB,KAAK;gBAGW,QAAQ,EAAA,CAAA;sBAAxB,KAAK;gBAGU,0BAA0B,EAAA,CAAA;sBAAzC,KAAK;gBAGU,YAAY,EAAA,CAAA;sBAA3B,KAAK;gBAGU,YAAY,EAAA,CAAA;sBAA3B,KAAK;gBAGU,mBAAmB,EAAA,CAAA;sBAAlC,KAAK;gBAWU,yBAAyB,EAAA,CAAA;sBAAxC,KAAK;gBAGU,SAAS,EAAA,CAAA;sBAAxB,KAAK;gBAGW,gBAAgB,EAAA,CAAA;sBAAhC,KAAK;gBAGI,kBAAkB,EAAA,CAAA;sBAA3B,MAAM;gBAG2B,mBAAmB,EAAA,CAAA;sBAApD,SAAS;uBAAC,qBAAqB,CAAA;;AA2YlC;AACA,MAAM,cAAc,CAAA;AAApB,IAAA,WAAA,GAAA;;QAME,IAAO,CAAA,OAAA,GAAa,EAAE,CAAC;KACxB;AAAA,CAAA;AAED;AACA,MAAM,mBAAmB,CAAA;AAOxB;;AEjfD;MAMa,qBAAqB,CAAA;AALlC,IAAA,WAAA,GAAA;;QAQkB,IAAU,CAAA,UAAA,GAAyB,EAAE,CAAC;AAMvD,KAAA;;AAHQ,IAAA,MAAM,CAAC,MAAM,EAAA;AAClB,QAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;KACxC;8GARU,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,4FCRlC,kSAOM,EAAA,MAAA,EAAA,CAAA,4GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,kCAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FDCO,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBALjC,SAAS;+BACE,gBAAgB,EAAA,QAAA,EAAA,kSAAA,EAAA,MAAA,EAAA,CAAA,4GAAA,CAAA,EAAA,CAAA;8BAOV,UAAU,EAAA,CAAA;sBAAzB,KAAK;;;AEeR;AACA,MAAM,eAAe,GAAG;IACtB,eAAe;IACf,eAAe;IACf,iBAAiB;IACjB,aAAa;IACb,eAAe;IACf,eAAe;IACf,kBAAkB;IAClB,cAAc;IACd,gBAAgB;IAChB,gBAAgB;IAChB,qBAAqB;IACrB,aAAa;IACb,cAAc;IACd,wBAAwB;CACzB,CAAC;MAwBW,sBAAsB,CAAA;8GAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,iBApB/B,iBAAiB;YACjB,qBAAqB;AACrB,YAAA,yBAAyB,aAGzB,YAAY;YACZ,gBAAgB;YAChB,WAAW;YACX,mBAAmB;YACnB,eAAe;AACf,YAAA,YAAY,EA5Bd,eAAe;YACf,eAAe;YACf,iBAAiB;YACjB,aAAa;YACb,eAAe;YACf,eAAe;YACf,kBAAkB;YAClB,cAAc;YACd,gBAAgB;YAChB,gBAAgB;YAChB,qBAAqB;YACrB,aAAa;YACb,cAAc;YACd,wBAAwB,EAiBtB,mBAAmB,CAAA,EAAA,OAAA,EAAA,CAGnB,iBAAiB;YACjB,qBAAqB;YACrB,yBAAyB,CAAA,EAAA,CAAA,CAAA,EAAA;AAGhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,YAf/B,YAAY;YACZ,gBAAgB;YAChB,WAAW;YACX,mBAAmB;YACnB,eAAe;YACf,YAAY,EACT,eAAe,EAClB,mBAAmB,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAQV,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAtBlC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,iBAAiB;wBACjB,qBAAqB;wBACrB,yBAAyB;AAC1B,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,gBAAgB;wBAChB,WAAW;wBACX,mBAAmB;wBACnB,eAAe;wBACf,YAAY;AACZ,wBAAA,GAAG,eAAe;wBAClB,mBAAmB;AACpB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,iBAAiB;wBACjB,qBAAqB;wBACrB,yBAAyB;AAC1B,qBAAA;AACF,iBAAA,CAAA;;;ACjED;;ACAA;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@softheon/armature",
3
- "version": "17.15.4",
3
+ "version": "17.15.5",
4
4
  "dependencies": {
5
5
  "tslib": "^2.5.0"
6
6
  },