@dsivd/prestations-ng 17.8.1 → 17.8.2-beta.1

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.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,20 @@
6
6
 
7
7
  ---
8
8
 
9
+ ## [17.8.2]
10
+
11
+ ### Fixed
12
+
13
+ - [foehn-autocomplete.component.ts](projects/prestations-ng/src/foehn-autocomplete/foehn-autocomplete.component.ts)
14
+ - Added a `setTimeout` when selecting value to display to fix component having a model but not displaying it on screen
15
+
16
+ ### Updated
17
+
18
+ - [foehn-table.component.ts](projects/prestations-ng/src/foehn-table/foehn-table.component.ts)
19
+ - Now extends `FoehnInputComponent` so when using templates with components extending `FoehnInputComponent`, they can be registered properly into form for validation
20
+ - `[list]` attribut has been deprecated. Use `[model]` instead.
21
+ - Templates containing any component extending `FoehnInputComponent` must be placed inside `<foehn-table>[HERE]</foehn-table>` for registration
22
+
9
23
  ## [17.8.1]
10
24
 
11
25
  ### Fixed
package/UPGRADING_V17.md CHANGED
@@ -302,6 +302,12 @@ you should set `dispatchFormErrors` to `true` :
302
302
 
303
303
  Otherwise the pills wil be set to "Renseigné" after a recovery registration even if some errors remains.
304
304
 
305
+ ### foehn-table now extends FoehnInputComponent
306
+
307
+ - use `[model]` instead of `[list]` because it is deprecated
308
+ - add a `[name]` attribut to your component
309
+ - put `FoehnTableColumnConfiguration` templates inside `<foehn-table>[HERE]</foehn-table>` when they contain components extending `FoehnInputComponent`
310
+
305
311
  ### Language deprecations
306
312
 
307
313
  When using `intellij`, you can run code inspection on your project to fix manually deprecations. Two ways:
@@ -596,8 +596,12 @@ export class FoehnAutocompleteComponent extends FoehnCheckableGroupComponent {
596
596
  }
597
597
  const elemToCompare = value ? value : this.defaultElementValue;
598
598
  if (elemToCompare) {
599
- this.inputValue = this.getMatchingValue(elements, elemToCompare);
600
- this.filterElements(true);
599
+ // PRESTAKIT-713: need to use setTimeout (not ngZone because doesn't work)
600
+ // to avoid having a value in model which is not displayed on screen
601
+ setTimeout(() => {
602
+ this.inputValue = this.getMatchingValue(elements, elemToCompare);
603
+ this.filterElements(true);
604
+ });
601
605
  }
602
606
  }
603
607
  matchValueOnModelChangeSubscription() {
@@ -672,4 +676,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
672
676
  }], disabled: [{
673
677
  type: Input
674
678
  }] } });
675
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9laG4tYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1hdXRvY29tcGxldGUvZm9laG4tYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1hdXRvY29tcGxldGUvZm9laG4tYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCw0RUFBNEU7QUFDNUUsT0FBTyxtQ0FBbUMsQ0FBQztBQUUzQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUtMLE1BQU0sRUFHTixTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGVBQWUsRUFDZixhQUFhLEVBRWIsRUFBRSxFQUNGLE9BQU8sRUFFVixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDSCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixLQUFLLEVBQ0wsR0FBRyxFQUNOLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDbkcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7Ozs7O0FBRTNFLCtDQUErQztBQUMvQyxTQUFTLGFBQWEsQ0FBQyxLQUFhO0lBQ2hDLHlGQUF5RjtJQUN6RixJQUFJLE9BQU8sS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsaUJBQWlCO0lBQ2pCLE9BQU8sS0FBSyxDQUFDLFNB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QUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztnQkFDekQsS0FBSyxFQUFFLElBQUk7YUFDZDtTQUNKLGlGQU1VLHdCQUF3QixnVENsRnZDLDhzS0E4SUE7OzRGRGhFYSwwQkFBMEI7a0JBWnRDLFNBQVM7K0JBQ0ksb0JBQW9CLGFBR25CO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxtQkFBbUI7NEJBQzVCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDJCQUEyQixDQUFDOzRCQUN6RCxLQUFLLEVBQUUsSUFBSTt5QkFDZDtxQkFDSjsyRUFPRCxxQkFBcUI7c0JBRHBCLFNBQVM7dUJBQUMsd0JBQXdCO2dCQUluQyxlQUFlO3NCQURkLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUk1QixZQUFZO3NCQURYLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk3Qyx3QkFBd0I7c0JBRHZCLEtBQUs7Z0JBU04sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBT04sdUJBQXVCO3NCQUR0QixLQUFLO2dCQVdOLHlCQUF5QjtzQkFEeEIsS0FBSztnQkFJTiw4QkFBOEI7c0JBRDdCLEtBQUs7Z0JBUU4sc0JBQXNCO3NCQURyQixLQUFLO2dCQUlOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFPTixlQUFlO3NCQURkLE1BQU07Z0JBdUVILFFBQVE7c0JBRFgsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8vIFRoaXMgY29tcG9uZW50IHVzZXMgc29tZSBFUzcgZmVhdHVyZXMgdGhhdCBhcmUgbm90IHBvbHlmaWxsZWQgYnkgQW5ndWxhci5cbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzJztcblxuaW1wb3J0IHsgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZSxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQmVoYXZpb3JTdWJqZWN0LFxuICAgIGNvbWJpbmVMYXRlc3QsXG4gICAgT2JzZXJ2YWJsZSxcbiAgICBvZixcbiAgICBTdWJqZWN0LFxuICAgIFN1YnNjcmlwdGlvblxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gICAgZGVib3VuY2VUaW1lLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICAgIGZpbHRlcixcbiAgICBmaXJzdCxcbiAgICBtYXBcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBGb2VobkNoZWNrYWJsZUdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9laG4tY2hlY2thYmxlcy9mb2Vobi1jaGVja2FibGUtZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IEZvZWhuSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9mb2Vobi1pbnB1dC9mb2Vobi1pbnB1dC5jb21wb25lbnQnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gbm9ybWFsaXplVXRmOCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBTb21lIGJyb3dzZXJzIHN1Y2ggYXMgSUUxMSBkb24ndCBzdXBwb3J0IHRoZSBmZWF0dXJlLiBBZGQgdGhlIHBvbHlmaWxsIGlmIHlvdSB3YW50IGl0LlxuICAgIGlmICh0eXBlb2YgdmFsdWUubm9ybWFsaXplICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYWNjZW50c1xuICAgIHJldHVybiB2YWx1ZS5ub3JtYWxpemUoJ05GRCcpLnJlcGxhY2UoL1tcXHUwMzAwLVxcdTAzNmZdL2csICcnKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmZ1bmN0aW9uIG5vcm1hbGl6ZVNlYXJjaCh2YWx1ZTogc3RyaW5nLCBjYXNlU2Vuc2l0aXZlU2VhcmNoOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2FzZVNlbnNpdGl2ZVNlYXJjaCkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplVXRmOCh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVVdGY4KHZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gc3RyaXBIdG1sVGFncyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvKDwoW14+XSspPikvZ2ksICcnKTtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmb2Vobi1hdXRvY29tcGxldGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb2Vobi1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2ZvZWhuLWF1dG9jb21wbGV0ZS5jb21wb25lbnQuY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IEZvZWhuSW5wdXRDb21wb25lbnQsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGb2VobkF1dG9jb21wbGV0ZUNvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBGb2VobkF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICAgIGV4dGVuZHMgRm9laG5DaGVja2FibGVHcm91cENvbXBvbmVudFxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlc1xue1xuICAgIEBWaWV3Q2hpbGQoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KVxuICAgIHZpcnR1YWxTY3JvbGxWaWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuXG4gICAgQFZpZXdDaGlsZCgnc3VnZ2VzdGlvbnNMaXN0JylcbiAgICBzdWdnZXN0aW9uc0xpc3Q6IGFueTtcblxuICAgIEBWaWV3Q2hpbGQoJ2VudHJ5Q29tcG9uZW50JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBpbnB1dEVsZW1lbnQ6IGFueTtcblxuICAgIEBJbnB1dCgpXG4gICAgc2VhcmNoVmFsdWVNaW5DaGFyc0NvdW50ID0gMDtcblxuICAgIC8qKlxuICAgICAqIEFsbG93IHRvIHByb3ZpZGUgY3VzdG9tIHZhbHVlcyB0byB0aGUgYXV0b2NvbXBsZXRlLlxuICAgICAqXG4gICAgICogQSBjdXN0b20gdmFsdWUgaXMgYSB2YWx1ZSB0aGF0IGlzIG5vdCBpbiB0aGUgYGVsZW1lbnRzYCBzZXQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBhbGxvd0N1c3RvbVZhbHVlID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgaWYgc3VnZ2VzdGlvbiBlbGVtZW50cyBsaXN0IGlzIGJlaW5nIHJldHJpZXZlZCBkeW5hbWljYWxseSB3aGlsZSB1c2VyIGlucHV0cyBpbiBzZWFyY2ggZmllbGQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBpc1N1Z2dlc3Rpb25MaXN0RHluYW1pYyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQWxsb3cgdG8gcHJvdmlkZSBhIGdlbmVyYXRvciB0byBjcmVhdGUgdGhlIG1vZGVsIHdpdGggY3VzdG9tIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHR5cGUgb2YgdGhlIG1vZGVsIGlzIGFuIG9iamVjdCBhbmQgbm90IGp1c3RcbiAgICAgKiBhIHN0cmluZy4gVXNlIHRoaXMgaXMgYGFsbG93Q3VzdG9tVmFsdWVgIGlzIHRydWUgYW5kIGBlbGVtZW50VmFsdWVgXG4gICAgICogaXMgYSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGN1c3RvbVZhbHVlTW9kZWxHZW5lcmF0b3I6IChpbnB1dDogc3RyaW5nKSA9PiBhbnk7XG5cbiAgICBASW5wdXQoKVxuICAgIGl0ZW1IZWlnaHRJblN1Z2dlc3Rpb25MaXN0SW5QeCA9IDQwO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN1Z2dlc3Rpb24gbGFiZWwgdXNlZCBpbiB0aGUgZGlzcGxheWVkIGxpc3QuIENhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uXG4gICAgICogZmFsbGJhY2sgb24gJ2VsZW1lbnRMYWJlbCdcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGVsZW1lbnRTdWdnZXN0aW9uTGFiZWw6IGFueTtcblxuICAgIEBJbnB1dCgpXG4gICAgY2FzZVNlbnNpdGl2ZVNlYXJjaCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB1c2VyIGNoYW5nZXMgc2VhcmNoIGlucHV0IHZhbHVlXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgdXNlclNlYXJjaElucHV0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICBpbnB1dFZhbHVlOiBzdHJpbmc7XG4gICAgc2VhcmNoVmFsdWU6IHN0cmluZztcbiAgICBpbnB1dEhhc0ZvY3VzOiBib29sZWFuO1xuICAgIGhpZGVTdWdnZXN0aW9ucyA9IHRydWU7XG4gICAgY3VycmVudEJsdXJUaW1lcjogYW55O1xuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cbiAgICBWSUVXX1BPUlRfSEVJR0hUOiBudW1iZXI7XG5cbiAgICBkaXNwbGF5ZWRFbGVtZW50czogYW55W107XG4gICAgbm90aWZpY2F0aW9uTWVzc2FnZVVwZGF0ZWQ6IGJvb2xlYW47XG5cbiAgICBkaXNhYmxlZFN1YmplY3Q6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICAgIHByaXZhdGUgcGVuZGluZ0Rpc2FibGVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHByaXZhdGUgZWxlbWVudHNMb2FkZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgICBwcml2YXRlIGN1cnJlbnRJdGVtR2xvYmFsSW5kZXggPSAtMTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IE5CX0lURU1TX1ZJU0lCTEUgPSA1O1xuXG4gICAgcHJpdmF0ZSBmaWx0ZXJTdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcml2YXRlIGZpbHRlclN1YmNyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBsaXN0SGFzRm9jdXM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBhY3RpdmVEZXNjZW5kYW50SWQ6IHN0cmluZztcblxuICAgIHByaXZhdGUgb25Jbml0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBtb2RlbENoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgZWxlbWVudHNMb2FkZWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgU1VHR0VTVElPTl9TRUxFQ1RFRF9DTEFTUyA9ICdzdWdnZXN0aW9uLXNlbGVjdGVkJztcbiAgICBwcml2YXRlIHJlYWRvbmx5IEVYQ0xVREVfSFRNTF9UQUdTX1JFR0VYID0gJygoPz1bXj5dKjwpfCg/IVtePF0qPikpJztcbiAgICBwcml2YXRlIHJlYWRvbmx5IFNVR0dFU1RJT05fQ1VTVE9NX0FUVFJJQlVURV9MQUJFTF9WQUxVRSA9ICdsYWJlbC12YWx1ZSc7XG4gICAgLy8gSW5zcGlyZWQgZnJvbSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L0d1aWRlL1JlZ3VsYXJfRXhwcmVzc2lvbnMjZXNjYXBpbmdcbiAgICBwcml2YXRlIHJlYWRvbmx5IFJFR0VYX1RPX0VTQ0FQRV9SRUdFWCA9IC9bLiorP14ke30oKXxbXFxdXFxcXF0vZztcblxuICAgIHByaXZhdGUgdXNlclNlYXJjaElucHV0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSB1c2VyU2VhcmNoSW5wdXRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gICAgcHJpdmF0ZSBzZWxlY3RWYWx1ZVRvRGlzcGxheU9uRWxlbWVudHNMb2FkZWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHpvbmU6IE5nWm9uZSkge1xuICAgICAgICBzdXBlcih6b25lKTtcbiAgICAgICAgdGhpcy5maWx0ZXJTdWJjcmlwdGlvbiA9IHRoaXMuZmlsdGVyU3ViamVjdFxuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDIwMCkpXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnhqcy1hbmd1bGFyL3ByZWZlci1hc3luYy1waXBlXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMuZmlsdGVyRWxlbWVudHMuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy8gTmVlZCB0byBzdWJzY3JpYmUgb24gRXZlbnRFbWl0dGVyICdlbGVtZW50c0xvYWRlZCcgb3RoZXJ3aXNlIGVsZW1lbnRzIHdpdGggSFRNTCBkb2VzIG5vdCB3b3JrLi4uXG4gICAgICAgIHRoaXMuZWxlbWVudHNMb2FkZWRTdWJzY3JpcHRpb24gPSB0aGlzLmVsZW1lbnRzTG9hZGVkXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5waXBlKG1hcChlbGVtcyA9PiAhIWVsZW1zKSlcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByeGpzLWFuZ3VsYXIvcHJlZmVyLWFzeW5jLXBpcGVcbiAgICAgICAgICAgIC5zdWJzY3JpYmUobG9hZGVkID0+IHRoaXMuZWxlbWVudHNMb2FkZWRTdWJqZWN0Lm5leHQobG9hZGVkKSk7XG5cbiAgICAgICAgdGhpcy5kaXNhYmxlZFN1YmplY3QgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0Rpc2FibGVkU3ViamVjdC5hc09ic2VydmFibGUoKSxcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHNMb2FkZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgIF0pLnBpcGUobWFwKChbZGlzYWJsZWRdKSA9PiAoZGlzYWJsZWQgPyAnZGlzYWJsZWQnIDogbnVsbCkpKTtcblxuICAgICAgICB0aGlzLlZJRVdfUE9SVF9IRUlHSFQgPVxuICAgICAgICAgICAgdGhpcy5pdGVtSGVpZ2h0SW5TdWdnZXN0aW9uTGlzdEluUHggKiB0aGlzLk5CX0lURU1TX1ZJU0lCTEU7XG4gICAgfVxuXG4gICAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nRGlzYWJsZWRTdWJqZWN0LnZhbHVlO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ0Rpc2FibGVkU3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgICAgICBpZiAodGhpcy5zZWFyY2hWYWx1ZU1pbkNoYXJzQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByeGpzLWFuZ3VsYXIvcHJlZmVyLWFzeW5jLXBpcGVcbiAgICAgICAgICAgIHRoaXMuZ2V0RWxlbWVudHMoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheWVkRWxlbWVudHModGhpcy5lbGVtZW50cyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFZhbHVlTWluQ2hhcnNDb3VudCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSBgU2Fpc2lzc2V6IGF1IG1vaW5zICR7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZU1pbkNoYXJzQ291bnRcbiAgICAgICAgICAgIH0gY2FyYWN0w6hyZSR7dGhpcy5zZWFyY2hWYWx1ZU1pbkNoYXJzQ291bnQgPiAxID8gJ3MnIDogJyd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub25Jbml0U3Vic2NyaXB0aW9uID0gdGhpcy5vbkluaXRTdWJqZWN0XG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByeGpzLWFuZ3VsYXIvcHJlZmVyLWFzeW5jLXBpcGVcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEhhY2sgdG8gcmVmcmVzaCB0aGUgZGF0YSBvbmNlIHRoZSBsaXN0IGlzIGRvd25sb2FkZWQuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVOZ01vZGVsKHRoaXMubW9kZWxfKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFdoZW4gdGhlIG1vZGVsIGNoYW5nZXMsIHNlbGVjdCB0aGUgcmlnaHQgdmFsdWUgdG8gZGlzcGxheS5cbiAgICAgICAgdGhpcy5tYXRjaFZhbHVlT25Nb2RlbENoYW5nZVN1YnNjcmlwdGlvbigpO1xuXG4gICAgICAgIHRoaXMudXNlclNlYXJjaElucHV0U3Vic2NyaXB0aW9uID0gdGhpcy51c2VyU2VhcmNoSW5wdXRTdWJqZWN0XG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0byB0cmlnZ2VyIHNlYXJjaGVkIGlucHV0IGlmIGl0IGhhcyBub3QgY2hhbmdlZFxuICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHdlIG9ubHkgY2F0Y2ggdGhlIGxhdGVzdCBvZiBtdWx0aXBsZVxuICAgICAgICAgICAgICAgIC8vIHF1aWNrIHVwZGF0ZXMsIGFuZCB0byBtYWtlIHN1cmUgdGhlIHVzZXJJbnB1dCBpcyBmaXJlZCB3aGVuXG4gICAgICAgICAgICAgICAgLy8gdGhlIGNvbXBvbmVudCBpcyBkb25lIHVwZGF0aW5nLlxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgwKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ4anMtYW5ndWxhci9wcmVmZXItYXN5bmMtcGlwZVxuICAgICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VyU2VhcmNoSW5wdXQuZW1pdCh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcblxuICAgICAgICB0aGlzLmZpbHRlclN1YmNyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLm9uSW5pdFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5tb2RlbENoYW5nZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5lbGVtZW50c0xvYWRlZFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy51c2VyU2VhcmNoSW5wdXRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0VmFsdWVUb0Rpc3BsYXlPbkVsZW1lbnRzTG9hZGVkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2Ugb24gdGhlIGR5bmFtaWMgZWxlbWVudHMgaW5wdXQuXG4gICAgICAgIHRoaXMub25EeW5hbWljRWxlbWVudHNDaGFuZ2UoY2hhbmdlcy5lbGVtZW50cyk7XG4gICAgfVxuXG4gICAgb25JbnB1dEZvY3VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlclN1YmplY3QubmV4dCgpO1xuICAgICAgICB0aGlzLmlucHV0SGFzRm9jdXMgPSB0cnVlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5pc0VtcHR5KHRoaXMuc2VhcmNoVmFsdWUpICYmXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZU1pbkNoYXJzQ291bnQgPT09IDApIHx8XG4gICAgICAgICAgICAoIXRoaXMuaXNFbXB0eSh0aGlzLnNlYXJjaFZhbHVlKSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVmFsdWVNaW5DaGFyc0NvdW50IDw9IHRoaXMuc2VhcmNoVmFsdWUubGVuZ3RoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb25zID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNsZWFyT25CbHVyVGltZW91dCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25JbnB1dENsaWNrKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5oaWRlU3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMub25JbnB1dEZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXb3JrYXJvdW5kIGZvciBJRTExIHRoYXQgbG9zZXMgZm9jdXMgb24gaW5wdXQgd2hlbiBzY3JvbGxiYXIgaXMgY2xpY2tlZFxuICAgIC8vIC0tPiBwdXQgYmFjayBmb2N1cyBvbiBpbnB1dCBhbmQgY2FuY2VsIHN1Z2dlc3Rpb25zIGhpZGluZyB0aW1lclxuICAgIHNldEZvY3VzT25JbnB1dCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB0aGlzLmNsZWFyT25CbHVyVGltZW91dCgpO1xuICAgIH1cblxuICAgIG9uSW5wdXRCbHVyKCk6IHZvaWQge1xuICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIG9uQ2xpY2tTdWdnZXN0aW9uLiBTZXR0aW5nIGlucHV0SGFzRm9jdXMgdG8gZmFsc2UgbWFrZXMgc3VnZ2VzdGlvbnMgZGlzYXBwZWFyZWRcbiAgICAgICAgLy8gYW5kIG9uQ2xpY2tTdWdnZXN0aW9uIGlzIG5ldmVyIGNhbGxlZC4gU2V0dGluZyBhIHRpbWVvdXQgaGVyZSBhdm9pZCB0aGlzIHByb2JsZW0uXG4gICAgICAgIHRoaXMuY3VycmVudEJsdXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy8gRG9uJ3QgY2xvc2UgdGhlIGxpc3QgaWYgdGhlIGxpc3QgaGFzIHRoZSBmb2N1cy4gVGhpcyBpcyBkb25lIHRvIGFsbG93IFZvaWNlT3ZlciB1c2VycyBvbiBpT1MgdG9cbiAgICAgICAgICAgIC8vIHNlbGVjdCBhbiBvcHRpb24gd2l0aCB0aGVpciBmaW5nZXIuIFNhbWUgaWYgZm9jdXMgaXMgc2V0IG9uIGxpc3Qgc2Nyb2xsIGJhclxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICF0aGlzLmxpc3RIYXNGb2N1cyAmJlxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuY2xhc3NOYW1lICE9PVxuICAgICAgICAgICAgICAgICAgICAnZm9ybS1ncm91cCBhdXRvY29tcGxldGUtZm9ybS1ncm91cCdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRIYXNGb2N1cyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQW5kU2V0SW5wdXRWYWx1ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbktleURvd24oa2V5RXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICAgICAgLy8gVGhlIGlucHV0IG1pZ2h0IG5vdCBiZSBtYXJrZWQgYXMgZm9jdXNlZCBpbiBjYXNlIHRoZSB1c2VyIHNlbGVjdHMgYSB2YWx1ZSBmcm9tIHRoZSBsaXN0LlxuICAgICAgICB0aGlzLmlucHV0SGFzRm9jdXMgPSB0cnVlO1xuICAgICAgICBjb25zdCBwcm9wYWdhdGUgPSB0aGlzLm9uS2V5RG93bklubmVyKGtleUV2ZW50KTtcbiAgICAgICAgaWYgKHByb3BhZ2F0ZSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJTdWJqZWN0Lm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGFnYXRlO1xuICAgIH1cblxuICAgIG9uS2V5RG93bklubmVyKGtleUV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIC8vIElFIGRvZXNuJ3Qgc3VwcG9ydCBrZXlFdmVudC5jb2RlLCBhbmQgaGFzIGRpZmZlcmVudCB2YWx1ZXNcbiAgICAgICAgLy8gaW4ga2V5RXZlbnQua2V5IChEb3duIGluc3RlYWQgb2YgQXJyb3dEb3duIGZvciBpbnN0YW5jZSksIGhlbmNlIHRoZSBtdWx0aS1zdXBwb3J0LlxuICAgICAgICBjb25zdCBpZTExQ29tcGF0aWJsZUNvZGUgPSBrZXlFdmVudC5jb2RlIHx8IGtleUV2ZW50LmtleTtcbiAgICAgICAgc3dpdGNoIChpZTExQ29tcGF0aWJsZUNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Rvd24nOlxuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3VnZ2VzdGlvbnNEaXNwbGF5ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVTdWdnZXN0aW9ucyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3ROZXh0RWxlbWVudCh0cnVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1VwJzpcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0TmV4dEVsZW1lbnQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnU3BhY2UnOlxuICAgICAgICAgICAgY2FzZSAnU3BhY2ViYXInOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFNlbGVjdGVkRWxlbWVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZ2V0U2VsZWN0ZWRFbGVtZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldEZpcnN0U3VnZ2VzdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IGJlZm9yZSBmb3JtIHN1Ym1pdCwgY2FsbHMgY2hlY2tBbmRTZXRJbnB1dFZhbHVlIGJlY2F1c2UgZm9jdXNvdXQgaXMgY2FsbGVkIHRvbyBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAobmV3IHZhbHVlIGlzIGFscmVhZHkgbG9zdCkuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQW5kU2V0SW5wdXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gYXV0b2NvbXBsZXRlIHdpdGhvdXQgbmVlZCB0byBzZWxlY3QgaXQgbWFudWFsbHlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0FuZFNldElucHV0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tBbmRTZXRJbnB1dFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgICAgIGNhc2UgJ1JpZ2h0JzpcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5nZXRTZWxlY3RlZEVsZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQW5kU2V0SW5wdXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdWdnZXN0aW9uc0Rpc3BsYXllZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBrZXlFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG9uTGlzdE9wdGlvbk1vdXNlRG93bihldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIFNhZmFyaSB0cmlnZ2VycyBmb2N1c091dCBiZWZvcmUgY2xpY2ssIGJ1dCBpZiB5b3VcbiAgICAgICAgLy8gcHJldmVudERlZmF1bHQgb24gbW91c2VEb3duLCB5b3UgY2FuIHN0b3AgdGhhdCBmcm9tIGhhcHBlbmluZy5cbiAgICAgICAgLy8gSWYgdGhpcyBpcyByZW1vdmVkLCBjbGlja2luZyBvbiBhbiBvcHRpb24gaW4gU2FmYXJpIHdpbGwgdHJpZ2dlclxuICAgICAgICAvLyBgaGFuZGxlT3B0aW9uQmx1cmAsIHdoaWNoIGNsb3NlcyB0aGUgbWVudSwgYW5kIHRoZSBjbGljayB3aWxsXG4gICAgICAgIC8vIHRyaWdnZXIgb24gdGhlIGVsZW1lbnQgdW5kZXJuZWF0aCBpbnN0ZWFkLlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIG9uTGlzdE9wdGlvbkZvY3VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxpc3RIYXNGb2N1cyA9IHRydWU7XG4gICAgfVxuXG4gICAgb25MaXN0T3B0aW9uQmx1cigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5saXN0SGFzRm9jdXMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBmaWx0ZXJFbGVtZW50cyhoaWRlU3VnZ2VzdGlvbnM6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gdGhpcy5pbnB1dFZhbHVlO1xuXG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pc0VtcHR5KHRoaXMuc2VhcmNoVmFsdWUpIHx8XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlLmxlbmd0aCA8IHRoaXMuc2VhcmNoVmFsdWVNaW5DaGFyc0NvdW50XG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoVmFsdWVNaW5DaGFyc0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5ZWRFbGVtZW50cyh0aGlzLmVsZW1lbnRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdWdnZXN0aW9uc0Rpc3BsYXllZCh0cnVlLCBbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFN1Z2dlc3Rpb25zRGlzcGxheWVkKFxuICAgICAgICAgICAgICAgIGhpZGVTdWdnZXN0aW9ucyxcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzLmZpbHRlcigoZTogYW55KSA9PiB0aGlzLm1hdGNoUmVzdWx0KGUpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFN1Z2dlc3Rpb25MYWJlbChlbGVtZW50OiBhbnkpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudFN1Z2dlc3Rpb25MYWJlbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFiZWwoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmVsZW1lbnRTdWdnZXN0aW9uTGFiZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXROZXN0ZWRQcm9wZXJ0eShlbGVtZW50LCB0aGlzLmVsZW1lbnRTdWdnZXN0aW9uTGFiZWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRTdWdnZXN0aW9uTGFiZWwoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgZ2V0TGFiZWxXaXRoRW1waGFzaXMoZWxlbTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGxhYmVsID0gdGhpcy5nZXRTdWdnZXN0aW9uTGFiZWwoZWxlbSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzRW1wdHkodGhpcy5zZWFyY2hWYWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhc1JlZ2V4cENoYXJzVG9Fc2NhcGUgPSBSZWdFeHAoXG4gICAgICAgICAgICAgICAgdGhpcy5SRUdFWF9UT19FU0NBUEVfUkVHRVguc291cmNlXG4gICAgICAgICAgICApLnRlc3QodGhpcy5zZWFyY2hWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCByZWdleFNlYXJjaFZhbHVlID0gaGFzUmVnZXhwQ2hhcnNUb0VzY2FwZVxuICAgICAgICAgICAgICAgID8gdGhpcy5lc2NhcGVSZWdleHAoXG4gICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplU2VhcmNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhc2VTZW5zaXRpdmVTZWFyY2hcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBub3JtYWxpemVTZWFyY2godGhpcy5zZWFyY2hWYWx1ZSwgdGhpcy5jYXNlU2Vuc2l0aXZlU2VhcmNoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4U3RyID0gYCR7cmVnZXhTZWFyY2hWYWx1ZX0ke3RoaXMuRVhDTFVERV9IVE1MX1RBR1NfUkVHRVh9YDtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBub3JtYWxpemVTZWFyY2goXG4gICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jYXNlU2Vuc2l0aXZlU2VhcmNoXG4gICAgICAgICAgICApLnNlYXJjaChyZWdleFN0cik7XG4gICAgICAgICAgICBpZiAoc3RhcnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IGAke1xuICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID4gMCA/IGxhYmVsLnN1YnN0cmluZygwLCBzdGFydEluZGV4KSA6ICcnXG4gICAgICAgICAgICAgICAgfTxiPiR7bGFiZWwuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4LFxuICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ICsgdGhpcy5zZWFyY2hWYWx1ZS5sZW5ndGhcbiAgICAgICAgICAgICAgICApfTwvYj4ke1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC5sZW5ndGggPiBzdGFydEluZGV4ICsgdGhpcy5zZWFyY2hWYWx1ZS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbGFiZWwuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCArIHRoaXMuc2VhcmNoVmFsdWUubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICB9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYWJlbDtcbiAgICB9XG5cbiAgICBvbkNsZWFyKCk6IHZvaWQge1xuICAgICAgICBzdXBlci5vbkNsZWFyKCk7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFuZGxlU2VhcmNoSW5wdXRDaGFuZ2UobnVsbCk7XG4gICAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5oaWRlU3VnZ2VzdGlvbnMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5maWx0ZXJFbGVtZW50cygpO1xuICAgIH1cblxuICAgIGRpc3BsYXlDbGVhckJ1dHRvbigpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIG9mKCEhdGhpcy5pbnB1dFZhbHVlICYmICF0aGlzLmRpc2FibGVkKTtcbiAgICB9XG5cbiAgICBvbkNsaWNrU3VnZ2VzdGlvbihlbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKHRoaXMuZ2V0TGFiZWwoZWxlbWVudCkpO1xuICAgICAgICB0aGlzLmNoZWNrQW5kU2V0SW5wdXRWYWx1ZSgpO1xuXG4gICAgICAgIC8vIEZvcmNlIHRoZSBmb2N1cyBvbiB0aGUgaW5wdXQgdG8gZW5zdXJlIHRoYXQgVm9pY2VPdmVyIGRvZXNuJ3Qgc2V0IHRoZSBmb2N1cyBvbiBhbm90aGVyIGZpZWxkIG9uIHRoZSBwYWdlLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9jdXNPbklucHV0KCk7XG4gICAgICAgICAgICAvLyBUaGUgaW5wdXQgc2hvdWxkbid0IGJlIG1hcmtlZCBhcyBmb2N1c2VkIGFzIHdlIGRvbid0IHdhbnQgdG8gZGlzcGxheSB0aGUgbGlzdC5cbiAgICAgICAgICAgIHRoaXMuaW5wdXRIYXNGb2N1cyA9IGZhbHNlO1xuICAgICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKG51bGwpO1xuICAgICAgICB0aGlzLmNoZWNrQW5kU2V0SW5wdXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIHNob3VsZERpc3BsYXlMaXN0Ym94KCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpc1Zpc2libGUgPVxuICAgICAgICAgICAgdGhpcy5pbnB1dEhhc0ZvY3VzICYmXG4gICAgICAgICAgICAhdGhpcy5oaWRlU3VnZ2VzdGlvbnMgJiZcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkRWxlbWVudHMgJiZcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkRWxlbWVudHMubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKCFpc1Zpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEl0ZW1HbG9iYWxJbmRleCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1Zpc2libGU7XG4gICAgfVxuXG4gICAgZ2V0QWN0aXZlRGVzY2VuZGFudElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3VsZERpc3BsYXlMaXN0Ym94KCkgJiYgdGhpcy5hY3RpdmVEZXNjZW5kYW50SWRcbiAgICAgICAgICAgID8gdGhpcy5hY3RpdmVEZXNjZW5kYW50SWRcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG5cbiAgICBzaG93U3VnZ2VzdGlvbnNXaGVuSW5wdXRIYXNGb2N1c0FuZElzRW1wdHkodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF2YWwgJiYgdGhpcy5pbnB1dEhhc0ZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVTdWdnZXN0aW9ucyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJFbGVtZW50cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlU2VhcmNoSW5wdXRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXNlclNlYXJjaElucHV0U3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRHluYW1pY0VsZW1lbnRzQ2hhbmdlKGNoYW5nZTogU2ltcGxlQ2hhbmdlKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc1N1Z2dlc3Rpb25MaXN0RHluYW1pYykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2UgJiYgIWNoYW5nZS5maXJzdENoYW5nZSAmJiAhIXRoaXMuc2VhcmNoVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0RWxlbWVudHMoKVxuICAgICAgICAgICAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ4anMtYW5ndWxhci9wcmVmZXItYXN5bmMtcGlwZVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN1Z2dlc3Rpb25zRGlzcGxheWVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzLmZpbHRlcigoZTogYW55KSA9PiB0aGlzLm1hdGNoUmVzdWx0KGUpKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhck9uQmx1clRpbWVvdXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRCbHVyVGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmN1cnJlbnRCbHVyVGltZXIpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Qmx1clRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0U2VsZWN0ZWRFbGVtZW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldElucHV0VmFsdWUodGhpcy5nZXRTZWxlY3RlZEVsZW1lbnQoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRJbnB1dFZhbHVlKFxuICAgICAgICB2YWx1ZTogc3RyaW5nLFxuICAgICAgICBoaWRlU3VnZ2VzdGlvbnM6IGJvb2xlYW4gPSB0cnVlXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmIChoaWRlU3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgICAgICBuZXcgSW5wdXRFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5oaWRlU3VnZ2VzdGlvbnMgPSBoaWRlU3VnZ2VzdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgaWYgdmFsdWUgaW4gaW5wdXQgbWF0Y2hlcyBhIHZhbHVlIGZyb20gc3VnZ2VzdGlvbnMuIElmIG5vdCwgZW1wdHkgdGhlIGlucHV0IGlmIHRoZSBjdXN0b20gdmFsdWVcbiAgICAgKiBvcHRpb24gaXMgbm90IHNldC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNoZWNrQW5kU2V0SW5wdXRWYWx1ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCEhdGhpcy5pbnB1dFZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ0VsZW1lbnQgPSB0aGlzLmVsZW1lbnRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoYTogYW55KSA9PiB0aGlzLmdldExhYmVsKGEpID09PSB0aGlzLmlucHV0VmFsdWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChtYXRjaGluZ0VsZW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKG1hdGNoaW5nRWxlbWVudFswXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tYW51YWxseVVwZGF0ZVZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmFsbG93Q3VzdG9tVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdNb2RlbCA9IHRoaXMuZ2V0Q3VzdG9tVmFsdWUodGhpcy5pbnB1dFZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1hbnVhbGx5VXBkYXRlVmFsdWUobmV3TW9kZWwpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWFudWFsbHlVcGRhdGVWYWx1ZShudWxsKTtcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTdWdnZXN0aW9uc0Rpc3BsYXllZChcbiAgICAgICAgaGlkZVN1Z2dlc3Rpb25zOiBib29sZWFuLFxuICAgICAgICBkaXNwbGF5ZWRFbGVtZW50czogYW55W11cbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXREaXNwbGF5ZWRFbGVtZW50cyhkaXNwbGF5ZWRFbGVtZW50cyk7XG4gICAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb25zID0gaGlkZVN1Z2dlc3Rpb25zO1xuICAgICAgICB0aGlzLm5vdGlmeVNjcmVlblJlYWRlclVzZXJzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXREaXNwbGF5ZWRFbGVtZW50cyhmaWx0ZXJlZEVsZW1lbnRzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVEZXNjZW5kYW50SWQgPSBudWxsO1xuICAgICAgICB0aGlzLmRpc3BsYXllZEVsZW1lbnRzID0gZmlsdGVyZWRFbGVtZW50cztcblxuICAgICAgICB0aGlzLnJlc2l6ZURpc3BsYXlWaWV3UG9ydChmaWx0ZXJlZEVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2l6ZURpc3BsYXlWaWV3UG9ydChmaWx0ZXJlZEVsZW1lbnRzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKCEhZmlsdGVyZWRFbGVtZW50cykge1xuICAgICAgICAgICAgaWYgKGZpbHRlcmVkRWxlbWVudHMubGVuZ3RoIDwgdGhpcy5OQl9JVEVNU19WSVNJQkxFKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5WSUVXX1BPUlRfSEVJR0hUID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtSGVpZ2h0SW5TdWdnZXN0aW9uTGlzdEluUHggKlxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEVsZW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoISF0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgTUFYX0hFSUdIVCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuTkJfSVRFTVNfVklTSUJMRSAqIHRoaXMuaXRlbUhlaWdodEluU3VnZ2VzdGlvbkxpc3RJblB4O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLlZJRVdfUE9SVF9IRUlHSFQgPCBNQVhfSEVJR0hUKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuVklFV19QT1JUX0hFSUdIVCA9IE1BWF9IRUlHSFQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIXRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTZWxlY3RlZEVsZW1lbnQoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuc3VnZ2VzdGlvbnNMaXN0KSB7XG4gICAgICAgICAgICBjb25zdCBzdWdnZXN0aW9ucyA9IHRoaXMuZ2V0U3VnZ2VzdGlvbkxpc3QoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaW5kZXhTdHIgaW4gc3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbnMuaGFzT3duUHJvcGVydHkoaW5kZXhTdHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaW5kZXhTdHIsIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihpbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBzdWdnZXN0aW9uc1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jbGFzc05hbWUuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU1VHR0VTVElPTl9TRUxFQ1RFRF9DTEFTU1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmdldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5TVUdHRVNUSU9OX0NVU1RPTV9BVFRSSUJVVEVfTEFCRUxfVkFMVUVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0TmV4dEVsZW1lbnQoZG93bjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdWdnZXN0aW9uc0Rpc3BsYXllZCgpKSB7XG4gICAgICAgICAgICBjb25zdCBzdWdnZXN0aW9ucyA9IHRoaXMuZ2V0U3VnZ2VzdGlvbkxpc3QoKTtcbiAgICAgICAgICAgIGxldCBuZXdJdGVtU2VsZWN0ZWQgPSBudWxsO1xuICAgICAgICAgICAgY29uc3Qgc3RlcCA9IGRvd24gPyAxIDogLTE7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaW5kZXhTdHIgaW4gc3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbnMuaGFzT3duUHJvcGVydHkoaW5kZXhTdHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaW5kZXhTdHIsIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihpbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBzdWdnZXN0aW9uc1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0SW5kZXg6IG51bWJlciA9IGluZGV4ICsgc3RlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudEl0ZW1TZWxlY3RlZCA9IGl0ZW0uY2xhc3NOYW1lLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU1VHR0VTVElPTl9TRUxFQ1RFRF9DTEFTU1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zZWxlY3RJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ3VycmVudEl0ZW1TZWxlY3RlZCAmJiBuZXh0SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ld0l0ZW1TZWxlY3RlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0SW5kZXggPCBzdWdnZXN0aW9ucy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN1Z2dlc3Rpb25zW25leHRJbmRleF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN1Z2dlc3Rpb25zW3N1Z2dlc3Rpb25zLmxlbmd0aCAtIDFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIG5vIGl0ZW0gd2FzIHNlbGVjdGVkIGJlZm9yZSwgc2VsZWN0IGZpcnN0IG9uZVxuICAgICAgICAgICAgaWYgKCFuZXdJdGVtU2VsZWN0ZWQgJiYgc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEl0ZW1HbG9iYWxJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKChuZXdJdGVtU2VsZWN0ZWQgPSBzdWdnZXN0aW9uc1swXSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBNYW5hZ2UgZ2xvYmFsIGl0ZW0gc2VsZWN0ZWQgaW5kZXhcbiAgICAgICAgICAgICAgICBjb25zdCBNQVhfSU5ERVggPSB0aGlzLmRpc3BsYXllZEVsZW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SXRlbUdsb2JhbEluZGV4ICs9IHN0ZXA7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudEl0ZW1HbG9iYWxJbmRleCA+IE1BWF9JTkRFWCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJdGVtR2xvYmFsSW5kZXggPSBNQVhfSU5ERVg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRJdGVtR2xvYmFsSW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEl0ZW1HbG9iYWxJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTY3JvbGxzIGRvd24gb3IgdXAgaWYgbmV3SXRlbVNlbGVjdGVkIGlzIG5vdCB2aXNpYmxlXG4gICAgICAgICAgICBjb25zdCBzdWdnZXN0aW9uc05hdGl2ZUVsZW1lbnQgPVxuICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1Zpc2libGUoc3VnZ2VzdGlvbnNOYXRpdmVFbGVtZW50LCBuZXdJdGVtU2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQuc2Nyb2xsVG9JbmRleChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SXRlbUdsb2JhbEluZGV4XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3VnZ2VzdGlvbkxpc3QoKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zTmF0aXZlRWxlbWVudCA9IHRoaXMuc3VnZ2VzdGlvbnNMaXN0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnZlcnRzIHRoZSBzdWdnZXN0aW9ucyB0byBhbiBhcnJheSB0byB3b3JrIGNvbnNpc3RlbnRseSBhY3Jvc3MgYnJvd3NlcnMuXG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzdWdnZXN0aW9uc05hdGl2ZUVsZW1lbnQuY2hpbGRyZW4pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdW5zZWxlY3RJdGVtKGl0ZW06IGFueSk6IHZvaWQge1xuICAgICAgICBpdGVtLmNsYXNzTmFtZSA9IGl0ZW0uY2xhc3NOYW1lLnJlcGxhY2UoXG4gICAgICAgICAgICBgICR7dGhpcy5TVUdHRVNUSU9OX1NFTEVDVEVEX0NMQVNTfWAsXG4gICAgICAgICAgICAnJ1xuICAgICAgICApO1xuICAgICAgICBpdGVtLmF0dHJpYnV0ZXNbJ2FyaWEtc2VsZWN0ZWQnXSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0SXRlbShpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpdGVtLmNsYXNzTmFtZS5pbmNsdWRlcyh0aGlzLlNVR0dFU1RJT05fU0VMRUNURURfQ0xBU1MpKSB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTmFtZSArPSBgICR7dGhpcy5TVUdHRVNUSU9OX1NFTEVDVEVEX0NMQVNTfWA7XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLmF0dHJpYnV0ZXNbJ2FyaWEtc2VsZWN0ZWQnXSA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5hY3RpdmVEZXNjZW5kYW50SWQgPSBpdGVtLmlkO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWaXNpYmxlKHBhcmVudDogYW55LCBlbGVtZW50OiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZWxlbWVudE9mZnNldFRvcCA9XG4gICAgICAgICAgICBlbGVtZW50Lm9mZnNldFRvcCArXG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydC5nZXRPZmZzZXRUb1JlbmRlcmVkQ29udGVudFN0YXJ0KCk7XG4gICAgICAgIC8vIGVsZW1lbnQgaXMgYmVsb3cgdmlzaWJsZSBhcmVhXG4gICAgICAgIGNvbnN0IGlzQmVsb3cgPVxuICAgICAgICAgICAgZWxlbWVudE9mZnNldFRvcCA8IHBhcmVudC5vZmZzZXRIZWlnaHQgKyBwYXJlbnQuc2Nyb2xsVG9wO1xuICAgICAgICAvLyBlbGVtZW50IGlzIGFib3ZlIHZpc2libGUgYXJlYVxuICAgICAgICBjb25zdCBpc0Fib3ZlID0gZWxlbWVudE9mZnNldFRvcCA+IHBhcmVudC5zY3JvbGxUb3A7XG4gICAgICAgIHJldHVybiBpc0JlbG93ICYmIGlzQWJvdmU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWdnZXN0aW9uc0Rpc3BsYXllZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuc3VnZ2VzdGlvbnNMaXN0ICYmXG4gICAgICAgICAgICB0aGlzLnN1Z2dlc3Rpb25zTGlzdC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZpcnN0U3VnZ2VzdGlvbigpOiBzdHJpbmcge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnN1Z2dlc3Rpb25zTGlzdCAmJlxuICAgICAgICAgICAgdGhpcy5zdWdnZXN0aW9uc0xpc3QubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPT09IDFcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdWdnZXN0aW9uc0xpc3QubmF0aXZlRWxlbWVudC5jaGlsZHJlblswXS5pbm5lclRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlTY3JlZW5SZWFkZXJVc2VycygpOiB2b2lkIHtcbiAgICAgICAgLy8gRm9yY2VzIE5WREEgdG8gcmUtcmVhZCB0aGUgY29udGVudCBvZiB0aGUgc2Mtb25seSBub3RpZmljYXRpb24uXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uTWVzc2FnZVVwZGF0ZWQgPSAhdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlVXBkYXRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1hdGNoaW5nVmFsdWUoZWxlbWVudHM6IGFueSwgZWxlbVRvQ29tcGFyZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgLy8gTG9vayBmb3IgYSBwb3RlbnRpYWwgbWF0Y2hpbmcgdmFsdWUgaW4gdGhlIHNldFxuICAgICAgICBjb25zdCBtYXRjaGluZ0VsZW1lbnQgPSBlbGVtZW50cy5maWx0ZXIoKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKGVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB2YWx1ZSAmJlxuICAgICAgICAgICAgICAgICh0aGlzLmFyZVZhbHVlc0VxdWFscyh2YWx1ZSwgZWxlbVRvQ29tcGFyZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcoKSA9PT0gZWxlbVRvQ29tcGFyZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE1hcCB3aXRoIHRoZSBsYWJlbC5cbiAgICAgICAgY29uc3QgbWF0Y2hpbmdWYWx1ZUxhYmVsID0gdGhpcy5nZXRMYWJlbChtYXRjaGluZ0VsZW1lbnRbMF0pO1xuXG4gICAgICAgIC8vIERvbid0IG92ZXJyaWRlIHRoZSB2YWx1ZSBpZiBjdXN0b20gdmFsdWVzIGFyZSBhbGxvd2VkIGFuZCB0aGVyZSdzIG5vIG1hdGNoLlxuICAgICAgICByZXR1cm4gdGhpcy5hbGxvd0N1c3RvbVZhbHVlXG4gICAgICAgICAgICA/IG1hdGNoaW5nVmFsdWVMYWJlbCB8fCB0aGlzLmdldE1vZGVsVmFsdWVEaXNwbGF5VmFsdWUoKVxuICAgICAgICAgICAgOiBtYXRjaGluZ1ZhbHVlTGFiZWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXRjaFJlc3VsdDxUPihlbGVtZW50OiBUKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFZhbHVlID0gbm9ybWFsaXplU2VhcmNoKFxuICAgICAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSxcbiAgICAgICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZVNlYXJjaFxuICAgICAgICApO1xuICAgICAgICBsZXQgbGFiZWwgPSBub3JtYWxpemVTZWFyY2goXG4gICAgICAgICAgICB0aGlzLmdldExhYmVsKGVsZW1lbnQpLFxuICAgICAgICAgICAgdGhpcy5jYXNlU2Vuc2l0aXZlU2VhcmNoXG4gICAgICAgICk7XG4gICAgICAgIGlmICghbGFiZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhYmVsID0gc3RyaXBIdG1sVGFncyhsYWJlbCk7XG4gICAgICAgIHJldHVybiBsYWJlbC5pbmNsdWRlcyhzZWFyY2hWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYW51YWxseVVwZGF0ZVZhbHVlKG5ld1ZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFuZXdWYWx1ZSB8fFxuICAgICAgICAgICAgIXRoaXMubW9kZWwgfHxcbiAgICAgICAgICAgICF0aGlzLmFyZVZhbHVlc0VxdWFscyhuZXdWYWx1ZSwgdGhpcy5tb2RlbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCB0byBkbyBvbiB0b3Agb2YgdGhlIHVwZGF0ZU5nTW9kZWwgYXNcbiAgICAgICAgICAgIC8vIHVwZGF0ZU5nTW9kZWwgY2FuIGJlIHRyaWdnZXJlZCBmcm9tIG90aGVyIHNvdXJjZXMuXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZShuZXdWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZU5nTW9kZWwobmV3VmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q3VzdG9tVmFsdWUodmFsdWU6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIGlmICghdGhpcy5jdXN0b21WYWx1ZU1vZGVsR2VuZXJhdG9yIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVZhbHVlTW9kZWxHZW5lcmF0b3IodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TW9kZWxWYWx1ZURpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMubW9kZWwgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IHRoaXMubW9kZWxcbiAgICAgICAgICAgIDogdGhpcy5nZXRMYWJlbCh0aGlzLm1vZGVsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdFZhbHVlVG9EaXNwbGF5KHZhbHVlOiBhbnksIGVsZW1lbnRzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBDbGVhciB0aGUgdmFsdWUuXG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJFbGVtZW50cyh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsZW1Ub0NvbXBhcmUgPSB2YWx1ZSA/IHZhbHVlIDogdGhpcy5kZWZhdWx0RWxlbWVudFZhbHVlO1xuXG4gICAgICAgIGlmIChlbGVtVG9Db21wYXJlKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSB0aGlzLmdldE1hdGNoaW5nVmFsdWUoZWxlbWVudHMsIGVsZW1Ub0NvbXBhcmUpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJFbGVtZW50cyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWF0Y2hWYWx1ZU9uTW9kZWxDaGFuZ2VTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzU3VnZ2VzdGlvbkxpc3REeW5hbWljKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFZhbHVlVG9EaXNwbGF5T25FbGVtZW50c0xvYWRlZFN1YnNjcmlwdGlvbiA9XG4gICAgICAgICAgICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWxDaGFuZ2UuYXNPYnNlcnZhYmxlKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudHNMb2FkZWQuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID09PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByeGpzLWFuZ3VsYXIvcHJlZmVyLWFzeW5jLXBpcGVcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoW3ZhbHVlLCBlbGVtZW50c10pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFZhbHVlVG9EaXNwbGF5KHZhbHVlLCBlbGVtZW50cylcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ4anMtYW5ndWxhci9wcmVmZXItYXN5bmMtcGlwZVxuICAgICAgICB0aGlzLm1vZGVsQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5tb2RlbENoYW5nZS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RWxlbWVudHMoKVxuICAgICAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoKGVsZW1lbnRzOiBhbnkpID0+ICEhZWxlbWVudHMpKVxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnhqcy9uby1uZXN0ZWQtc3Vic2NyaWJlLHJ4anMtYW5ndWxhci9wcmVmZXItYXN5bmMtcGlwZVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChlbGVtZW50czogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFZhbHVlVG9EaXNwbGF5KHZhbHVlLCBlbGVtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZXNjYXBlUmVnZXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSh0aGlzLlJFR0VYX1RPX0VTQ0FQRV9SRUdFWCwgJ1xcXFwkJicpO1xuICAgIH1cbn1cbiIsIjwhLS1cbiAgICBBY2Nlc3NpYmxlIGF1dG9jb21wbGV0ZSB3aWRnZXQgZm9sbG93aW5nIHRoZSBsaXN0Ym94IGNvbWJvYm94IHBhdHRlcm4uXG4gICAgcmVmOiBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtcHJhY3RpY2VzLTEuMS9leGFtcGxlcy9jb21ib2JveC9hcmlhMS4xcGF0dGVybi9saXN0Ym94LWNvbWJvLmh0bWxcbi0tPlxuPGRpdlxuICAgIGNsYXNzPVwiZm9ybS1ncm91cCBhdXRvY29tcGxldGUtZm9ybS1ncm91cFwiXG4gICAgW2NsYXNzLmhhcy1kYW5nZXJdPVwiaGFzRXJyb3JzVG9EaXNwbGF5KClcIlxuICAgIFtjbGFzcy52ZC1mb3JtLWdyb3VwLWRhbmdlcl09XCJoYXNFcnJvcnNUb0Rpc3BsYXkoKVwiXG4gICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJzaG91bGREaXNwbGF5TGlzdGJveCgpXCJcbiAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIidsaXN0Ym94J1wiXG4gICAgW2F0dHIuaWRdPVwiYnVpbGRJZCgnQ29udGFpbmVyJylcIlxuICAgIHRhYmluZGV4PVwiLTFcIlxuPlxuICAgIDxsYWJlbFxuICAgICAgICBjbGFzcz1cImZvcm0tbGFiZWxcIlxuICAgICAgICBbYXR0ci5mb3JdPVwiYnVpbGRDaGlsZElkKClcIlxuICAgICAgICAqbmdJZj1cIiEhbGFiZWxcIlxuICAgICAgICBbbmdDbGFzc109XCJpc0xhYmVsU3JPbmx5ID8gJ3Zpc3VhbGx5LWhpZGRlbicgOiBsYWJlbFN0eWxlTW9kaWZpZXJcIlxuICAgICAgICBbYXR0ci5pZF09XCJidWlsZENoaWxkSWQoKSArICdMYWJlbCdcIlxuICAgID5cbiAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJsYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiIXJlcXVpcmVkICYmICFoaWRlTm90UmVxdWlyZWRFeHRyYUxhYmVsXCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7ICdmb2Vobi1pbnB1dC5vcHRpb25hbCcgfCBmcm9tRGljdGlvbmFyeSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgPC9sYWJlbD5cblxuICAgIDxmb2Vobi12YWxpZGF0aW9uLWFsZXJ0cyBbY29tcG9uZW50XT1cInRoaXNcIj48L2ZvZWhuLXZhbGlkYXRpb24tYWxlcnRzPlxuXG4gICAgPGRpdiAqbmdJZj1cIiFlbGVtZW50c1wiPkNoYXJnZW1lbnQuLi48L2Rpdj5cblxuICAgIDxzbWFsbFxuICAgICAgICAqbmdJZj1cImhlbHBUZXh0XCJcbiAgICAgICAgW2F0dHIuaWRdPVwiYnVpbGRDaGlsZElkKCkgKyAnSGVscCdcIlxuICAgICAgICBjbGFzcz1cImZvcm0tdGV4dCB0ZXh0LXNlY29uZGFyeVwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwiaGVscFRleHRcIlxuICAgID48L3NtYWxsPlxuXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gICAgPGRpdiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPlxuICAgICAgICBVdGlsaXNleiBsZXMgZmzDqGNoZXMgaGF1dCBldCBiYXMgcG91ciBuYXZpZ3VlciBkYW5zIGxhIGxpc3RlLCBwdWlzIGxhXG4gICAgICAgIHRvdWNoZSBFbnRyZXIgcG91ciBzw6lsZWN0aW9ubmVyIHVuZSBvcHRpb24uXG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEdpdmUgc2NyZWVuIHJlYWRlciB1c2VycyB0aGUgdG90YWwgb2YgcmVzdWx0cyB3aGVuIHRoZW4gaW5wdXQgY2hhbmdlcy4gLS0+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiXG4gICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgIHJvbGU9XCJzdGF0dXNcIlxuICAgICAgICBhcmlhLWF0b21pYz1cInRydWVcIlxuICAgICAgICAqbmdJZj1cImRpc3BsYXllZEVsZW1lbnRzICYmIHNob3VsZERpc3BsYXlMaXN0Ym94KClcIlxuICAgID5cbiAgICAgICAgTm9tYnJlIGRlIHLDqXN1bHRhdHM6IHt7IGRpc3BsYXllZEVsZW1lbnRzLmxlbmd0aCB9fVxuICAgICAgICA8IS0tIFRyaWNrIHRvIGhhdmUgTlZEQSByZS1yZWFkaW5nIHRoaXMgcHJvcGVybHkgLS0+XG4gICAgICAgIDxzcGFuPnt7IG5vdGlmaWNhdGlvbk1lc3NhZ2VVcGRhdGVkID8gJywnIDogJywsJyB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxpbnB1dFxuICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJoYXNFcnJvcnNUb0Rpc3BsYXkoKVwiXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGF1dG9jb21wbGV0ZVwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgcm9sZT1cInRleHRib3hcIlxuICAgICAgICBbbmFtZV09XCJuYW1lIHx8IGxhYmVsXCJcbiAgICAgICAgW2F0dHIuaWRdPVwiYnVpbGRDaGlsZElkKClcIlxuICAgICAgICBbYXR0ci5wbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlciB8fCBudWxsXCJcbiAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiZGlzYWJsZWRTdWJqZWN0IHwgYXN5bmNcIlxuICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImdldERlc2NyaWJlZEJ5KClcIlxuICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cInJlcXVpcmVkIHx8IG51bGxcIlxuICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiaGFzRXJyb3JzVG9EaXNwbGF5KCkgfHwgbnVsbFwiXG4gICAgICAgIFthdHRyLmF1dG9jb21wbGV0ZV09XCInb2ZmJ1wiXG4gICAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJnZXRBY3RpdmVEZXNjZW5kYW50SWQoKVwiXG4gICAgICAgIFthdHRyLmFyaWEtb3duc109XCJcbiAgICAgICAgICAgIHNob3VsZERpc3BsYXlMaXN0Ym94KCkgPyBidWlsZENoaWxkSWQoKSArICdMaXN0Ym94JyA6IG51bGxcbiAgICAgICAgXCJcbiAgICAgICAgW2F0dHIubGlzdF09XCJidWlsZENoaWxkSWQoKSArICdsaXN0J1wiXG4gICAgICAgIFsobmdNb2RlbCldPVwiaW5wdXRWYWx1ZVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNob3dTdWdnZXN0aW9uc1doZW5JbnB1dEhhc0ZvY3VzQW5kSXNFbXB0eSgkZXZlbnQpXCJcbiAgICAgICAgKGlucHV0KT1cImhhbmRsZVNlYXJjaElucHV0Q2hhbmdlKGVudHJ5Q29tcG9uZW50LnZhbHVlKVwiXG4gICAgICAgIChwYXN0ZSk9XCJvblBhc3RlKCRldmVudClcIlxuICAgICAgICAoZm9jdXMpPVwib25JbnB1dEZvY3VzKClcIlxuICAgICAgICAoYmx1cik9XCJvbklucHV0Qmx1cigpXCJcbiAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgICAgICAoY2xpY2spPVwib25JbnB1dENsaWNrKClcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAjZW50cnlDb21wb25lbnRcbiAgICAvPlxuXG4gICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKm5nSWY9XCJkaXNwbGF5Q2xlYXJCdXR0b24oKSB8IGFzeW5jXCJcbiAgICAgICAgY2xhc3M9XCJhdXRvY29tcGxldGUtY2xlYXItYnV0dG9uIGJ0blwiXG4gICAgICAgIChjbGljayk9XCJvbkNsZWFyKClcIlxuICAgICAgICBbaWRdPVwiYnVpbGRDaGlsZElkKCkgKyAnQ2xlYXInXCJcbiAgICA+XG4gICAgICAgIDxmb2Vobi1pY29uLXRpbWVzXG4gICAgICAgICAgICBjbGFzcz1cImF1dG9jb21wbGV0ZS1jbGVhci1idXR0b24taWNvblwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ2ZvZWhuLWlucHV0LmNsZWFyLWJ1dHRvbi5sYWJlbCcgfCBmcm9tRGljdGlvbmFyeVwiXG4gICAgICAgID48L2ZvZWhuLWljb24tdGltZXM+XG4gICAgPC9idXR0b24+XG5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZm9ybS1ncm91cCBzdWdnZXN0aW9ucy1saXN0LWNvbnRhaW5lclwiXG4gICAgICAgICpuZ0lmPVwic2hvdWxkRGlzcGxheUxpc3Rib3goKVwiXG4gICAgPlxuICAgICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XG4gICAgICAgICAgICBbaXRlbVNpemVdPVwiaXRlbUhlaWdodEluU3VnZ2VzdGlvbkxpc3RJblB4XCJcbiAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiVklFV19QT1JUX0hFSUdIVFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImJ1aWxkQ2hpbGRJZCgpICsgJ0xpc3Rib3gnXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYnVpbGRDaGlsZElkKCkgKyAnTGFiZWwnXCJcbiAgICAgICAgICAgICAgICByb2xlPVwibGlzdGJveFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzdWdnZXN0aW9ucy1saXN0XCJcbiAgICAgICAgICAgICAgICAjc3VnZ2VzdGlvbnNMaXN0XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdWdnZXN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgKmNka1ZpcnR1YWxGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50IG9mIGRpc3BsYXllZEVsZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggYXMgaVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJidWlsZENoaWxkSWQoKSArICdPcHRpb24nICsgaVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrU3VnZ2VzdGlvbihlbGVtZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25MaXN0T3B0aW9uTW91c2VEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25MaXN0T3B0aW9uRm9jdXMoKVwiXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uTGlzdE9wdGlvbkJsdXIoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4taGVpZ2h0LnB4XT1cIml0ZW1IZWlnaHRJblN1Z2dlc3Rpb25MaXN0SW5QeFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmxhYmVsLXZhbHVlXT1cImdldExhYmVsKGVsZW1lbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIudmFsdWVdPVwiZ2V0RWxlbWVudElkZW50aWZpZXIoZWxlbWVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBFbnN1cmVzIHRoYXQgc2NyZWVuIHJlYWRlcnMgZG9uJ3QgY29uc2lkZXIgYW55IHNwYWNlcyBhcm91bmQgdGhlIGVtcGhhc2lzIC0tPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cImdldExhYmVsV2l0aEVtcGhhc2lzKGVsZW1lbnQpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19
679
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9laG4tYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1hdXRvY29tcGxldGUvZm9laG4tYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1hdXRvY29tcGxldGUvZm9laG4tYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCw0RUFBNEU7QUFDNUUsT0FBTyxtQ0FBbUMsQ0FBQztBQUUzQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUtMLE1BQU0sRUFHTixTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGVBQWUsRUFDZixhQUFhLEVBRWIsRUFBRSxFQUNGLE9BQU8sRUFFVixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDSCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixLQUFLLEVBQ0wsR0FBRyxFQUNOLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDbkcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7Ozs7O0FBRTNFLCtDQUErQztBQUMvQyxTQUFTLGFBQWEsQ0FBQyxLQUFhO0lBQ2hDLHlGQUF5RjtJQUN6RixJQUFJLE9BQU8sS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsaUJBQWlCO0lBQ2pCLE9BQU8sS0FBSyxDQUFDLFNB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ajBCUSwwQkFBMEI7bUdBQTFCLDBCQUEwQix3ZUFSeEI7WUFDUDtnQkFDSSxPQUFPLEVBQUUsbUJBQW1CO2dCQUM1QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDBCQUEwQixDQUFDO2dCQUN6RCxLQUFLLEVBQUUsSUFBSTthQUNkO1NBQ0osaUZBTVUsd0JBQXdCLGdUQ2xGdkMsOHNLQThJQTs7NEZEaEVhLDBCQUEwQjtrQkFadEMsU0FBUzsrQkFDSSxvQkFBb0IsYUFHbkI7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLG1CQUFtQjs0QkFDNUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsMkJBQTJCLENBQUM7NEJBQ3pELEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKOzJFQU9ELHFCQUFxQjtzQkFEcEIsU0FBUzt1QkFBQyx3QkFBd0I7Z0JBSW5DLGVBQWU7c0JBRGQsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBSTVCLFlBQVk7c0JBRFgsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTdDLHdCQUF3QjtzQkFEdkIsS0FBSztnQkFTTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFPTix1QkFBdUI7c0JBRHRCLEtBQUs7Z0JBV04seUJBQXlCO3NCQUR4QixLQUFLO2dCQUlOLDhCQUE4QjtzQkFEN0IsS0FBSztnQkFRTixzQkFBc0I7c0JBRHJCLEtBQUs7Z0JBSU4sbUJBQW1CO3NCQURsQixLQUFLO2dCQU9OLGVBQWU7c0JBRGQsTUFBTTtnQkF1RUgsUUFBUTtzQkFEWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLy8gVGhpcyBjb21wb25lbnQgdXNlcyBzb21lIEVTNyBmZWF0dXJlcyB0aGF0IGFyZSBub3QgcG9seWZpbGxlZCBieSBBbmd1bGFyLlxuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMnO1xuXG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBCZWhhdmlvclN1YmplY3QsXG4gICAgY29tYmluZUxhdGVzdCxcbiAgICBPYnNlcnZhYmxlLFxuICAgIG9mLFxuICAgIFN1YmplY3QsXG4gICAgU3Vic2NyaXB0aW9uXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgICBkZWJvdW5jZVRpbWUsXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gICAgZmlsdGVyLFxuICAgIGZpcnN0LFxuICAgIG1hcFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEZvZWhuQ2hlY2thYmxlR3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9mb2Vobi1jaGVja2FibGVzL2ZvZWhuLWNoZWNrYWJsZS1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9laG5JbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL2ZvZWhuLWlucHV0L2ZvZWhuLWlucHV0LmNvbXBvbmVudCc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5mdW5jdGlvbiBub3JtYWxpemVVdGY4KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNvbWUgYnJvd3NlcnMgc3VjaCBhcyBJRTExIGRvbid0IHN1cHBvcnQgdGhlIGZlYXR1cmUuIEFkZCB0aGUgcG9seWZpbGwgaWYgeW91IHdhbnQgaXQuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZS5ub3JtYWxpemUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhY2NlbnRzXG4gICAgcmV0dXJuIHZhbHVlLm5vcm1hbGl6ZSgnTkZEJykucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gbm9ybWFsaXplU2VhcmNoKHZhbHVlOiBzdHJpbmcsIGNhc2VTZW5zaXRpdmVTZWFyY2g6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmIChjYXNlU2Vuc2l0aXZlU2VhcmNoKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVVdGY4KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVV0ZjgodmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5mdW5jdGlvbiBzdHJpcEh0bWxUYWdzKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8oPChbXj5dKyk+KS9naSwgJycpO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZvZWhuLWF1dG9jb21wbGV0ZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZvZWhuLWF1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZm9laG4tYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5jc3MnXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogRm9laG5JbnB1dENvbXBvbmVudCxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZvZWhuQXV0b2NvbXBsZXRlQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIEZvZWhuQXV0b2NvbXBsZXRlQ29tcG9uZW50XG4gICAgZXh0ZW5kcyBGb2VobkNoZWNrYWJsZUdyb3VwQ29tcG9uZW50XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzXG57XG4gICAgQFZpZXdDaGlsZChDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQpXG4gICAgdmlydHVhbFNjcm9sbFZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG5cbiAgICBAVmlld0NoaWxkKCdzdWdnZXN0aW9uc0xpc3QnKVxuICAgIHN1Z2dlc3Rpb25zTGlzdDogYW55O1xuXG4gICAgQFZpZXdDaGlsZCgnZW50cnlDb21wb25lbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIGlucHV0RWxlbWVudDogYW55O1xuXG4gICAgQElucHV0KClcbiAgICBzZWFyY2hWYWx1ZU1pbkNoYXJzQ291bnQgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQWxsb3cgdG8gcHJvdmlkZSBjdXN0b20gdmFsdWVzIHRvIHRoZSBhdXRvY29tcGxldGUuXG4gICAgICpcbiAgICAgKiBBIGN1c3RvbSB2YWx1ZSBpcyBhIHZhbHVlIHRoYXQgaXMgbm90IGluIHRoZSBgZWxlbWVudHNgIHNldC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGFsbG93Q3VzdG9tVmFsdWUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBpZiBzdWdnZXN0aW9uIGVsZW1lbnRzIGxpc3QgaXMgYmVpbmcgcmV0cmlldmVkIGR5bmFtaWNhbGx5IHdoaWxlIHVzZXIgaW5wdXRzIGluIHNlYXJjaCBmaWVsZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGlzU3VnZ2VzdGlvbkxpc3REeW5hbWljID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBBbGxvdyB0byBwcm92aWRlIGEgZ2VuZXJhdG9yIHRvIGNyZWF0ZSB0aGUgbW9kZWwgd2l0aCBjdXN0b20gdmFsdWVzLlxuICAgICAqXG4gICAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgdHlwZSBvZiB0aGUgbW9kZWwgaXMgYW4gb2JqZWN0IGFuZCBub3QganVzdFxuICAgICAqIGEgc3RyaW5nLiBVc2UgdGhpcyBpcyBgYWxsb3dDdXN0b21WYWx1ZWAgaXMgdHJ1ZSBhbmQgYGVsZW1lbnRWYWx1ZWBcbiAgICAgKiBpcyBhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgY3VzdG9tVmFsdWVNb2RlbEdlbmVyYXRvcjogKGlucHV0OiBzdHJpbmcpID0+IGFueTtcblxuICAgIEBJbnB1dCgpXG4gICAgaXRlbUhlaWdodEluU3VnZ2VzdGlvbkxpc3RJblB4ID0gNDA7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3VnZ2VzdGlvbiBsYWJlbCB1c2VkIGluIHRoZSBkaXNwbGF5ZWQgbGlzdC4gQ2FuIGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb25cbiAgICAgKiBmYWxsYmFjayBvbiAnZWxlbWVudExhYmVsJ1xuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZWxlbWVudFN1Z2dlc3Rpb25MYWJlbDogYW55O1xuXG4gICAgQElucHV0KClcbiAgICBjYXNlU2Vuc2l0aXZlU2VhcmNoID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHVzZXIgY2hhbmdlcyBzZWFyY2ggaW5wdXQgdmFsdWVcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICB1c2VyU2VhcmNoSW5wdXQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIGlucHV0VmFsdWU6IHN0cmluZztcbiAgICBzZWFyY2hWYWx1ZTogc3RyaW5nO1xuICAgIGlucHV0SGFzRm9jdXM6IGJvb2xlYW47XG4gICAgaGlkZVN1Z2dlc3Rpb25zID0gdHJ1ZTtcbiAgICBjdXJyZW50Qmx1clRpbWVyOiBhbnk7XG4gICAgcGxhY2Vob2xkZXI6IHN0cmluZztcblxuICAgIFZJRVdfUE9SVF9IRUlHSFQ6IG51bWJlcjtcblxuICAgIGRpc3BsYXllZEVsZW1lbnRzOiBhbnlbXTtcbiAgICBub3RpZmljYXRpb25NZXNzYWdlVXBkYXRlZDogYm9vbGVhbjtcblxuICAgIGRpc2FibGVkU3ViamVjdDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gICAgcHJpdmF0ZSBwZW5kaW5nRGlzYWJsZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHJpdmF0ZSBlbGVtZW50c0xvYWRlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIHByaXZhdGUgY3VycmVudEl0ZW1HbG9iYWxJbmRleCA9IC0xO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgTkJfSVRFTVNfVklTSUJMRSA9IDU7XG5cbiAgICBwcml2YXRlIGZpbHRlclN1YmplY3QgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgZmlsdGVyU3ViY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGxpc3RIYXNGb2N1czogYm9vbGVhbjtcbiAgICBwcml2YXRlIGFjdGl2ZURlc2NlbmRhbnRJZDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBvbkluaXRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIG1vZGVsQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBlbGVtZW50c0xvYWRlZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBTVUdHRVNUSU9OX1NFTEVDVEVEX0NMQVNTID0gJ3N1Z2dlc3Rpb24tc2VsZWN0ZWQnO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgRVhDTFVERV9IVE1MX1RBR1NfUkVHRVggPSAnKCg/PVtePl0qPCl8KD8hW148XSo+KSknO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgU1VHR0VTVElPTl9DVVNUT01fQVRUUklCVVRFX0xBQkVMX1ZBTFVFID0gJ2xhYmVsLXZhbHVlJztcbiAgICAvLyBJbnNwaXJlZCBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvR3VpZGUvUmVndWxhcl9FeHByZXNzaW9ucyNlc2NhcGluZ1xuICAgIHByaXZhdGUgcmVhZG9ubHkgUkVHRVhfVE9fRVNDQVBFX1JFR0VYID0gL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nO1xuXG4gICAgcHJpdmF0ZSB1c2VyU2VhcmNoSW5wdXRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIHVzZXJTZWFyY2hJbnB1dFN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgICBwcml2YXRlIHNlbGVjdFZhbHVlVG9EaXNwbGF5T25FbGVtZW50c0xvYWRlZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3Ioem9uZTogTmdab25lKSB7XG4gICAgICAgIHN1cGVyKHpvbmUpO1xuICAgICAgICB0aGlzLmZpbHRlclN1YmNyaXB0aW9uID0gdGhpcy5maWx0ZXJTdWJqZWN0XG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMjAwKSlcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByeGpzLWFuZ3VsYXIvcHJlZmVyLWFzeW5jLXBpcGVcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodGhpcy5maWx0ZXJFbGVtZW50cy5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvLyBOZWVkIHRvIHN1YnNjcmliZSBvbiBFdmVudEVtaXR0ZXIgJ2VsZW1lbnRzTG9hZGVkJyBvdGhlcndpc2UgZWxlbWVudHMgd2l0aCBIVE1MIGRvZXMgbm90IHdvcmsuLi5cbiAgICAgICAgdGhpcy5lbGVtZW50c0xvYWRlZFN1YnNjcmlwdGlvbiA9IHRoaXMuZWxlbWVudHNMb2FkZWRcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgLnBpcGUobWFwKGVsZW1zID0+ICEhZWxlbXMpKVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ4anMtYW5ndWxhci9wcmVmZXItYXN5bmMtcGlwZVxuICAgICAgICAgICAgLnN1YnNjcmliZShsb2FkZWQgPT4gdGhpcy5lbGVtZW50c0xvYWRlZFN1YmplY3QubmV4dChsb2FkZWQpKTtcblxuICAgICAgICB0aGlzLmRpc2FibGVkU3ViamVjdCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nRGlzYWJsZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLFxuICAgICAgICAgICAgdGhpcy5lbGVtZW50c0xvYWRlZFN1YmplY3QuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgXSkucGlwZShtYXAoKFtkaXNhYmxlZF0pID0+IChkaXNhYmxlZCA/ICdkaXNhYmxlZCcgOiBudWxsKSkpO1xuXG4gICAgICAgIHRoaXMuVklFV19QT1JUX0hFSUdIVCA9XG4gICAgICAgICAgICB0aGlzLml0ZW1IZWlnaHRJblN1Z2dlc3Rpb25MaXN0SW5QeCAqIHRoaXMuTkJfSVRFTVNfVklTSUJMRTtcbiAgICB9XG5cbiAgICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBlbmRpbmdEaXNhYmxlZFN1YmplY3QudmFsdWU7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlzYWJsZWRTdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFZhbHVlTWluQ2hhcnNDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ4anMtYW5ndWxhci9wcmVmZXItYXN5bmMtcGlwZVxuICAgICAgICAgICAgdGhpcy5nZXRFbGVtZW50cygpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5ZWRFbGVtZW50cyh0aGlzLmVsZW1lbnRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVmFsdWVNaW5DaGFyc0NvdW50ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IGBTYWlzaXNzZXogYXUgbW9pbnMgJHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlTWluQ2hhcnNDb3VudFxuICAgICAgICAgICAgfSBjYXJhY3TDqHJlJHt0aGlzLnNlYXJjaFZhbHVlTWluQ2hhcnNDb3VudCA+IDEgPyAncycgOiAnJ31gO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkluaXRTdWJzY3JpcHRpb24gPSB0aGlzLm9uSW5pdFN1YmplY3RcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ4anMtYW5ndWxhci9wcmVmZXItYXN5bmMtcGlwZVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSGFjayB0byByZWZyZXNoIHRoZSBkYXRhIG9uY2UgdGhlIGxpc3QgaXMgZG93bmxvYWRlZC5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU5nTW9kZWwodGhpcy5tb2RlbF8pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gV2hlbiB0aGUgbW9kZWwgY2hhbmdlcywgc2VsZWN0IHRoZSByaWdodCB2YWx1ZSB0byBkaXNwbGF5LlxuICAgICAgICB0aGlzLm1hdGNoVmFsdWVPbk1vZGVsQ2hhbmdlU3Vic2NyaXB0aW9uKCk7XG5cbiAgICAgICAgdGhpcy51c2VyU2VhcmNoSW5wdXRTdWJzY3JpcHRpb24gPSB0aGlzLnVzZXJTZWFyY2hJbnB1dFN1YmplY3RcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRvIHRyaWdnZXIgc2VhcmNoZWQgaW5wdXQgaWYgaXQgaGFzIG5vdCBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgd2Ugb25seSBjYXRjaCB0aGUgbGF0ZXN0IG9mIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgLy8gcXVpY2sgdXBkYXRlcywgYW5kIHRvIG1ha2Ugc3VyZSB0aGUgdXNlcklucHV0IGlzIGZpcmVkIHdoZW5cbiAgICAgICAgICAgICAgICAvLyB0aGUgY29tcG9uZW50IGlzIGRvbmUgdXBkYXRpbmcuXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDApXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnhqcy1hbmd1bGFyL3ByZWZlci1hc3luYy1waXBlXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJTZWFyY2hJbnB1dC5lbWl0KHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuXG4gICAgICAgIHRoaXMuZmlsdGVyU3ViY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMub25Jbml0U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLm1vZGVsQ2hhbmdlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmVsZW1lbnRzTG9hZGVkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLnVzZXJTZWFyY2hJbnB1dFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RWYWx1ZVRvRGlzcGxheU9uRWxlbWVudHNMb2FkZWRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgLy8gSGFuZGxlIGNoYW5nZSBvbiB0aGUgZHluYW1pYyBlbGVtZW50cyBpbnB1dC5cbiAgICAgICAgdGhpcy5vbkR5bmFtaWNFbGVtZW50c0NoYW5nZShjaGFuZ2VzLmVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICBvbklucHV0Rm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsdGVyU3ViamVjdC5uZXh0KCk7XG4gICAgICAgIHRoaXMuaW5wdXRIYXNGb2N1cyA9IHRydWU7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICh0aGlzLmlzRW1wdHkodGhpcy5zZWFyY2hWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlTWluQ2hhcnNDb3VudCA9PT0gMCkgfHxcbiAgICAgICAgICAgICghdGhpcy5pc0VtcHR5KHRoaXMuc2VhcmNoVmFsdWUpICYmXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZU1pbkNoYXJzQ291bnQgPD0gdGhpcy5zZWFyY2hWYWx1ZS5sZW5ndGgpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5oaWRlU3VnZ2VzdGlvbnMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJPbkJsdXJUaW1lb3V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbklucHV0Q2xpY2soKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmhpZGVTdWdnZXN0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5vbklucHV0Rm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdvcmthcm91bmQgZm9yIElFMTEgdGhhdCBsb3NlcyBmb2N1cyBvbiBpbnB1dCB3aGVuIHNjcm9sbGJhciBpcyBjbGlja2VkXG4gICAgLy8gLS0+IHB1dCBiYWNrIGZvY3VzIG9uIGlucHV0IGFuZCBjYW5jZWwgc3VnZ2VzdGlvbnMgaGlkaW5nIHRpbWVyXG4gICAgc2V0Rm9jdXNPbklucHV0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIHRoaXMuY2xlYXJPbkJsdXJUaW1lb3V0KCk7XG4gICAgfVxuXG4gICAgb25JbnB1dEJsdXIoKTogdm9pZCB7XG4gICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgb25DbGlja1N1Z2dlc3Rpb24uIFNldHRpbmcgaW5wdXRIYXNGb2N1cyB0byBmYWxzZSBtYWtlcyBzdWdnZXN0aW9ucyBkaXNhcHBlYXJlZFxuICAgICAgICAvLyBhbmQgb25DbGlja1N1Z2dlc3Rpb24gaXMgbmV2ZXIgY2FsbGVkLiBTZXR0aW5nIGEgdGltZW91dCBoZXJlIGF2b2lkIHRoaXMgcHJvYmxlbS5cbiAgICAgICAgdGhpcy5jdXJyZW50Qmx1clRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBEb24ndCBjbG9zZSB0aGUgbGlzdCBpZiB0aGUgbGlzdCBoYXMgdGhlIGZvY3VzLiBUaGlzIGlzIGRvbmUgdG8gYWxsb3cgVm9pY2VPdmVyIHVzZXJzIG9uIGlPUyB0b1xuICAgICAgICAgICAgLy8gc2VsZWN0IGFuIG9wdGlvbiB3aXRoIHRoZWlyIGZpbmdlci4gU2FtZSBpZiBmb2N1cyBpcyBzZXQgb24gbGlzdCBzY3JvbGwgYmFyXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXRoaXMubGlzdEhhc0ZvY3VzICYmXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jbGFzc05hbWUgIT09XG4gICAgICAgICAgICAgICAgICAgICdmb3JtLWdyb3VwIGF1dG9jb21wbGV0ZS1mb3JtLWdyb3VwJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dEhhc0ZvY3VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlU3VnZ2VzdGlvbnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tBbmRTZXRJbnB1dFZhbHVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uS2V5RG93bihrZXlFdmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBUaGUgaW5wdXQgbWlnaHQgbm90IGJlIG1hcmtlZCBhcyBmb2N1c2VkIGluIGNhc2UgdGhlIHVzZXIgc2VsZWN0cyBhIHZhbHVlIGZyb20gdGhlIGxpc3QuXG4gICAgICAgIHRoaXMuaW5wdXRIYXNGb2N1cyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHByb3BhZ2F0ZSA9IHRoaXMub25LZXlEb3duSW5uZXIoa2V5RXZlbnQpO1xuICAgICAgICBpZiAocHJvcGFnYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlclN1YmplY3QubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wYWdhdGU7XG4gICAgfVxuXG4gICAgb25LZXlEb3duSW5uZXIoa2V5RXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICAgICAgLy8gSUUgZG9lc24ndCBzdXBwb3J0IGtleUV2ZW50LmNvZGUsIGFuZCBoYXMgZGlmZmVyZW50IHZhbHVlc1xuICAgICAgICAvLyBpbiBrZXlFdmVudC5rZXkgKERvd24gaW5zdGVhZCBvZiBBcnJvd0Rvd24gZm9yIGluc3RhbmNlKSwgaGVuY2UgdGhlIG11bHRpLXN1cHBvcnQuXG4gICAgICAgIGNvbnN0IGllMTFDb21wYXRpYmxlQ29kZSA9IGtleUV2ZW50LmNvZGUgfHwga2V5RXZlbnQua2V5O1xuICAgICAgICBzd2l0Y2ggKGllMTFDb21wYXRpYmxlQ29kZSkge1xuICAgICAgICAgICAgY2FzZSAnRG93bic6XG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zdWdnZXN0aW9uc0Rpc3BsYXllZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb25zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdE5leHRFbGVtZW50KHRydWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnVXAnOlxuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3ROZXh0RWxlbWVudChmYWxzZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdTcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdTcGFjZWJhcic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0U2VsZWN0ZWRFbGVtZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5nZXRTZWxlY3RlZEVsZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0Rmlyc3RTdWdnZXN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEp1c3QgYmVmb3JlIGZvcm0gc3VibWl0LCBjYWxscyBjaGVja0FuZFNldElucHV0VmFsdWUgYmVjYXVzZSBmb2N1c291dCBpcyBjYWxsZWQgdG9vIGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChuZXcgdmFsdWUgaXMgYWxyZWFkeSBsb3N0KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tBbmRTZXRJbnB1dFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBhdXRvY29tcGxldGUgd2l0aG91dCBuZWVkIHRvIHNlbGVjdCBpdCBtYW51YWxseVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldElucHV0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQW5kU2V0SW5wdXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0FuZFNldElucHV0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgY2FzZSAnUmlnaHQnOlxuICAgICAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldFNlbGVjdGVkRWxlbWVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tBbmRTZXRJbnB1dFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25zRGlzcGxheWVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlU3VnZ2VzdGlvbnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgb25MaXN0T3B0aW9uTW91c2VEb3duKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gU2FmYXJpIHRyaWdnZXJzIGZvY3VzT3V0IGJlZm9yZSBjbGljaywgYnV0IGlmIHlvdVxuICAgICAgICAvLyBwcmV2ZW50RGVmYXVsdCBvbiBtb3VzZURvd24sIHlvdSBjYW4gc3RvcCB0aGF0IGZyb20gaGFwcGVuaW5nLlxuICAgICAgICAvLyBJZiB0aGlzIGlzIHJlbW92ZWQsIGNsaWNraW5nIG9uIGFuIG9wdGlvbiBpbiBTYWZhcmkgd2lsbCB0cmlnZ2VyXG4gICAgICAgIC8vIGBoYW5kbGVPcHRpb25CbHVyYCwgd2hpY2ggY2xvc2VzIHRoZSBtZW51LCBhbmQgdGhlIGNsaWNrIHdpbGxcbiAgICAgICAgLy8gdHJpZ2dlciBvbiB0aGUgZWxlbWVudCB1bmRlcm5lYXRoIGluc3RlYWQuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgb25MaXN0T3B0aW9uRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubGlzdEhhc0ZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBvbkxpc3RPcHRpb25CbHVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxpc3RIYXNGb2N1cyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGZpbHRlckVsZW1lbnRzKGhpZGVTdWdnZXN0aW9uczogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB0aGlzLmlucHV0VmFsdWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmlzRW1wdHkodGhpcy5zZWFyY2hWYWx1ZSkgfHxcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVmFsdWUubGVuZ3RoIDwgdGhpcy5zZWFyY2hWYWx1ZU1pbkNoYXJzQ291bnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hWYWx1ZU1pbkNoYXJzQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERpc3BsYXllZEVsZW1lbnRzKHRoaXMuZWxlbWVudHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN1Z2dlc3Rpb25zRGlzcGxheWVkKHRydWUsIFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3VnZ2VzdGlvbnNEaXNwbGF5ZWQoXG4gICAgICAgICAgICAgICAgaGlkZVN1Z2dlc3Rpb25zLFxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudHMuZmlsdGVyKChlOiBhbnkpID0+IHRoaXMubWF0Y2hSZXN1bHQoZSkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0U3VnZ2VzdGlvbkxhYmVsKGVsZW1lbnQ6IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50U3VnZ2VzdGlvbkxhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRMYWJlbChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZWxlbWVudFN1Z2dlc3Rpb25MYWJlbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE5lc3RlZFByb3BlcnR5KGVsZW1lbnQsIHRoaXMuZWxlbWVudFN1Z2dlc3Rpb25MYWJlbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFN1Z2dlc3Rpb25MYWJlbChlbGVtZW50KTtcbiAgICB9XG5cbiAgICBnZXRMYWJlbFdpdGhFbXBoYXNpcyhlbGVtOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICBsZXQgbGFiZWwgPSB0aGlzLmdldFN1Z2dlc3Rpb25MYWJlbChlbGVtKTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNFbXB0eSh0aGlzLnNlYXJjaFZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgaGFzUmVnZXhwQ2hhcnNUb0VzY2FwZSA9IFJlZ0V4cChcbiAgICAgICAgICAgICAgICB0aGlzLlJFR0VYX1RPX0VTQ0FQRV9SRUdFWC5zb3VyY2VcbiAgICAgICAgICAgICkudGVzdCh0aGlzLnNlYXJjaFZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4U2VhcmNoVmFsdWUgPSBoYXNSZWdleHBDaGFyc1RvRXNjYXBlXG4gICAgICAgICAgICAgICAgPyB0aGlzLmVzY2FwZVJlZ2V4cChcbiAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVTZWFyY2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZVNlYXJjaFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IG5vcm1hbGl6ZVNlYXJjaCh0aGlzLnNlYXJjaFZhbHVlLCB0aGlzLmNhc2VTZW5zaXRpdmVTZWFyY2gpO1xuICAgICAgICAgICAgY29uc3QgcmVnZXhTdHIgPSBgJHtyZWdleFNlYXJjaFZhbHVlfSR7dGhpcy5FWENMVURFX0hUTUxfVEFHU19SRUdFWH1gO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IG5vcm1hbGl6ZVNlYXJjaChcbiAgICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNhc2VTZW5zaXRpdmVTZWFyY2hcbiAgICAgICAgICAgICkuc2VhcmNoKHJlZ2V4U3RyKTtcbiAgICAgICAgICAgIGlmIChzdGFydEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gYCR7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPiAwID8gbGFiZWwuc3Vic3RyaW5nKDAsIHN0YXJ0SW5kZXgpIDogJydcbiAgICAgICAgICAgICAgICB9PGI+JHtsYWJlbC5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggKyB0aGlzLnNlYXJjaFZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgICAgICl9PC9iPiR7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLmxlbmd0aCA+IHN0YXJ0SW5kZXggKyB0aGlzLnNlYXJjaFZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBsYWJlbC5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ICsgdGhpcy5zZWFyY2hWYWx1ZS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgIH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxhYmVsO1xuICAgIH1cblxuICAgIG9uQ2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm9uQ2xlYXIoKTtcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYW5kbGVTZWFyY2hJbnB1dENoYW5nZShudWxsKTtcbiAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB0aGlzLmhpZGVTdWdnZXN0aW9ucyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZpbHRlckVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgZGlzcGxheUNsZWFyQnV0dG9uKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gb2YoISF0aGlzLmlucHV0VmFsdWUgJiYgIXRoaXMuZGlzYWJsZWQpO1xuICAgIH1cblxuICAgIG9uQ2xpY2tTdWdnZXN0aW9uKGVsZW1lbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldElucHV0VmFsdWUodGhpcy5nZXRMYWJlbChlbGVtZW50KSk7XG4gICAgICAgIHRoaXMuY2hlY2tBbmRTZXRJbnB1dFZhbHVlKCk7XG5cbiAgICAgICAgLy8gRm9yY2UgdGhlIGZvY3VzIG9uIHRoZSBpbnB1dCB0byBlbnN1cmUgdGhhdCBWb2ljZU92ZXIgZG9lc24ndCBzZXQgdGhlIGZvY3VzIG9uIGFub3RoZXIgZmllbGQgb24gdGhlIHBhZ2UuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRGb2N1c09uSW5wdXQoKTtcbiAgICAgICAgICAgIC8vIFRoZSBpbnB1dCBzaG91bGRuJ3QgYmUgbWFya2VkIGFzIGZvY3VzZWQgYXMgd2UgZG9uJ3Qgd2FudCB0byBkaXNwbGF5IHRoZSBsaXN0LlxuICAgICAgICAgICAgdGhpcy5pbnB1dEhhc0ZvY3VzID0gZmFsc2U7XG4gICAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldElucHV0VmFsdWUobnVsbCk7XG4gICAgICAgIHRoaXMuY2hlY2tBbmRTZXRJbnB1dFZhbHVlKCk7XG4gICAgfVxuXG4gICAgc2hvdWxkRGlzcGxheUxpc3Rib3goKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGlzVmlzaWJsZSA9XG4gICAgICAgICAgICB0aGlzLmlucHV0SGFzRm9jdXMgJiZcbiAgICAgICAgICAgICF0aGlzLmhpZGVTdWdnZXN0aW9ucyAmJlxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRFbGVtZW50cyAmJlxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRFbGVtZW50cy5sZW5ndGggPiAwO1xuICAgICAgICBpZiAoIWlzVmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SXRlbUdsb2JhbEluZGV4ID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzVmlzaWJsZTtcbiAgICB9XG5cbiAgICBnZXRBY3RpdmVEZXNjZW5kYW50SWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvdWxkRGlzcGxheUxpc3Rib3goKSAmJiB0aGlzLmFjdGl2ZURlc2NlbmRhbnRJZFxuICAgICAgICAgICAgPyB0aGlzLmFjdGl2ZURlc2NlbmRhbnRJZFxuICAgICAgICAgICAgOiBudWxsO1xuICAgIH1cblxuICAgIHNob3dTdWdnZXN0aW9uc1doZW5JbnB1dEhhc0ZvY3VzQW5kSXNFbXB0eSh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXZhbCAmJiB0aGlzLmlucHV0SGFzRm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb25zID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckVsZW1lbnRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVTZWFyY2hJbnB1dENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy51c2VyU2VhcmNoSW5wdXRTdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25EeW5hbWljRWxlbWVudHNDaGFuZ2UoY2hhbmdlOiBTaW1wbGVDaGFuZ2UpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3VnZ2VzdGlvbkxpc3REeW5hbWljKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZSAmJiAhY2hhbmdlLmZpcnN0Q2hhbmdlICYmICEhdGhpcy5zZWFyY2hWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5nZXRFbGVtZW50cygpXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnhqcy1hbmd1bGFyL3ByZWZlci1hc3luYy1waXBlXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3VnZ2VzdGlvbnNEaXNwbGF5ZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudHMuZmlsdGVyKChlOiBhbnkpID0+IHRoaXMubWF0Y2hSZXN1bHQoZSkpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFyT25CbHVyVGltZW91dCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEJsdXJUaW1lcikge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY3VycmVudEJsdXJUaW1lcik7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRCbHVyVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTZWxlY3RlZEVsZW1lbnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLmdldFNlbGVjdGVkRWxlbWVudCgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldElucHV0VmFsdWUoXG4gICAgICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIGhpZGVTdWdnZXN0aW9uczogYm9vbGVhbiA9IHRydWVcbiAgICApOiB2b2lkIHtcbiAgICAgICAgaWYgKGhpZGVTdWdnZXN0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgICAgIG5ldyBJbnB1dEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhpZGVTdWdnZXN0aW9ucyA9IGhpZGVTdWdnZXN0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWZXJpZmllcyBpZiB2YWx1ZSBpbiBpbnB1dCBtYXRjaGVzIGEgdmFsdWUgZnJvbSBzdWdnZXN0aW9ucy4gSWYgbm90LCBlbXB0eSB0aGUgaW5wdXQgaWYgdGhlIGN1c3RvbSB2YWx1ZVxuICAgICAqIG9wdGlvbiBpcyBub3Qgc2V0LlxuICAgICAqL1xuICAgIHByaXZhdGUgY2hlY2tBbmRTZXRJbnB1dFZhbHVlKCk6IHZvaWQge1xuICAgICAgICBpZiAoISF0aGlzLmlucHV0VmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nRWxlbWVudCA9IHRoaXMuZWxlbWVudHMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChhOiBhbnkpID0+IHRoaXMuZ2V0TGFiZWwoYSkgPT09IHRoaXMuaW5wdXRWYWx1ZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKG1hdGNoaW5nRWxlbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUobWF0Y2hpbmdFbGVtZW50WzBdKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1hbnVhbGx5VXBkYXRlVmFsdWUobmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuYWxsb3dDdXN0b21WYWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld01vZGVsID0gdGhpcy5nZXRDdXN0b21WYWx1ZSh0aGlzLmlucHV0VmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMubWFudWFsbHlVcGRhdGVWYWx1ZShuZXdNb2RlbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYW51YWxseVVwZGF0ZVZhbHVlKG51bGwpO1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFN1Z2dlc3Rpb25zRGlzcGxheWVkKFxuICAgICAgICBoaWRlU3VnZ2VzdGlvbnM6IGJvb2xlYW4sXG4gICAgICAgIGRpc3BsYXllZEVsZW1lbnRzOiBhbnlbXVxuICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldERpc3BsYXllZEVsZW1lbnRzKGRpc3BsYXllZEVsZW1lbnRzKTtcbiAgICAgICAgdGhpcy5oaWRlU3VnZ2VzdGlvbnMgPSBoaWRlU3VnZ2VzdGlvbnM7XG4gICAgICAgIHRoaXMubm90aWZ5U2NyZWVuUmVhZGVyVXNlcnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldERpc3BsYXllZEVsZW1lbnRzKGZpbHRlcmVkRWxlbWVudHM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmFjdGl2ZURlc2NlbmRhbnRJZCA9IG51bGw7XG4gICAgICAgIHRoaXMuZGlzcGxheWVkRWxlbWVudHMgPSBmaWx0ZXJlZEVsZW1lbnRzO1xuXG4gICAgICAgIHRoaXMucmVzaXplRGlzcGxheVZpZXdQb3J0KGZpbHRlcmVkRWxlbWVudHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzaXplRGlzcGxheVZpZXdQb3J0KGZpbHRlcmVkRWxlbWVudHM6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAoISFmaWx0ZXJlZEVsZW1lbnRzKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyZWRFbGVtZW50cy5sZW5ndGggPCB0aGlzLk5CX0lURU1TX1ZJU0lCTEUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLlZJRVdfUE9SVF9IRUlHSFQgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1IZWlnaHRJblN1Z2dlc3Rpb25MaXN0SW5QeCAqXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRWxlbWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmICghIXRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBNQVhfSEVJR0hUID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5OQl9JVEVNU19WSVNJQkxFICogdGhpcy5pdGVtSGVpZ2h0SW5TdWdnZXN0aW9uTGlzdEluUHg7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuVklFV19QT1JUX0hFSUdIVCA8IE1BWF9IRUlHSFQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5WSUVXX1BPUlRfSEVJR0hUID0gTUFYX0hFSUdIVDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlbGVjdGVkRWxlbWVudCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5zdWdnZXN0aW9uc0xpc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gdGhpcy5nZXRTdWdnZXN0aW9uTGlzdCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpbmRleFN0ciBpbiBzdWdnZXN0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9ucy5oYXNPd25Qcm9wZXJ0eShpbmRleFN0cikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChpbmRleFN0ciwgMTApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHN1Z2dlc3Rpb25zW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNsYXNzTmFtZS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5TVUdHRVNUSU9OX1NFTEVDVEVEX0NMQVNTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNVR0dFU1RJT05fQ1VTVE9NX0FUVFJJQlVURV9MQUJFTF9WQUxVRVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3ROZXh0RWxlbWVudChkb3duOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25zRGlzcGxheWVkKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gdGhpcy5nZXRTdWdnZXN0aW9uTGlzdCgpO1xuICAgICAgICAgICAgbGV0IG5ld0l0ZW1TZWxlY3RlZCA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBzdGVwID0gZG93biA/IDEgOiAtMTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBpbmRleFN0ciBpbiBzdWdnZXN0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9ucy5oYXNPd25Qcm9wZXJ0eShpbmRleFN0cikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChpbmRleFN0ciwgMTApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHN1Z2dlc3Rpb25zW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRJbmRleDogbnVtYmVyID0gaW5kZXggKyBzdGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50SXRlbVNlbGVjdGVkID0gaXRlbS5jbGFzc05hbWUuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5TVUdHRVNUSU9OX1NFTEVDVEVEX0NMQVNTXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bnNlbGVjdEl0ZW0oaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDdXJyZW50SXRlbVNlbGVjdGVkICYmIG5leHRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3SXRlbVNlbGVjdGVkID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRJbmRleCA8IHN1Z2dlc3Rpb25zLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3VnZ2VzdGlvbnNbbmV4dEluZGV4XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3VnZ2VzdGlvbnNbc3VnZ2VzdGlvbnMubGVuZ3RoIC0gMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgbm8gaXRlbSB3YXMgc2VsZWN0ZWQgYmVmb3JlLCBzZWxlY3QgZmlyc3Qgb25lXG4gICAgICAgICAgICBpZiAoIW5ld0l0ZW1TZWxlY3RlZCAmJiBzdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SXRlbUdsb2JhbEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oKG5ld0l0ZW1TZWxlY3RlZCA9IHN1Z2dlc3Rpb25zWzBdKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE1hbmFnZSBnbG9iYWwgaXRlbSBzZWxlY3RlZCBpbmRleFxuICAgICAgICAgICAgICAgIGNvbnN0IE1BWF9JTkRFWCA9IHRoaXMuZGlzcGxheWVkRWxlbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJdGVtR2xvYmFsSW5kZXggKz0gc3RlcDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50SXRlbUdsb2JhbEluZGV4ID4gTUFYX0lOREVYKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEl0ZW1HbG9iYWxJbmRleCA9IE1BWF9JTkRFWDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudEl0ZW1HbG9iYWxJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SXRlbUdsb2JhbEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNjcm9sbHMgZG93biBvciB1cCBpZiBuZXdJdGVtU2VsZWN0ZWQgaXMgbm90IHZpc2libGVcbiAgICAgICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zTmF0aXZlRWxlbWVudCA9XG4gICAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmlzaWJsZShzdWdnZXN0aW9uc05hdGl2ZUVsZW1lbnQsIG5ld0l0ZW1TZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydC5zY3JvbGxUb0luZGV4KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJdGVtR2xvYmFsSW5kZXhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTdWdnZXN0aW9uTGlzdCgpOiBIVE1MRWxlbWVudFtdIHtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnNOYXRpdmVFbGVtZW50ID0gdGhpcy5zdWdnZXN0aW9uc0xpc3QubmF0aXZlRWxlbWVudDtcbiAgICAgICAgLy8gQ29udmVydHMgdGhlIHN1Z2dlc3Rpb25zIHRvIGFuIGFycmF5IHRvIHdvcmsgY29uc2lzdGVudGx5IGFjcm9zcyBicm93c2Vycy5cbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHN1Z2dlc3Rpb25zTmF0aXZlRWxlbWVudC5jaGlsZHJlbik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bnNlbGVjdEl0ZW0oaXRlbTogYW55KTogdm9pZCB7XG4gICAgICAgIGl0ZW0uY2xhc3NOYW1lID0gaXRlbS5jbGFzc05hbWUucmVwbGFjZShcbiAgICAgICAgICAgIGAgJHt0aGlzLlNVR0dFU1RJT05fU0VMRUNURURfQ0xBU1N9YCxcbiAgICAgICAgICAgICcnXG4gICAgICAgICk7XG4gICAgICAgIGl0ZW0uYXR0cmlidXRlc1snYXJpYS1zZWxlY3RlZCddID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RJdGVtKGl0ZW06IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAoIWl0ZW0uY2xhc3NOYW1lLmluY2x1ZGVzKHRoaXMuU1VHR0VTVElPTl9TRUxFQ1RFRF9DTEFTUykpIHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NOYW1lICs9IGAgJHt0aGlzLlNVR0dFU1RJT05fU0VMRUNURURfQ0xBU1N9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uYXR0cmlidXRlc1snYXJpYS1zZWxlY3RlZCddID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmFjdGl2ZURlc2NlbmRhbnRJZCA9IGl0ZW0uaWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1Zpc2libGUocGFyZW50OiBhbnksIGVsZW1lbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbGVtZW50T2Zmc2V0VG9wID1cbiAgICAgICAgICAgIGVsZW1lbnQub2Zmc2V0VG9wICtcbiAgICAgICAgICAgIHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0LmdldE9mZnNldFRvUmVuZGVyZWRDb250ZW50U3RhcnQoKTtcbiAgICAgICAgLy8gZWxlbWVudCBpcyBiZWxvdyB2aXNpYmxlIGFyZWFcbiAgICAgICAgY29uc3QgaXNCZWxvdyA9XG4gICAgICAgICAgICBlbGVtZW50T2Zmc2V0VG9wIDwgcGFyZW50Lm9mZnNldEhlaWdodCArIHBhcmVudC5zY3JvbGxUb3A7XG4gICAgICAgIC8vIGVsZW1lbnQgaXMgYWJvdmUgdmlzaWJsZSBhcmVhXG4gICAgICAgIGNvbnN0IGlzQWJvdmUgPSBlbGVtZW50T2Zmc2V0VG9wID4gcGFyZW50LnNjcm9sbFRvcDtcbiAgICAgICAgcmV0dXJuIGlzQmVsb3cgJiYgaXNBYm92ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN1Z2dlc3Rpb25zRGlzcGxheWVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5zdWdnZXN0aW9uc0xpc3QgJiZcbiAgICAgICAgICAgIHRoaXMuc3VnZ2VzdGlvbnNMaXN0Lm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Rmlyc3RTdWdnZXN0aW9uKCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuc3VnZ2VzdGlvbnNMaXN0ICYmXG4gICAgICAgICAgICB0aGlzLnN1Z2dlc3Rpb25zTGlzdC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN1Z2dlc3Rpb25zTGlzdC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuWzBdLmlubmVyVGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdGlmeVNjcmVlblJlYWRlclVzZXJzKCk6IHZvaWQge1xuICAgICAgICAvLyBGb3JjZXMgTlZEQSB0byByZS1yZWFkIHRoZSBjb250ZW50IG9mIHRoZSBzYy1vbmx5IG5vdGlmaWNhdGlvbi5cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlVXBkYXRlZCA9ICF0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VVcGRhdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWF0Y2hpbmdWYWx1ZShlbGVtZW50czogYW55LCBlbGVtVG9Db21wYXJlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyBMb29rIGZvciBhIHBvdGVudGlhbCBtYXRjaGluZyB2YWx1ZSBpbiB0aGUgc2V0XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nRWxlbWVudCA9IGVsZW1lbnRzLmZpbHRlcigoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoZWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHZhbHVlICYmXG4gICAgICAgICAgICAgICAgKHRoaXMuYXJlVmFsdWVzRXF1YWxzKHZhbHVlLCBlbGVtVG9Db21wYXJlKSB8fFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZygpID09PSBlbGVtVG9Db21wYXJlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTWFwIHdpdGggdGhlIGxhYmVsLlxuICAgICAgICBjb25zdCBtYXRjaGluZ1ZhbHVlTGFiZWwgPSB0aGlzLmdldExhYmVsKG1hdGNoaW5nRWxlbWVudFswXSk7XG5cbiAgICAgICAgLy8gRG9uJ3Qgb3ZlcnJpZGUgdGhlIHZhbHVlIGlmIGN1c3RvbSB2YWx1ZXMgYXJlIGFsbG93ZWQgYW5kIHRoZXJlJ3Mgbm8gbWF0Y2guXG4gICAgICAgIHJldHVybiB0aGlzLmFsbG93Q3VzdG9tVmFsdWVcbiAgICAgICAgICAgID8gbWF0Y2hpbmdWYWx1ZUxhYmVsIHx8IHRoaXMuZ2V0TW9kZWxWYWx1ZURpc3BsYXlWYWx1ZSgpXG4gICAgICAgICAgICA6IG1hdGNoaW5nVmFsdWVMYWJlbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hdGNoUmVzdWx0PFQ+KGVsZW1lbnQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoVmFsdWUgPSBub3JtYWxpemVTZWFyY2goXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlLFxuICAgICAgICAgICAgdGhpcy5jYXNlU2Vuc2l0aXZlU2VhcmNoXG4gICAgICAgICk7XG4gICAgICAgIGxldCBsYWJlbCA9IG5vcm1hbGl6ZVNlYXJjaChcbiAgICAgICAgICAgIHRoaXMuZ2V0TGFiZWwoZWxlbWVudCksXG4gICAgICAgICAgICB0aGlzLmNhc2VTZW5zaXRpdmVTZWFyY2hcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFsYWJlbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFiZWwgPSBzdHJpcEh0bWxUYWdzKGxhYmVsKTtcbiAgICAgICAgcmV0dXJuIGxhYmVsLmluY2x1ZGVzKHNlYXJjaFZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hbnVhbGx5VXBkYXRlVmFsdWUobmV3VmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIW5ld1ZhbHVlIHx8XG4gICAgICAgICAgICAhdGhpcy5tb2RlbCB8fFxuICAgICAgICAgICAgIXRoaXMuYXJlVmFsdWVzRXF1YWxzKG5ld1ZhbHVlLCB0aGlzLm1vZGVsKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IHRvIGRvIG9uIHRvcCBvZiB0aGUgdXBkYXRlTmdNb2RlbCBhc1xuICAgICAgICAgICAgLy8gdXBkYXRlTmdNb2RlbCBjYW4gYmUgdHJpZ2dlcmVkIGZyb20gb3RoZXIgc291cmNlcy5cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlKG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlTmdNb2RlbChuZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDdXN0b21WYWx1ZSh2YWx1ZTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgaWYgKCF0aGlzLmN1c3RvbVZhbHVlTW9kZWxHZW5lcmF0b3IgfHwgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tVmFsdWVNb2RlbEdlbmVyYXRvcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRNb2RlbFZhbHVlRGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5tb2RlbCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gdGhpcy5tb2RlbFxuICAgICAgICAgICAgOiB0aGlzLmdldExhYmVsKHRoaXMubW9kZWwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0VmFsdWVUb0Rpc3BsYXkodmFsdWU6IGFueSwgZWxlbWVudHM6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIENsZWFyIHRoZSB2YWx1ZS5cbiAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckVsZW1lbnRzKHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWxlbVRvQ29tcGFyZSA9IHZhbHVlID8gdmFsdWUgOiB0aGlzLmRlZmF1bHRFbGVtZW50VmFsdWU7XG5cbiAgICAgICAgaWYgKGVsZW1Ub0NvbXBhcmUpIHtcbiAgICAgICAgICAgIC8vIFBSRVNUQUtJVC03MTM6IG5lZWQgdG8gdXNlIHNldFRpbWVvdXQgKG5vdCBuZ1pvbmUgYmVjYXVzZSBkb2Vzbid0IHdvcmspXG4gICAgICAgICAgICAvLyB0byBhdm9pZCBoYXZpbmcgYSB2YWx1ZSBpbiBtb2RlbCB3aGljaCBpcyBub3QgZGlzcGxheWVkIG9uIHNjcmVlblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gdGhpcy5nZXRNYXRjaGluZ1ZhbHVlKFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgZWxlbVRvQ29tcGFyZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJFbGVtZW50cyh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXRjaFZhbHVlT25Nb2RlbENoYW5nZVN1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTdWdnZXN0aW9uTGlzdER5bmFtaWMpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0VmFsdWVUb0Rpc3BsYXlPbkVsZW1lbnRzTG9hZGVkU3Vic2NyaXB0aW9uID1cbiAgICAgICAgICAgICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbENoYW5nZS5hc09ic2VydmFibGUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50c0xvYWRlZC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ4anMtYW5ndWxhci9wcmVmZXItYXN5bmMtcGlwZVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChbdmFsdWUsIGVsZW1lbnRzXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0VmFsdWVUb0Rpc3BsYXkodmFsdWUsIGVsZW1lbnRzKVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnhqcy1hbmd1bGFyL3ByZWZlci1hc3luYy1waXBlXG4gICAgICAgIHRoaXMubW9kZWxDaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLm1vZGVsQ2hhbmdlLnN1YnNjcmliZShcbiAgICAgICAgICAgICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRFbGVtZW50cygpXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcigoZWxlbWVudHM6IGFueSkgPT4gISFlbGVtZW50cykpXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByeGpzL25vLW5lc3RlZC1zdWJzY3JpYmUscnhqcy1hbmd1bGFyL3ByZWZlci1hc3luYy1waXBlXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGVsZW1lbnRzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0VmFsdWVUb0Rpc3BsYXkodmFsdWUsIGVsZW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlc2NhcGVSZWdleHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKHRoaXMuUkVHRVhfVE9fRVNDQVBFX1JFR0VYLCAnXFxcXCQmJyk7XG4gICAgfVxufVxuIiwiPCEtLVxuICAgIEFjY2Vzc2libGUgYXV0b2NvbXBsZXRlIHdpZGdldCBmb2xsb3dpbmcgdGhlIGxpc3Rib3ggY29tYm9ib3ggcGF0dGVybi5cbiAgICByZWY6IGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS1wcmFjdGljZXMtMS4xL2V4YW1wbGVzL2NvbWJvYm94L2FyaWExLjFwYXR0ZXJuL2xpc3Rib3gtY29tYm8uaHRtbFxuLS0+XG48ZGl2XG4gICAgY2xhc3M9XCJmb3JtLWdyb3VwIGF1dG9jb21wbGV0ZS1mb3JtLWdyb3VwXCJcbiAgICBbY2xhc3MuaGFzLWRhbmdlcl09XCJoYXNFcnJvcnNUb0Rpc3BsYXkoKVwiXG4gICAgW2NsYXNzLnZkLWZvcm0tZ3JvdXAtZGFuZ2VyXT1cImhhc0Vycm9yc1RvRGlzcGxheSgpXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInNob3VsZERpc3BsYXlMaXN0Ym94KClcIlxuICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ2xpc3Rib3gnXCJcbiAgICBbYXR0ci5pZF09XCJidWlsZElkKCdDb250YWluZXInKVwiXG4gICAgdGFiaW5kZXg9XCItMVwiXG4+XG4gICAgPGxhYmVsXG4gICAgICAgIGNsYXNzPVwiZm9ybS1sYWJlbFwiXG4gICAgICAgIFthdHRyLmZvcl09XCJidWlsZENoaWxkSWQoKVwiXG4gICAgICAgICpuZ0lmPVwiISFsYWJlbFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cImlzTGFiZWxTck9ubHkgPyAndmlzdWFsbHktaGlkZGVuJyA6IGxhYmVsU3R5bGVNb2RpZmllclwiXG4gICAgICAgIFthdHRyLmlkXT1cImJ1aWxkQ2hpbGRJZCgpICsgJ0xhYmVsJ1wiXG4gICAgPlxuICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cImxhYmVsXCI+PC9zcGFuPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCIhcmVxdWlyZWQgJiYgIWhpZGVOb3RSZXF1aXJlZEV4dHJhTGFiZWxcIlxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3sgJ2ZvZWhuLWlucHV0Lm9wdGlvbmFsJyB8IGZyb21EaWN0aW9uYXJ5IH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuXG4gICAgPGZvZWhuLXZhbGlkYXRpb24tYWxlcnRzIFtjb21wb25lbnRdPVwidGhpc1wiPjwvZm9laG4tdmFsaWRhdGlvbi1hbGVydHM+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiIWVsZW1lbnRzXCI+Q2hhcmdlbWVudC4uLjwvZGl2PlxuXG4gICAgPHNtYWxsXG4gICAgICAgICpuZ0lmPVwiaGVscFRleHRcIlxuICAgICAgICBbYXR0ci5pZF09XCJidWlsZENoaWxkSWQoKSArICdIZWxwJ1wiXG4gICAgICAgIGNsYXNzPVwiZm9ybS10ZXh0IHRleHQtc2Vjb25kYXJ5XCJcbiAgICAgICAgW2lubmVySFRNTF09XCJoZWxwVGV4dFwiXG4gICAgPjwvc21hbGw+XG5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbiAgICA8ZGl2IGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+XG4gICAgICAgIFV0aWxpc2V6IGxlcyBmbMOoY2hlcyBoYXV0IGV0IGJhcyBwb3VyIG5hdmlndWVyIGRhbnMgbGEgbGlzdGUsIHB1aXMgbGFcbiAgICAgICAgdG91Y2hlIEVudHJlciBwb3VyIHPDqWxlY3Rpb25uZXIgdW5lIG9wdGlvbi5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gR2l2ZSBzY3JlZW4gcmVhZGVyIHVzZXJzIHRoZSB0b3RhbCBvZiByZXN1bHRzIHdoZW4gdGhlbiBpbnB1dCBjaGFuZ2VzLiAtLT5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCJcbiAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgcm9sZT1cInN0YXR1c1wiXG4gICAgICAgIGFyaWEtYXRvbWljPVwidHJ1ZVwiXG4gICAgICAgICpuZ0lmPVwiZGlzcGxheWVkRWxlbWVudHMgJiYgc2hvdWxkRGlzcGxheUxpc3Rib3goKVwiXG4gICAgPlxuICAgICAgICBOb21icmUgZGUgcsOpc3VsdGF0czoge3sgZGlzcGxheWVkRWxlbWVudHMubGVuZ3RoIH19XG4gICAgICAgIDwhLS0gVHJpY2sgdG8gaGF2ZSBOVkRBIHJlLXJlYWRpbmcgdGhpcyBwcm9wZXJseSAtLT5cbiAgICAgICAgPHNwYW4+e3sgbm90aWZpY2F0aW9uTWVzc2FnZVVwZGF0ZWQgPyAnLCcgOiAnLCwnIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGlucHV0XG4gICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImhhc0Vycm9yc1RvRGlzcGxheSgpXCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICByb2xlPVwidGV4dGJveFwiXG4gICAgICAgIFtuYW1lXT1cIm5hbWUgfHwgbGFiZWxcIlxuICAgICAgICBbYXR0ci5pZF09XCJidWlsZENoaWxkSWQoKVwiXG4gICAgICAgIFthdHRyLnBsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyIHx8IG51bGxcIlxuICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZFN1YmplY3QgfCBhc3luY1wiXG4gICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiZ2V0RGVzY3JpYmVkQnkoKVwiXG4gICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwicmVxdWlyZWQgfHwgbnVsbFwiXG4gICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJoYXNFcnJvcnNUb0Rpc3BsYXkoKSB8fCBudWxsXCJcbiAgICAgICAgW2F0dHIuYXV0b2NvbXBsZXRlXT1cIidvZmYnXCJcbiAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImdldEFjdGl2ZURlc2NlbmRhbnRJZCgpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1vd25zXT1cIlxuICAgICAgICAgICAgc2hvdWxkRGlzcGxheUxpc3Rib3goKSA/IGJ1aWxkQ2hpbGRJZCgpICsgJ0xpc3Rib3gnIDogbnVsbFxuICAgICAgICBcIlxuICAgICAgICBbYXR0ci5saXN0XT1cImJ1aWxkQ2hpbGRJZCgpICsgJ2xpc3QnXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJpbnB1dFZhbHVlXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2hvd1N1Z2dlc3Rpb25zV2hlbklucHV0SGFzRm9jdXNBbmRJc0VtcHR5KCRldmVudClcIlxuICAgICAgICAoaW5wdXQpPVwiaGFuZGxlU2VhcmNoSW5wdXRDaGFuZ2UoZW50cnlDb21wb25lbnQudmFsdWUpXCJcbiAgICAgICAgKHBhc3RlKT1cIm9uUGFzdGUoJGV2ZW50KVwiXG4gICAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoKVwiXG4gICAgICAgIChibHVyKT1cIm9uSW5wdXRCbHVyKClcIlxuICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgICAgIChjbGljayk9XCJvbklucHV0Q2xpY2soKVwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICNlbnRyeUNvbXBvbmVudFxuICAgIC8+XG5cbiAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAqbmdJZj1cImRpc3BsYXlDbGVhckJ1dHRvbigpIHwgYXN5bmNcIlxuICAgICAgICBjbGFzcz1cImF1dG9jb21wbGV0ZS1jbGVhci1idXR0b24gYnRuXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ2xlYXIoKVwiXG4gICAgICAgIFtpZF09XCJidWlsZENoaWxkSWQoKSArICdDbGVhcidcIlxuICAgID5cbiAgICAgICAgPGZvZWhuLWljb24tdGltZXNcbiAgICAgICAgICAgIGNsYXNzPVwiYXV0b2NvbXBsZXRlLWNsZWFyLWJ1dHRvbi1pY29uXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInZm9laG4taW5wdXQuY2xlYXItYnV0dG9uLmxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5XCJcbiAgICAgICAgPjwvZm9laG4taWNvbi10aW1lcz5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmb3JtLWdyb3VwIHN1Z2dlc3Rpb25zLWxpc3QtY29udGFpbmVyXCJcbiAgICAgICAgKm5nSWY9XCJzaG91bGREaXNwbGF5TGlzdGJveCgpXCJcbiAgICA+XG4gICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAgICAgICAgIFtpdGVtU2l6ZV09XCJpdGVtSGVpZ2h0SW5TdWdnZXN0aW9uTGlzdEluUHhcIlxuICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJWSUVXX1BPUlRfSEVJR0hUXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiYnVpbGRDaGlsZElkKCkgKyAnTGlzdGJveCdcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJidWlsZENoaWxkSWQoKSArICdMYWJlbCdcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInN1Z2dlc3Rpb25zLWxpc3RcIlxuICAgICAgICAgICAgICAgICNzdWdnZXN0aW9uc0xpc3RcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN1Z2dlc3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAqY2RrVmlydHVhbEZvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgb2YgZGlzcGxheWVkRWxlbWVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCBhcyBpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImJ1aWxkQ2hpbGRJZCgpICsgJ09wdGlvbicgKyBpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tTdWdnZXN0aW9uKGVsZW1lbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbkxpc3RPcHRpb25Nb3VzZURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvbkxpc3RPcHRpb25Gb2N1cygpXCJcbiAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25MaXN0T3B0aW9uQmx1cigpXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiaXRlbUhlaWdodEluU3VnZ2VzdGlvbkxpc3RJblB4XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIubGFiZWwtdmFsdWVdPVwiZ2V0TGFiZWwoZWxlbWVudClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci52YWx1ZV09XCJnZXRFbGVtZW50SWRlbnRpZmllcihlbGVtZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIEVuc3VyZXMgdGhhdCBzY3JlZW4gcmVhZGVycyBkb24ndCBjb25zaWRlciBhbnkgc3BhY2VzIGFyb3VuZCB0aGUgZW1waGFzaXMgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckh0bWxdPVwiZ2V0TGFiZWxXaXRoRW1waGFzaXMoZWxlbWVudClcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -129,7 +129,7 @@ export class FoehnListSummaryComponent extends FoehnInputComponent {
129
129
  useExisting: forwardRef(() => FoehnListSummaryComponent),
130
130
  multi: true
131
131
  }
132
- ], viewQueries: [{ propertyName: "tableActionButtons", first: true, predicate: ["tableActionButtons"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<section\n class=\"form-group clearable-input-form-group\"\n [class.has-danger]=\"hasErrorsToDisplay()\"\n [class.vd-form-group-danger]=\"hasErrorsToDisplay()\"\n [attr.id]=\"buildId('Container')\"\n tabindex=\"-1\"\n>\n <label\n class=\"form-label\"\n [attr.for]=\"buildChildId()\"\n *ngIf=\"label && type !== 'hidden'\"\n [ngClass]=\"isLabelSrOnly ? 'visually-hidden' : labelStyleModifier\"\n >\n <span [innerHTML]=\"label\"></span>\n <span\n *ngIf=\"!required && !hideNotRequiredExtraLabel\"\n aria-hidden=\"true\"\n >\n {{ 'foehn-input.optional' | fromDictionary }}\n </span>\n </label>\n\n <foehn-validation-alerts [component]=\"this\"></foehn-validation-alerts>\n\n <small\n *ngIf=\"helpText && type !== 'hidden'\"\n [attr.id]=\"buildChildId() + 'Help'\"\n class=\"form-text text-secondary\"\n [innerHTML]=\"helpText\"\n ></small>\n\n <section *ngIf=\"!showAsTable\">\n <ul class=\"list-unstyled\" aria-describedby=\"sommaire-help-alt\">\n <li\n [id]=\"'list-summary-' + item.trackingIndex\"\n class=\"mt-3 border-bottom\"\n *ngFor=\"\n let item of list;\n let itemIndex = index;\n trackBy: trackFoehnListItem\n \"\n >\n <div class=\"d-flex align-items-baseline flex-wrap\">\n <h4 class=\"mt-0 me-3\">{{ getListItemTitle(item) }}</h4>\n <span class=\"ms-auto\">\n <foehn-error-pill\n [incompleteIndicatorOnly]=\"true\"\n [errorPrefix]=\"name + '[' + itemIndex + ']'\"\n ></foehn-error-pill>\n </span>\n </div>\n <dl class=\"mb-0\">\n <ng-container\n *ngFor=\"\n let itemParam of listItemDescriptions;\n trackBy: trackFoehnListItemDescription\n \"\n >\n <div\n class=\"d-flex flex-wrap item-line\"\n *ngIf=\"showLine(item, itemParam)\"\n >\n <dt class=\"me-1\">\n {{ itemParam.label }}\n </dt>\n <dd class=\"ms-auto text-end\">\n {{ itemParam.getFormattedValue(item) }}\n </dd>\n </div>\n </ng-container>\n </dl>\n <ul class=\"list-inline mb-3 mt-0\">\n <li\n class=\"list-inline-item\"\n *ngIf=\"item.disableEdition && item.disableDeletion\"\n >\n <a\n [id]=\"buildChildId('-see-link-' + itemIndex)\"\n href=\"#\"\n (click)=\"\n $event.preventDefault(); editItem(itemIndex)\n \"\n >\n Consulter\n </a>\n <span class=\"visually-hidden\">\n {{ getListItemTitle(item) }}\n </span>\n </li>\n <li class=\"list-inline-item\" *ngIf=\"!item.disableEdition\">\n <a\n [id]=\"buildChildId('-edit-link-' + itemIndex)\"\n href=\"#\"\n (click)=\"\n $event.preventDefault(); editItem(itemIndex)\n \"\n >\n Modifier\n </a>\n <span class=\"visually-hidden\">\n {{ getListItemTitle(item) }}\n </span>\n </li>\n <li class=\"list-inline-item\" *ngIf=\"!item.disableDeletion\">\n &nbsp;\n <a\n [id]=\"buildChildId('-delete-link-' + itemIndex)\"\n href=\"#\"\n (click)=\"\n $event.preventDefault(); removeItem(itemIndex)\n \"\n >\n Supprimer\n <span class=\"visually-hidden\">\n {{ getListItemTitle(item) }}\n </span>\n </a>\n </li>\n </ul>\n </li>\n </ul>\n </section>\n\n <section *ngIf=\"showAsTable && !!tableConfiguration?.length\">\n <foehn-table\n [id]=\"buildChildName('table')\"\n *ngIf=\"!!listCopyForTable?.length\"\n [list]=\"listCopyForTable\"\n [itemsPerPage]=\"1000000\"\n [columnsConfiguration]=\"tableConfiguration\"\n [sort]=\"tableSort\"\n (sortChange)=\"changeSort($event)\"\n [trackByFn]=\"trackFoehnListItem\"\n ></foehn-table>\n </section>\n\n <section [ngClass]=\"{ 'mt-5': !showAsTable }\" *ngIf=\"canAddItems\">\n <h2 class=\"visually-hidden\">Action</h2>\n <ul class=\"list-inline mb-3\">\n <li class=\"list-inline-item\">\n <button\n [id]=\"buildChildId('-add-button')\"\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"editItem()\"\n >\n Ajouter\n </button>\n </li>\n </ul>\n </section>\n</section>\n\n<ng-template #tableActionButtons let-index=\"index\" let-item=\"item\">\n <div class=\"d-inline-flex\">\n <button\n *ngIf=\"item.disableEdition && item.disableDeletion\"\n [id]=\"buildChildId('-see-button-' + index)\"\n type=\"button\"\n class=\"btn bg-transparent me-3\"\n (click)=\"editItem(index)\"\n >\n <foehn-icon-search [title]=\"'Consulter'\"></foehn-icon-search>\n </button>\n <button\n *ngIf=\"!item.disableEdition\"\n [id]=\"buildChildId('-edit-button-' + index)\"\n type=\"button\"\n class=\"btn bg-transparent me-3\"\n (click)=\"editItem(index)\"\n >\n <foehn-icon-edit [title]=\"'Modifier'\"></foehn-icon-edit>\n </button>\n <button\n *ngIf=\"!item.disableDeletion\"\n [id]=\"buildChildId('-delete-button-' + index)\"\n type=\"button\"\n class=\"btn bg-transparent\"\n (click)=\"removeItem(index)\"\n >\n <foehn-icon-trash-alt [title]=\"'Supprimer'\"></foehn-icon-trash-alt>\n </button>\n </div>\n</ng-template>\n", styles: [":host ::ng-deep .bg-transparent.btn .svg-inline--fa{color:var(--vd-neutral-darker)!important}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.FoehnValidationAlertsComponent, selector: "foehn-validation-alerts", inputs: ["component", "shouldErrorsBeLive"] }, { kind: "component", type: i4.FoehnTableComponent, selector: "foehn-table", inputs: ["itemsPerPage", "id", "title", "titleSrOnly", "previousLabel", "nextLabel", "totalElements", "fixedPageCount", "columnsConfiguration", "sort", "list", "trackByFn"], outputs: ["pageChange", "sortChange", "rowClick"] }, { kind: "component", type: i5.FoehnIconEditComponent, selector: "foehn-icon-edit" }, { kind: "component", type: i6.FoehnIconSearchComponent, selector: "foehn-icon-search" }, { kind: "component", type: i7.FoehnIconTrashAltComponent, selector: "foehn-icon-trash-alt" }, { kind: "component", type: i8.FoehnErrorPillComponent, selector: "foehn-error-pill", inputs: ["errorPrefix", "incompleteIndicatorOnly"] }, { kind: "pipe", type: i9.SdkDictionaryPipe, name: "fromDictionary" }] }); }
132
+ ], viewQueries: [{ propertyName: "tableActionButtons", first: true, predicate: ["tableActionButtons"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<section\n class=\"form-group clearable-input-form-group\"\n [class.has-danger]=\"hasErrorsToDisplay()\"\n [class.vd-form-group-danger]=\"hasErrorsToDisplay()\"\n [attr.id]=\"buildId('Container')\"\n tabindex=\"-1\"\n>\n <label\n class=\"form-label\"\n [attr.for]=\"buildChildId()\"\n *ngIf=\"label && type !== 'hidden'\"\n [ngClass]=\"isLabelSrOnly ? 'visually-hidden' : labelStyleModifier\"\n >\n <span [innerHTML]=\"label\"></span>\n <span\n *ngIf=\"!required && !hideNotRequiredExtraLabel\"\n aria-hidden=\"true\"\n >\n {{ 'foehn-input.optional' | fromDictionary }}\n </span>\n </label>\n\n <foehn-validation-alerts [component]=\"this\"></foehn-validation-alerts>\n\n <small\n *ngIf=\"helpText && type !== 'hidden'\"\n [attr.id]=\"buildChildId() + 'Help'\"\n class=\"form-text text-secondary\"\n [innerHTML]=\"helpText\"\n ></small>\n\n <section *ngIf=\"!showAsTable\">\n <ul class=\"list-unstyled\" aria-describedby=\"sommaire-help-alt\">\n <li\n [id]=\"'list-summary-' + item.trackingIndex\"\n class=\"mt-3 border-bottom\"\n *ngFor=\"\n let item of list;\n let itemIndex = index;\n trackBy: trackFoehnListItem\n \"\n >\n <div class=\"d-flex align-items-baseline flex-wrap\">\n <h4 class=\"mt-0 me-3\">{{ getListItemTitle(item) }}</h4>\n <span class=\"ms-auto\">\n <foehn-error-pill\n [incompleteIndicatorOnly]=\"true\"\n [errorPrefix]=\"name + '[' + itemIndex + ']'\"\n ></foehn-error-pill>\n </span>\n </div>\n <dl class=\"mb-0\">\n <ng-container\n *ngFor=\"\n let itemParam of listItemDescriptions;\n trackBy: trackFoehnListItemDescription\n \"\n >\n <div\n class=\"d-flex flex-wrap item-line\"\n *ngIf=\"showLine(item, itemParam)\"\n >\n <dt class=\"me-1\">\n {{ itemParam.label }}\n </dt>\n <dd class=\"ms-auto text-end\">\n {{ itemParam.getFormattedValue(item) }}\n </dd>\n </div>\n </ng-container>\n </dl>\n <ul class=\"list-inline mb-3 mt-0\">\n <li\n class=\"list-inline-item\"\n *ngIf=\"item.disableEdition && item.disableDeletion\"\n >\n <a\n [id]=\"buildChildId('-see-link-' + itemIndex)\"\n href=\"#\"\n (click)=\"\n $event.preventDefault(); editItem(itemIndex)\n \"\n >\n Consulter\n </a>\n <span class=\"visually-hidden\">\n {{ getListItemTitle(item) }}\n </span>\n </li>\n <li class=\"list-inline-item\" *ngIf=\"!item.disableEdition\">\n <a\n [id]=\"buildChildId('-edit-link-' + itemIndex)\"\n href=\"#\"\n (click)=\"\n $event.preventDefault(); editItem(itemIndex)\n \"\n >\n Modifier\n </a>\n <span class=\"visually-hidden\">\n {{ getListItemTitle(item) }}\n </span>\n </li>\n <li class=\"list-inline-item\" *ngIf=\"!item.disableDeletion\">\n &nbsp;\n <a\n [id]=\"buildChildId('-delete-link-' + itemIndex)\"\n href=\"#\"\n (click)=\"\n $event.preventDefault(); removeItem(itemIndex)\n \"\n >\n Supprimer\n <span class=\"visually-hidden\">\n {{ getListItemTitle(item) }}\n </span>\n </a>\n </li>\n </ul>\n </li>\n </ul>\n </section>\n\n <section *ngIf=\"showAsTable && !!tableConfiguration?.length\">\n <foehn-table\n [id]=\"buildChildName('table')\"\n *ngIf=\"!!listCopyForTable?.length\"\n [list]=\"listCopyForTable\"\n [itemsPerPage]=\"1000000\"\n [columnsConfiguration]=\"tableConfiguration\"\n [sort]=\"tableSort\"\n (sortChange)=\"changeSort($event)\"\n [trackByFn]=\"trackFoehnListItem\"\n ></foehn-table>\n </section>\n\n <section [ngClass]=\"{ 'mt-5': !showAsTable }\" *ngIf=\"canAddItems\">\n <h2 class=\"visually-hidden\">Action</h2>\n <ul class=\"list-inline mb-3\">\n <li class=\"list-inline-item\">\n <button\n [id]=\"buildChildId('-add-button')\"\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"editItem()\"\n >\n Ajouter\n </button>\n </li>\n </ul>\n </section>\n</section>\n\n<ng-template #tableActionButtons let-index=\"index\" let-item=\"item\">\n <div class=\"d-inline-flex\">\n <button\n *ngIf=\"item.disableEdition && item.disableDeletion\"\n [id]=\"buildChildId('-see-button-' + index)\"\n type=\"button\"\n class=\"btn bg-transparent me-3\"\n (click)=\"editItem(index)\"\n >\n <foehn-icon-search [title]=\"'Consulter'\"></foehn-icon-search>\n </button>\n <button\n *ngIf=\"!item.disableEdition\"\n [id]=\"buildChildId('-edit-button-' + index)\"\n type=\"button\"\n class=\"btn bg-transparent me-3\"\n (click)=\"editItem(index)\"\n >\n <foehn-icon-edit [title]=\"'Modifier'\"></foehn-icon-edit>\n </button>\n <button\n *ngIf=\"!item.disableDeletion\"\n [id]=\"buildChildId('-delete-button-' + index)\"\n type=\"button\"\n class=\"btn bg-transparent\"\n (click)=\"removeItem(index)\"\n >\n <foehn-icon-trash-alt [title]=\"'Supprimer'\"></foehn-icon-trash-alt>\n </button>\n </div>\n</ng-template>\n", styles: [":host ::ng-deep .bg-transparent.btn .svg-inline--fa{color:var(--vd-neutral-darker)!important}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.FoehnValidationAlertsComponent, selector: "foehn-validation-alerts", inputs: ["component", "shouldErrorsBeLive"] }, { kind: "component", type: i4.FoehnTableComponent, selector: "foehn-table", inputs: ["itemsPerPage", "title", "titleSrOnly", "previousLabel", "nextLabel", "totalElements", "fixedPageCount", "columnsConfiguration", "sort", "list", "trackByFn"], outputs: ["pageChange", "sortChange", "rowClick"] }, { kind: "component", type: i5.FoehnIconEditComponent, selector: "foehn-icon-edit" }, { kind: "component", type: i6.FoehnIconSearchComponent, selector: "foehn-icon-search" }, { kind: "component", type: i7.FoehnIconTrashAltComponent, selector: "foehn-icon-trash-alt" }, { kind: "component", type: i8.FoehnErrorPillComponent, selector: "foehn-error-pill", inputs: ["errorPrefix", "incompleteIndicatorOnly"] }, { kind: "pipe", type: i9.SdkDictionaryPipe, name: "fromDictionary" }] }); }
133
133
  }
134
134
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FoehnListSummaryComponent, decorators: [{
135
135
  type: Component,