@cleavelandprice/ngx-lib 4.1.6 → 4.1.8

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.
@@ -128,7 +128,7 @@ export class UserChooserComponent {
128
128
  ];
129
129
  // Do we need AD groups?
130
130
  if (this.adGroupsNeeded) {
131
- this._data.groups ?
131
+ this._data.groups?.length ?
132
132
  // Groups were passed in
133
133
  of(this._data.groups) :
134
134
  // Groups need to be retrieved
@@ -424,4 +424,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImpor
424
424
  type: ViewChild,
425
425
  args: ['filterInput']
426
426
  }] } });
427
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jaG9vc2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnkvbWF0ZXJpYWwvc3JjL2NvbXBvbmVudHMvdXNlci1jaG9vc2VyL3VzZXItY2hvb3Nlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9hY3RpdmUtZGlyZWN0b3J5L21hdGVyaWFsL3NyYy9jb21wb25lbnRzL3VzZXItY2hvb3Nlci91c2VyLWNob29zZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLEVBQVUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbkYsT0FBTyxFQUFhLGlCQUFpQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFbkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUs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QUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUUsR0FBRyxDQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLEVBQUUsQ0FBQztJQUNQLENBQUM7OEdBcGRVLG9CQUFvQjtrR0FBcEIsb0JBQW9CLHVIQVlMLGdCQUFnQiw2SkMzRDVDLDZ2R0EwRnFCLDJ0Q0RoRWpCLFNBQVMsaUxBQ1QsZ0JBQWdCLDRIQUNoQixjQUFjLHFMQUNkLGdCQUFnQix5R0FDaEIsWUFBWSw0TEFDWixPQUFPLDJJQUNQLGFBQWEsNkZBQ2IsUUFBUSxpVUFDUixpQkFBaUIsZ0VBQ2pCLGFBQWEsb01BQ2Isa0JBQWtCLCtLQUNsQixnQkFBZ0IsdU5BQ2hCLGNBQWMsbVRBQ2QsVUFBVSxnUkFDVixtQkFBbUI7OzJGQU9WLG9CQUFvQjtrQkF6QmhDLFNBQVM7aUNBQ0ksSUFBSSxXQUVQO3dCQUNQLFNBQVM7d0JBQ1QsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixPQUFPO3dCQUNQLGFBQWE7d0JBQ2IsUUFBUTt3QkFDUixpQkFBaUI7d0JBQ2pCLGFBQWE7d0JBQ2Isa0JBQWtCO3dCQUNsQixnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2QsVUFBVTt3QkFDVixtQkFBbUI7cUJBQ3BCOzhCQW9CNkIsV0FBVztzQkFBeEMsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBpbmplY3QsIE9uSW5pdCwgVmlld0NoaWxkLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ0FjdGlvbnMsIE1hdERpYWxvZ0Nsb3NlLCBNYXREaWFsb2dDb250ZW50LCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0TGlzdEl0ZW1BdmF0YXIsIE1hdExpc3RPcHRpb24sIE1hdFNlbGVjdGlvbkxpc3QgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9saXN0JztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFjdGl2ZURpcmVjdG9yeVNlcnZpY2UgfSBmcm9tICdAY2xlYXZlbGFuZHByaWNlL25neC1saWIvYWN0aXZlLWRpcmVjdG9yeSc7XG5pbXBvcnQgeyBQaG90b0l0ZW0sIFNoYXJlUG9pbnRTZXJ2aWNlIH0gZnJvbSAnQGNsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL3NoYXJlcG9pbnQnO1xuXG5pbXBvcnQgeyBNYXRCdXR0b24sIE1hdEljb25CdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgU2VsZWN0YWJsZUdyb3VwIH0gZnJvbSAnLi4vLi4vbW9kZWwvc2VsZWN0YWJsZS1ncm91cCc7XG5pbXBvcnQgeyBTZWxlY3RhYmxlVXNlciB9IGZyb20gJy4uLy4uL21vZGVsL3NlbGVjdGFibGUtdXNlcic7XG5pbXBvcnQgeyBEZWZhdWx0VXNlckNob29zZXJEYXRhLCBVc2VyQ2hvb3NlckRhdGEgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyLWNob29zZXItZGF0YSc7XG5pbXBvcnQgeyBVc2VyQ2hvb3Nlck1vZGUgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyLWNob29zZXItbW9kZSc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1jaG9vc2VyLmNvbXBvbmVudC5odG1sJyxcbiAgaW1wb3J0czogW1xuICAgIE1hdEJ1dHRvbixcbiAgICBNYXREaWFsb2dBY3Rpb25zLFxuICAgIE1hdERpYWxvZ0Nsb3NlLFxuICAgIE1hdERpYWxvZ0NvbnRlbnQsXG4gICAgTWF0Rm9ybUZpZWxkLFxuICAgIE1hdEljb24sXG4gICAgTWF0SWNvbkJ1dHRvbixcbiAgICBNYXRJbnB1dCxcbiAgICBNYXRMaXN0SXRlbUF2YXRhcixcbiAgICBNYXRMaXN0T3B0aW9uLFxuICAgIE1hdFByb2dyZXNzU3Bpbm5lcixcbiAgICBNYXRTZWxlY3Rpb25MaXN0LFxuICAgIE1hdFNsaWRlVG9nZ2xlLFxuICAgIE1hdFRvb2x0aXAsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgXSxcbiAgc3R5bGVVcmxzOiBbXG4gICAgJy4vdXNlci1jaG9vc2VyLmNvbXBvbmVudC5zY3NzJyxcbiAgICAnLi4vLi4vLi4vLi4vLi4vc3R5bGVzL21hdC1pY29uLnNjc3MnXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVXNlckNob29zZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAjc2VydmljZXMgPSB7XG4gICAgZGlhbG9nUmVmOiBpbmplY3QoTWF0RGlhbG9nUmVmPFVzZXJDaG9vc2VyQ29tcG9uZW50PiksXG4gICAgYWN0aXZlRGlyZWN0b3J5OiBpbmplY3QoQWN0aXZlRGlyZWN0b3J5U2VydmljZSksXG4gICAgc2hhcmVQb2ludDogaW5qZWN0KFNoYXJlUG9pbnRTZXJ2aWNlKSxcbiAgICBkYXRhOiBpbmplY3Q8VXNlckNob29zZXJEYXRhPihNQVRfRElBTE9HX0RBVEEpXG4gIH07XG4gIF9kYXRhID0gey4uLkRlZmF1bHRVc2VyQ2hvb3NlckRhdGEsIC4uLnRoaXMuI3NlcnZpY2VzLmRhdGF9O1xuICBcbiAgLy8jcmVnaW9uIEZpZWxkc1xuICBcbiAgLy9AVmlld0NoaWxkKE1hdFNlbGVjdGlvbkxpc3QpIHNlbGVjdGlvbkxpc3Q/OiBNYXRTZWxlY3Rpb25MaXN0O1xuICBzZWxlY3Rpb25MaXN0ID0gdmlld0NoaWxkKE1hdFNlbGVjdGlvbkxpc3QpO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbHRlcklucHV0Jykgc2V0IGZpbHRlcklucHV0KGVsUmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+KSB7XG4gICAgaWYgKGVsUmVmKSB7XG4gICAgICBlbFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuICAvL2ZpbHRlcklucHV0ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdmaWx0ZXJJbnB1dCcpO1xuXG4gIGZpbHRlckZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBmaWx0ZXI6IG5ldyBGb3JtQ29udHJvbCgpXG4gIH0pO1xuXG4gIGRhdGFTb3VyY2U/OiBNYXRUYWJsZURhdGFTb3VyY2U8U2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXA+O1xuICBwaG90b3M/OiBQaG90b0l0ZW1bXTtcbiAgZ3JvdXBzPzogU2VsZWN0YWJsZUdyb3VwW107IC8vIE1heSBvciBtYXkgbm90IGdldCBwb3B1bGF0ZWQsIGRlcGVuZGluZyBvbiBjb25maWcgZGF0YSBzZW50IGluXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBQcm9wZXJ0aWVzXG4gIGdldCBpc011bHRpTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5tb2RlID09PSBVc2VyQ2hvb3Nlck1vZGUuTXVsdGlwbGU7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRPcHRpb25zKCk6IE1hdExpc3RPcHRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTGlzdCgpPy5vcHRpb25zLmZpbHRlcihvID0+IG8uc2VsZWN0ZWQpID8/IFtdO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkVXNlcnMoKTogKFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlPy5kYXRhPy5maWx0ZXIoZCA9PiBkLnNlbGVjdGVkKSA/PyBbXTtcbiAgfVxuXG4gIGdldCBmaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZpbHRlckZvcm0udmFsdWUuZmlsdGVyO1xuICB9XG5cbiAgZ2V0IGFkR3JvdXBzTmVlZGVkKCk6IGJvb2xlYW4ge1xuICAgIC8vIElmIGFueSBhcmUgdGhlc2UgYXJlIHRydWUsIHRoZW4gd2UgbmVlZCB0byBwdWxsIEFEIGdyb3VwcyBmb3IgdXNlIGxhdGVyXG4gICAgcmV0dXJuICh0aGlzLl9kYXRhLnNob3dHcm91cE1lbWJlcnNoaXBUb29sdGlwcyA/PyBmYWxzZSkgfHxcbiAgICAgICh0aGlzLl9kYXRhLmV4Y2x1c2lvbnM/Lmdyb3Vwcz8ubGVuZ3RoID8/IDApID4gMCB8fFxuICAgICAgKHRoaXMuX2RhdGEuaW5jbHVzaW9ucz8uZ3JvdXBzPy5sZW5ndGggPz8gMCkgPiAwIHx8XG4gICAgICAodGhpcy5fZGF0YS5wcmVTZWxlY3Rpb25zPy5ncm91cHM/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcbiAgICAgIHRoaXMuX2RhdGEuZmlsdGVyT3B0aW9ucz8uZ3JvdXBNZW1iZXJzaGlwIHx8XG4gICAgICAodGhpcy5fZGF0YS5zZWxlY3RhYmxlR3JvdXBOYW1lcz8ubGVuZ3RoID8/IDApID4gMCB8fFxuICAgICAgKHRoaXMuX2RhdGEuZ3JvdXBzPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBMaWZlY3ljbGVcbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy4jZ2V0RGF0YSgpO1xuICAgIHRoaXMuI2xpc3RlbkZvckZpbHRlckNoYW5nZXMoKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gRXZlbnRzXG4gIGxpc3RTZWxlY3Rpb25DaGFuZ2VkKG9wdGlvbnM6IE1hdExpc3RPcHRpb25bXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kYXRhLm1vZGUgPT09IFVzZXJDaG9vc2VyTW9kZS5TaW5nbGUgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCAmJlxuICAgICAgdGhpcy5fZGF0YS5jbG9zZVdoZW5TZWxlY3Rpb25NYWRlXG4gICAgICApIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBvcHRpb25TZWxlY3Rpb25DaGFuZ2VkKG9wdGlvbjogTWF0TGlzdE9wdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmRhdGFTb3VyY2U/LmRhdGFcbiAgICAgIC5maW5kKHUgPT4gdS5zQU1BY2NvdW50TmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSAob3B0aW9uLnZhbHVlIGFzIFNlbGVjdGFibGVVc2VyKS5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpKTtcblxuICAgIGlmICh1c2VyKSB7XG4gICAgICAvLyBJZiB3ZSBhcmUgaW4gc2luZ2xlIHVzZXIgc2VsZWN0aW9uIG1vZGUsIGRlc2VsZWN0IGFueSBleGlzdGluZyBzZWxlY3Rpb25zIGZpcnN0XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aU1vZGUgJiYgb3B0aW9uLnNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZT8uZGF0YVxuICAgICAgICAgIC5maWx0ZXIodSA9PiB1LnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgIT09IChvcHRpb24udmFsdWUgYXMgU2VsZWN0YWJsZVVzZXIpLnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgLmZvckVhY2godSA9PiB1LnNlbGVjdGVkID0gZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICB1c2VyLnNlbGVjdGVkID0gb3B0aW9uLnNlbGVjdGVkO1xuICAgIH1cbiAgfVxuXG4gIGhpZGVVbnNlbGVjdGVkQ2hhbmdlZChzZWxlY3RlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyRm9ybS5nZXQoJ2ZpbHRlcicpPy5zZXRWYWx1ZShzZWxlY3RlZCA/ICd7c2VsZWN0ZWQ6dHJ1ZX0nIDogbnVsbCk7XG4gIH1cblxuICBzZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25MaXN0KCk/LnNlbGVjdEFsbCgpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTGlzdCgpPy5vcHRpb25zKSB7XG4gICAgICB0aGlzLmxpc3RTZWxlY3Rpb25DaGFuZ2VkKHRoaXMuc2VsZWN0aW9uTGlzdCgpIS5vcHRpb25zLnRvQXJyYXkoKSk7XG4gICAgfVxuICB9XG5cbiAgZGVzZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25MaXN0KCk/LmRlc2VsZWN0QWxsKCk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFV0aWxpdGllc1xuICBpc1VzZXIodXNlck9yR3JvdXA6IFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICd0aXRsZScgaW4gdXNlck9yR3JvdXA7XG4gIH1cbiAgY2FzdFVzZXIodXNlck9yR3JvdXA6IFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKTogU2VsZWN0YWJsZVVzZXIge1xuICAgIHJldHVybiB1c2VyT3JHcm91cCBhcyBTZWxlY3RhYmxlVXNlcjtcbiAgfVxuXG4gICNnZXREYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGFPYnNlcnZhYmxlczogT2JzZXJ2YWJsZTxhbnk+W10gPSBbXG4gICAgICB0aGlzLl9kYXRhLnVzZXJzID9cbiAgICAgICAgLy8gVXNlcnMgd2VyZSBwYXNzZWQgaW5cbiAgICAgICAgb2YodGhpcy5fZGF0YS51c2VycykgOlxuICAgICAgICAvLyBVc2VycyBuZWVkIHRvIGJlIHJldHJpZXZlZFxuICAgICAgICB0aGlzLiNzZXJ2aWNlcy5hY3RpdmVEaXJlY3RvcnkuZ2V0VXNlcnMoZmFsc2UsIHRoaXMuX2RhdGEuaW5jbHVkZURpc2FibGVkVXNlcnMsIHRoaXMuX2RhdGEucGFyZW50T3UpLFxuXG4gICAgICB0aGlzLl9kYXRhLnBob3RvcyA/XG4gICAgICAgIC8vIFBob3RvcyB3ZXJlIHBhc3NlZCBpblxuICAgICAgICBvZih0aGlzLl9kYXRhLnBob3RvcykgOlxuICAgICAgICAvLyBQaG90b3MgbmVlZCB0byBiZSByZXRyaWV2ZWRcbiAgICAgICAgdGhpcy4jc2VydmljZXMuc2hhcmVQb2ludC5nZXRQaG90b3MoKVxuICAgIF07XG5cbiAgICAvLyBEbyB3ZSBuZWVkIEFEIGdyb3Vwcz9cbiAgICBpZiAodGhpcy5hZEdyb3Vwc05lZWRlZCkge1xuICAgICAgdGhpcy5fZGF0YS5ncm91cHMgP1xuICAgICAgICAvLyBHcm91cHMgd2VyZSBwYXNzZWQgaW5cbiAgICAgICAgb2YodGhpcy5fZGF0YS5ncm91cHMpIDpcbiAgICAgICAgLy8gR3JvdXBzIG5lZWQgdG8gYmUgcmV0cmlldmVkXG4gICAgICAgIGRhdGFPYnNlcnZhYmxlcy5wdXNoKHRoaXMuI3NlcnZpY2VzLmFjdGl2ZURpcmVjdG9yeS5nZXRHcm91cHMoKSk7XG4gICAgfVxuXG5cbiAgICBmb3JrSm9pbihkYXRhT2JzZXJ2YWJsZXMpXG4gICAgICAvLy5zdWJzY3JpYmUoKFt1c2VycywgcGhvdG9zXSkgPT4ge1xuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgLy8gTmVlZCBncm91cHMgaW4gcGxhY2UgYmVmb3JlIHdlIGhhbmRsZSBleGNsdXNpb25zL2luY2x1c2lvbnMvcHJlLXNlbGVjdGlvbnNcbiAgICAgICAgdGhpcy5ncm91cHMgPSB0aGlzLmFkR3JvdXBzTmVlZGVkID9cbiAgICAgICAgICBkYXRhWzJdIDpcbiAgICAgICAgICBudWxsO1xuXG4gICAgICAgIGxldCB1c2VycyA9IGRhdGFbMF0gYXMgU2VsZWN0YWJsZVVzZXJbXTtcbiAgICAgICAgdXNlcnMuZm9yRWFjaCh1ID0+IHUuc2VsZWN0ZWQgPSBmYWxzZSk7IC8vIEluIGNhc2UgZXhpc3RpbmcgZGF0YSB3YXMgcmUtdXNlZFxuICAgICAgICB1c2VycyA9IHRoaXMuI2luY2x1ZGVVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuI2luY2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNpbmNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuI2luY2x1ZGVVc2Vyc0J5VGl0bGUodXNlcnMpO1xuXG4gICAgICAgIHVzZXJzID0gdGhpcy4jZXhjbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy4jZXhjbHVkZVVzZXJzQnlHcm91cE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuI2V4Y2x1ZGVVc2Vyc0J5RGVwYXJ0bWVudCh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy4jZXhjbHVkZVVzZXJzQnlUaXRsZSh1c2Vycyk7XG5cbiAgICAgICAgdXNlcnMgPSB0aGlzLiNwcmVTZWxlY3RVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuI3ByZVNlbGVjdFVzZXJzQnlHcm91cE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuI3ByZVNlbGVjdFVzZXJzQnlEZXBhcnRtZW50KHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNwcmVTZWxlY3RVc2Vyc0J5VGl0bGUodXNlcnMpO1xuXG4gICAgICAgIHRoaXMuI3ByZVNlbGVjdEdyb3Vwc0J5QWNjb3VudE5hbWUoKTtcblxuICAgICAgICBjb25zdCB1c2Vyc0FuZEdyb3VwczogKFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKVtdID0gW1xuICAgICAgICAgIC4uLnVzZXJzXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKHRoaXMuX2RhdGEuc2VsZWN0YWJsZUdyb3VwTmFtZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX2RhdGEuc2VsZWN0YWJsZUdyb3VwTmFtZXNcbiAgICAgICAgICAgIC5mb3JFYWNoKGdyb3VwTmFtZSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHMhLmZpbmQoZyA9PiBnLmRpc3BsYXlOYW1lID09PSBncm91cE5hbWUpO1xuXG4gICAgICAgICAgICAgIGlmIChncm91cCkge1xuICAgICAgICAgICAgICAgIHVzZXJzQW5kR3JvdXBzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZDogZ3JvdXAuc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHVzZXJzQW5kR3JvdXBzKTtcbiAgICAgIFxuICAgICAgICB0aGlzLnBob3RvcyA9IGRhdGFbMV07XG5cbiAgICAgICAgdGhpcy4jc2V0RmlsdGVyUHJlZGljYXRlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZFVzZXJzKSB7XG4gICAgICB0aGlzLiNzZXJ2aWNlcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnNlbGVjdGVkVXNlcnNcbiAgICAgIC5tYXAodSA9PiB0aGlzLl9kYXRhLnJldHVyblVzZXJPYmplY3RzID8gdSA6IHUuc0FNQWNjb3VudE5hbWUpO1xuXG4gICAgdGhpcy4jc2VydmljZXMuZGlhbG9nUmVmLmNsb3NlKHRoaXMuX2RhdGEubW9kZSA9PT0gVXNlckNob29zZXJNb2RlLk11bHRpcGxlID9cbiAgICAgIHZhbHVlIDpcbiAgICAgIHZhbHVlWzBdXG4gICAgKTtcbiAgfVxuXG4gIGdldFBob3RvKHVzZXI6IFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuaXNVc2VyKHVzZXIpKSB7IHJldHVybjsgfVxuXG4gICAgcmV0dXJuIHRoaXMucGhvdG9zPy5maW5kKHAgPT5cbiAgICAgIChwLmVtcGxveWVlTnVtYmVyICYmIHAuZW1wbG95ZWVOdW1iZXIudG9TdHJpbmcoKSA9PT0gKHVzZXIgYXMgU2VsZWN0YWJsZVVzZXIpLmVtcGxveWVlTnVtYmVyKSB8fFxuICAgICAgcC5hY2NvdW50TmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gdXNlci5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBwLmRpc3BsYXlOYW1lPy50b0xvd2VyQ2FzZSgpID09PSB1c2VyLmRpc3BsYXlOYW1lLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgIHAudGl0bGU/LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKVxuICAgICk/LmVuY29kZWRBYnNVcmw7XG4gIH1cblxuICAvLyNyZWdpb24gRXhjbHVzaW9ucyAtIHdvbid0IGJlIGluY2x1ZGVkIGluIHRoZSBkYXRhU291cmNlIGF0IGFsbFxuICAjZXhjbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuX2RhdGEuZXhjbHVzaW9ucz8uYWNjb3VudE5hbWVzXG4gICAgICA/LmZvckVhY2goYWNjb3VudE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmZpbmRJbmRleCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgI2V4Y2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5fZGF0YS5leGNsdXNpb25zPy5ncm91cHNcbiAgICAgID8uZm9yRWFjaChncm91cE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cbiAgICAgICAgXG4gICAgICAgIGdyb3VwLm1lbWJlci5mb3JFYWNoKGdyb3VwTWVtYmVyRG4gPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdXNlcnMuZmluZEluZGV4KHUgPT4gdS5kaXN0aW5ndWlzaGVkTmFtZSA9PT0gZ3JvdXBNZW1iZXJEbik7XG4gICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgeyByZXR1cm47IH1cblxuICAgICAgICAgIHVzZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cblxuICAjZXhjbHVkZVVzZXJzQnlEZXBhcnRtZW50KHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5fZGF0YS5leGNsdXNpb25zPy5kZXBhcnRtZW50c1xuICAgICAgPy5mb3JFYWNoKGRlcGFydG1lbnQgPT4ge1xuICAgICAgICBjb25zdCBleGNsdWRlZFVzZXJzID0gdXNlcnMuZmlsdGVyKHUgPT4gdS5kZXBhcnRtZW50Py50b0xvd2VyQ2FzZSgpID09PSBkZXBhcnRtZW50LnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgIGV4Y2x1ZGVkVXNlcnMuZm9yRWFjaCh1c2VyID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmluZGV4T2YodXNlcik7XG4gICAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gICNleGNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5fZGF0YS5leGNsdXNpb25zPy50aXRsZXNcbiAgICAgID8uZm9yRWFjaCh0aXRsZSA9PiB7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVkVXNlcnMgPSB1c2Vycy5maWx0ZXIodSA9PiB1LnRpdGxlPy50b0xvd2VyQ2FzZSgpID09PSB0aXRsZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgXG4gICAgICAgIGV4Y2x1ZGVkVXNlcnMuZm9yRWFjaCh1c2VyID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmluZGV4T2YodXNlcik7XG4gICAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gSW5jbHVzaW9ucyAtIG9ubHkgdGhlc2Ugd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZGF0YVNvdXJjZVxuICAjaW5jbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHJldHVybiB1c2Vycy5maWx0ZXIodXNlciA9PlxuICAgICAgIXRoaXMuX2RhdGEuaW5jbHVzaW9ucz8uYWNjb3VudE5hbWVzPy5sZW5ndGggfHwgLy8gTm8gYWNjb3VudCBpbmNsdXNpb25zIHNwZWNpZmllZFxuXG4gICAgICB0aGlzLl9kYXRhLmluY2x1c2lvbnMuYWNjb3VudE5hbWVzLmZpbmQoYWNjb3VudE5hbWUgPT5cbiAgICAgICAgYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gdXNlci5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICApKTtcbiAgfVxuXG4gICNpbmNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICByZXR1cm4gdXNlcnMuZmlsdGVyKHVzZXIgPT5cbiAgICAgICF0aGlzLl9kYXRhLmluY2x1c2lvbnM/LmRlcGFydG1lbnRzPy5sZW5ndGggfHwgLy8gTm8gZGVwYXJ0bWVudCBpbmNsdXNpb25zIHNwZWNpZmllZFxuXG4gICAgICB0aGlzLl9kYXRhLmluY2x1c2lvbnMuZGVwYXJ0bWVudHMuZmluZChkZXBhcnRtZW50ID0+XG4gICAgICAgIGRlcGFydG1lbnQudG9Mb3dlckNhc2UoKSA9PT0gdXNlci5kZXBhcnRtZW50Py50b0xvd2VyQ2FzZSgpXG4gICAgICApKTtcbiAgfVxuXG4gICNpbmNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgcmV0dXJuIHVzZXJzLmZpbHRlcih1c2VyID0+XG4gICAgICAhdGhpcy5fZGF0YS5pbmNsdXNpb25zPy50aXRsZXM/Lmxlbmd0aCB8fCAvLyBObyB0aXRsZSBpbmNsdXNpb25zIHNwZWNpZmllZFxuXG4gICAgICB0aGlzLl9kYXRhLmluY2x1c2lvbnMudGl0bGVzLmZpbmQodGl0bGUgPT5cbiAgICAgICAgdGl0bGUudG9Mb3dlckNhc2UoKSA9PT0gdXNlci50aXRsZT8udG9Mb3dlckNhc2UoKVxuICAgICAgKSk7XG4gIH1cblxuICAjaW5jbHVkZVVzZXJzQnlHcm91cE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICBpZiAoIXRoaXMuX2RhdGEuaW5jbHVzaW9ucz8uZ3JvdXBzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB1c2VyczsgLy8gTm8gZ3JvdXAgaW5jbHVzaW9ucyBzcGVjaWZpZWRcbiAgICB9XG5cbiAgICAvLyBDaGVhdGluZyBhIGJpdCBhbmQgbGV2ZXJhZ2luZyB0aGUgJ3NlbGVjdGVkJyBwcm9wZXJ0eSB0byBrZWVwIHRyYWNrIG9mIHdobyBzaG91bGQgYmUgaW5jbHVkZWRcbiAgICAvLyBTaW5jZSBpbmNsdXNpb25zIGhhcHBlbiBiZWZvciBwcmUtc2VsZWN0aW9ucywgd2UgY2FuIGRvIHRoYXQsIGFzIGxvbmcgYXMgd2Ugc2V0ICdzZWxlY3RlZCcgYmFjayB0byBmYWxzZSB3aGVuIHdlJ3JlIGRvbmVcbiAgICB0aGlzLl9kYXRhLmluY2x1c2lvbnMuZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cblxuICAgICAgICB1c2Vyc1xuICAgICAgICAgIC5maWx0ZXIodXNlciA9PlxuICAgICAgICAgICAgICBncm91cC5tZW1iZXIuZmluZChncm91cE1lbWJlckRuID0+IGdyb3VwTWVtYmVyRG4gPT09IHVzZXIuZGlzdGluZ3Vpc2hlZE5hbWUpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5mb3JFYWNoKHVzZXIgPT4gdXNlci5zZWxlY3RlZCA9IHRydWUpO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAvLyBBdCB0aGlzIHBvaW50LCBhbGwgb2YgdGhlIGFwcHJvcHJpYXRlIHVzZXJzIHNob3VsZCBoYXZlICdzZWxlY3RlZCcgc2V0IHRvIHRydWVcbiAgICBjb25zdCBzZWxlY3RlZFVzZXJzID0gdXNlcnMuZmlsdGVyKHVzZXIgPT4gdXNlci5zZWxlY3RlZCk7IC8vIFN1YnNldCBvZiB0aGUgb3JpZ2luYWwgbGlzdFxuICAgIC8vIFJlc2V0ICdzZWxlY3RlZCcgdG8gZmFsc2UsIGFuZCByZXR1cm5cbiAgICBzZWxlY3RlZFVzZXJzLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gZmFsc2UpO1xuICAgIHJldHVybiBzZWxlY3RlZFVzZXJzO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiAgUHJlLVNlbGVjdGlvbnNcbiAgI3ByZVNlbGVjdFVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuX2RhdGEucHJlU2VsZWN0aW9ucz8uYWNjb3VudE5hbWVzXG4gICAgICA/LmZvckVhY2goYWNjb3VudE5hbWUgPT4ge1xuICAgICAgICBjb25zdCB1c2VyID0gdXNlcnMuZmluZCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmICghdXNlcikgeyByZXR1cm47IH1cblxuICAgICAgICB1c2VyLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgI3ByZVNlbGVjdEdyb3Vwc0J5QWNjb3VudE5hbWUoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YS5wcmVTZWxlY3Rpb25zPy5hY2NvdW50TmFtZXNcbiAgICAgID8uZm9yRWFjaChhY2NvdW50TmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZyA9PiBnLnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgPT09IGFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoIWdyb3VwKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGdyb3VwLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH0pOztcbiAgfVxuXG4gICNwcmVTZWxlY3RVc2Vyc0J5RGVwYXJ0bWVudCh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuX2RhdGEucHJlU2VsZWN0aW9ucz8uZGVwYXJ0bWVudHNcbiAgICAgID8uZm9yRWFjaChkZXBhcnRtZW50ID0+XG4gICAgICAgIHVzZXJzXG4gICAgICAgICAgLmZpbHRlcih1ID0+IHUuZGVwYXJ0bWVudD8udG9Mb3dlckNhc2UoKSA9PT0gZGVwYXJ0bWVudC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgIC5mb3JFYWNoKHVzZXIgPT4gdXNlci5zZWxlY3RlZCA9IHRydWUpXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgI3ByZVNlbGVjdFVzZXJzQnlUaXRsZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuX2RhdGEucHJlU2VsZWN0aW9ucz8udGl0bGVzXG4gICAgICA/LmZvckVhY2godGl0bGUgPT5cbiAgICAgICAgdXNlcnNcbiAgICAgICAgICAuZmlsdGVyKHUgPT4gdS50aXRsZT8udG9Mb3dlckNhc2UoKSA9PT0gdGl0bGUudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAuZm9yRWFjaCh1c2VyID0+IHVzZXIuc2VsZWN0ZWQgPSB0cnVlKVxuICAgICAgKTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gICNwcmVTZWxlY3RVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5fZGF0YS5wcmVTZWxlY3Rpb25zPy5ncm91cHNcbiAgICAgID8uZm9yRWFjaChncm91cE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cblxuICAgICAgICBncm91cC5tZW1iZXIuZm9yRWFjaChncm91cE1lbWJlckRuID0+IHtcbiAgICAgICAgICBjb25zdCB1c2VyID0gdXNlcnMuZmluZCh1ID0+IHUuZGlzdGluZ3Vpc2hlZE5hbWUgPT09IGdyb3VwTWVtYmVyRG4pO1xuICAgICAgICAgIGlmICghdXNlcikgeyByZXR1cm47IH1cblxuICAgICAgICAgIHVzZXIuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuICBcbiAgI3NldEZpbHRlclByZWRpY2F0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJQcmVkaWNhdGUgPSAodXNlcjogKFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKSwgZmlsdGVyOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChmaWx0ZXIgPT09ICd7c2VsZWN0ZWQ6dHJ1ZX0nKSB7XG4gICAgICAgIHJldHVybiB1c2VyLnNlbGVjdGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGZpbHRlciwgJ2knKTsgLy8gQ2FzZS1pbnNlbnNpdGl2ZVxuICAgICAgICBsZXQgbWF0Y2ggPSBmYWxzZTsgLy8gVGhlIGVuZCByZXN1bHQgLSB3aGV0aGVyIG9yIG5vdCBhIGVtcGxveWVlIG1hdGNoZXMgdGhlIGZpbHRlclxuXG4gICAgICAgIGNvbnN0IGZpbHRlclByb3BlcnRpZXMgPSBbICdkaXNwbGF5TmFtZScgXTtcbiAgICAgICAgaWYgKHRoaXMuX2RhdGEuZmlsdGVyT3B0aW9ucz8uYWNjb3VudE5hbWUpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ3NBTUFjY291bnROYW1lJylcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGF0YS5maWx0ZXJPcHRpb25zPy50aXRsZSkge1xuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgndGl0bGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGF0YS5maWx0ZXJPcHRpb25zPy5kZXBhcnRtZW50KSB7XG4gICAgICAgICAgZmlsdGVyUHJvcGVydGllcy5wdXNoKCdkZXBhcnRtZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RhdGEuZmlsdGVyT3B0aW9ucz8ucGhvbmVOdW1iZXIpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ3RlbGVwaG9uZU51bWJlcicpO1xuICAgICAgICB9XG4gIFxuICAgICAgICAvLyBNYXRjaCBvbiB0aGUgcHJvcGVydGllcyBjb25maWd1cmVkIGFib3ZlXG4gICAgICAgIGZpbHRlclByb3BlcnRpZXNcbiAgICAgICAgICAuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAodXNlcltmaWVsZF0gJiYgdXNlcltmaWVsZF0ubWF0Y2gocmVnZXgpKSB7XG4gICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgXG4gICAgICAgIC8vIE1hdGNoIG9uIGdyb3VwIG1lbWJlcnNoaXAgKGdyb3VwIG5hbWUpXG4gICAgICAgIGlmICh0aGlzLl9kYXRhLmZpbHRlck9wdGlvbnM/Lmdyb3VwTWVtYmVyc2hpcCkge1xuICAgICAgICAgIHVzZXIubWVtYmVyT2YuZm9yRWFjaChncm91cERuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZ3JvdXAgPT4gZ3JvdXAuZGlzdGluZ3Vpc2hlZE5hbWUgPT09IGdyb3VwRG4gJiYgZ3JvdXAubmFtZS5tYXRjaChyZWdleCkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoZ3JvdXApIHtcbiAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAjbGlzdGVuRm9yRmlsdGVyQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKDI1MClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kYXRhU291cmNlIS5maWx0ZXIgPSB0aGlzLmZpbHRlckZvcm0udmFsdWUuZmlsdGVyPy50cmltKCkudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICB0b29sdGlwKHVzZXI6IFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zaG93R3JvdXBNZW1iZXJzaGlwVG9vbHRpcHMgP1xuICAgICAgdXNlci5tZW1iZXJPZlxuICAgICAgICAubWFwKGdyb3VwRG4gPT5cbiAgICAgICAgICB0aGlzLmdyb3Vwc1xuICAgICAgICAgICAgPy5maW5kKGdyb3VwID0+XG4gICAgICAgICAgICAgIGdyb3VwLmRpc3Rpbmd1aXNoZWROYW1lID09PSBncm91cERuXG4gICAgICAgICAgICApPy5uYW1lXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhISA+IGIhID8gMSA6IC0xKVxuICAgICAgICAgIC5qb2luKCdcXG4nKSA6XG4gICAgICAnJztcbiAgfVxuICAvLyNlbmRyZWdpb25cbn0iLCI8ZGl2IGlkPVwiZGlhbG9nLXRpdGxlXCI+XG4gIDxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7IF9kYXRhLnRpdGxlIH19PC9oMj5cblxuICA8ZGl2IGlkPVwibnVtLXNlbGVjdGVkXCI+XG4gICAge3sgc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCB9fSBzZWxlY3RlZFxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bWF0LWRpYWxvZy1jb250ZW50PlxuICBAaWYgKGRhdGFTb3VyY2UgJiYgcGhvdG9zKSB7XG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCI+XG4gICAgICBAaWYgKGRhdGFTb3VyY2UpIHtcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIlNlYXJjaFwiIGZvcm1Db250cm9sTmFtZT1cImZpbHRlclwiICNmaWx0ZXJJbnB1dD5cbiAgICAgICAgICBAaWYgKGZpbHRlckZvcm0udmFsdWUuZmlsdGVyKSB7XG4gICAgICAgICAgICA8YnV0dG9uIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gYXJpYS1sYWJlbD1cIkNsZWFyXCIgKGNsaWNrKT1cImZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8uc2V0VmFsdWUoJycpXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNsb3NlXCIvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgfVxuICAgIDwvZm9ybT5cbiAgICA8bWF0LXNlbGVjdGlvbi1saXN0IFttdWx0aXBsZV09XCJpc011bHRpTW9kZVwiXG4gICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImxpc3RTZWxlY3Rpb25DaGFuZ2VkKCRldmVudC5vcHRpb25zKVwiPlxuICAgICAgQGZvciAodXNlciBvZiBkYXRhU291cmNlLmZpbHRlcmVkRGF0YTsgdHJhY2sgdXNlcikge1xuICAgICAgICA8bWF0LWxpc3Qtb3B0aW9uIFt2YWx1ZV09XCJ1c2VyXCIgW3NlbGVjdGVkXT1cInVzZXIuc2VsZWN0ZWRcIlxuICAgICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJvcHRpb25TZWxlY3Rpb25DaGFuZ2VkKG9wdGlvbilcIiAjb3B0aW9uPlxuICAgICAgICAgIEBpZiAoZ2V0UGhvdG8odXNlcikpIHtcbiAgICAgICAgICAgIDxpbWcgbWF0TGlzdEl0ZW1BdmF0YXIgYWx0PVwiXCIgW3NyY109XCJnZXRQaG90byh1c2VyKVwiPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPG1hdC1pY29uIG1hdExpc3RJdGVtQXZhdGFyIGNsYXNzPVwibm8tcGhvdG9cIlxuICAgICAgICAgICAgICBbZm9udEljb25dPVwiaXNVc2VyKHVzZXIpID8gJ2FjY291bnRfY2lyY2xlJyA6ICdncm91cCdcIi8+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyXCI+XG4gICAgICAgICAgICA8ZGl2IFttYXRUb29sdGlwXT1cInRvb2x0aXAodXNlcilcIiBjbGFzcz1cInVzZXItbmFtZVwiPlxuICAgICAgICAgICAgICB7eyB1c2VyLmRpc3BsYXlOYW1lIH19XG4gICAgICAgICAgICAgIEBpZiAoaXNVc2VyKHVzZXIpICYmIF9kYXRhLnNob3dQaG9uZSAmJiBjYXN0VXNlcih1c2VyKS50ZWxlcGhvbmVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICA8ZGl2Pnt7IGNhc3RVc2VyKHVzZXIpLnRlbGVwaG9uZU51bWJlciB9fTwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIEBpZiAoaXNVc2VyKHVzZXIpKSB7XG4gICAgICAgICAgICAgIDxkaXY+e3sgY2FzdFVzZXIodXNlcikuZGVwYXJ0bWVudCB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57eyBjYXN0VXNlcih1c2VyKS50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC1saXN0LW9wdGlvbj5cbiAgICAgIH1cbiAgICA8L21hdC1zZWxlY3Rpb24tbGlzdD5cbiAgfSBAZWxzZSB7XG4gICAgPGRpdj5cbiAgICAgIDxtYXQtc3Bpbm5lciBbZGlhbWV0ZXJdPVwiNTBcIi8+XG4gICAgICA8aDIgaWQ9XCJzcGlubmVyLW1lc3NhZ2VcIj5HZXR0aW5nIHVzZXJzIGFuZCBwaG90b3MuLi48L2gyPlxuICAgIDwvZGl2PlxuICB9XG48L21hdC1kaWFsb2ctY29udGVudD5cblxuPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgQGlmIChkYXRhU291cmNlICYmIHBob3Rvcykge1xuICAgIEBpZiAoc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgPG1hdC1zbGlkZS10b2dnbGUgKGNoYW5nZSk9XCJoaWRlVW5zZWxlY3RlZENoYW5nZWQoJGV2ZW50LmNoZWNrZWQpXCI+XG4gICAgICAgIEhpZGUgVW5zZWxlY3RlZFxuICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgIH1cbiAgICBAaWYgKGlzTXVsdGlNb2RlKSB7XG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzZWxlY3RBbGwoKVwiXG4gICAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwic2VsZWN0X2FsbFwiLz5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPlNlbGVjdCBBbGw8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gICAgQGlmIChpc011bHRpTW9kZSAmJiBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJkZXNlbGVjdEFsbCgpXCJcbiAgICAgICAgPlxuICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJjbGVhcl9hbGxcIi8+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1tb2JpbGVcIj5DbGVhciBBbGw8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gICAgQGlmIChpc011bHRpTW9kZSB8fCAhX2RhdGEuY2xvc2VXaGVuU2VsZWN0aW9uTWFkZSkge1xuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiY2xvc2UoKVwiIG1hdFRvb2x0aXA9XCJBY2NlcHQgeW91ciBzZWxlY3Rpb25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkT3B0aW9ucy5sZW5ndGhcIj5cbiAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiY2hlY2tcIi8+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1tb2JpbGVcIj5Pazwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgfVxuXG4gIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJ3YXJuXCIgbWF0LWRpYWxvZy1jbG9zZSBtYXRUb29sdGlwPVwiQ2xvc2UgdGhpcyB3aW5kb3dcIj5cbiAgICA8bWF0LWljb24gZm9udEljb249XCJjbG9zZVwiLz5cbiAgICA8c3BhbiBjbGFzcz1cImhpZGUtbW9iaWxlXCI+Q2FuY2VsPC9zcGFuPlxuICA8L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPiJdfQ==
427
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jaG9vc2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnkvbWF0ZXJpYWwvc3JjL2NvbXBvbmVudHMvdXNlci1jaG9vc2VyL3VzZXItY2hvb3Nlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9hY3RpdmUtZGlyZWN0b3J5L21hdGVyaWFsL3NyYy9jb21wb25lbnRzL3VzZXItY2hvb3Nlci91c2VyLWNob29zZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLEVBQVUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbkYsT0FBTyxFQUFhLGlCQUFpQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFbkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUs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QUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFFLEdBQUcsQ0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqQixFQUFFLENBQUM7SUFDUCxDQUFDOzhHQXBkVSxvQkFBb0I7a0dBQXBCLG9CQUFvQix1SEFZTCxnQkFBZ0IsNkpDM0Q1Qyw2dkdBMEZxQiwydENEaEVqQixTQUFTLGlMQUNULGdCQUFnQiw0SEFDaEIsY0FBYyxxTEFDZCxnQkFBZ0IseUdBQ2hCLFlBQVksNExBQ1osT0FBTywySUFDUCxhQUFhLDZGQUNiLFFBQVEsaVVBQ1IsaUJBQWlCLGdFQUNqQixhQUFhLG9NQUNiLGtCQUFrQiwrS0FDbEIsZ0JBQWdCLHVOQUNoQixjQUFjLG1UQUNkLFVBQVUsZ1JBQ1YsbUJBQW1COzsyRkFPVixvQkFBb0I7a0JBekJoQyxTQUFTO2lDQUNJLElBQUksV0FFUDt3QkFDUCxTQUFTO3dCQUNULGdCQUFnQjt3QkFDaEIsY0FBYzt3QkFDZCxnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osT0FBTzt3QkFDUCxhQUFhO3dCQUNiLFFBQVE7d0JBQ1IsaUJBQWlCO3dCQUNqQixhQUFhO3dCQUNiLGtCQUFrQjt3QkFDbEIsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLFVBQVU7d0JBQ1YsbUJBQW1CO3FCQUNwQjs4QkFvQjZCLFdBQVc7c0JBQXhDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgaW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dBY3Rpb25zLCBNYXREaWFsb2dDbG9zZSwgTWF0RGlhbG9nQ29udGVudCwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdExpc3RJdGVtQXZhdGFyLCBNYXRMaXN0T3B0aW9uLCBNYXRTZWxlY3Rpb25MaXN0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGlzdCc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlIH0gZnJvbSAnQGNsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnknO1xuaW1wb3J0IHsgUGhvdG9JdGVtLCBTaGFyZVBvaW50U2VydmljZSB9IGZyb20gJ0BjbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9zaGFyZXBvaW50JztcblxuaW1wb3J0IHsgTWF0QnV0dG9uLCBNYXRJY29uQnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IFNlbGVjdGFibGVHcm91cCB9IGZyb20gJy4uLy4uL21vZGVsL3NlbGVjdGFibGUtZ3JvdXAnO1xuaW1wb3J0IHsgU2VsZWN0YWJsZVVzZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9zZWxlY3RhYmxlLXVzZXInO1xuaW1wb3J0IHsgRGVmYXVsdFVzZXJDaG9vc2VyRGF0YSwgVXNlckNob29zZXJEYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlci1jaG9vc2VyLWRhdGEnO1xuaW1wb3J0IHsgVXNlckNob29zZXJNb2RlIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlci1jaG9vc2VyLW1vZGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItY2hvb3Nlci5jb21wb25lbnQuaHRtbCcsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRCdXR0b24sXG4gICAgTWF0RGlhbG9nQWN0aW9ucyxcbiAgICBNYXREaWFsb2dDbG9zZSxcbiAgICBNYXREaWFsb2dDb250ZW50LFxuICAgIE1hdEZvcm1GaWVsZCxcbiAgICBNYXRJY29uLFxuICAgIE1hdEljb25CdXR0b24sXG4gICAgTWF0SW5wdXQsXG4gICAgTWF0TGlzdEl0ZW1BdmF0YXIsXG4gICAgTWF0TGlzdE9wdGlvbixcbiAgICBNYXRQcm9ncmVzc1NwaW5uZXIsXG4gICAgTWF0U2VsZWN0aW9uTGlzdCxcbiAgICBNYXRTbGlkZVRvZ2dsZSxcbiAgICBNYXRUb29sdGlwLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIF0sXG4gIHN0eWxlVXJsczogW1xuICAgICcuL3VzZXItY2hvb3Nlci5jb21wb25lbnQuc2NzcycsXG4gICAgJy4uLy4uLy4uLy4uLy4uL3N0eWxlcy9tYXQtaWNvbi5zY3NzJ1xuICBdXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJDaG9vc2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgI3NlcnZpY2VzID0ge1xuICAgIGRpYWxvZ1JlZjogaW5qZWN0KE1hdERpYWxvZ1JlZjxVc2VyQ2hvb3NlckNvbXBvbmVudD4pLFxuICAgIGFjdGl2ZURpcmVjdG9yeTogaW5qZWN0KEFjdGl2ZURpcmVjdG9yeVNlcnZpY2UpLFxuICAgIHNoYXJlUG9pbnQ6IGluamVjdChTaGFyZVBvaW50U2VydmljZSksXG4gICAgZGF0YTogaW5qZWN0PFVzZXJDaG9vc2VyRGF0YT4oTUFUX0RJQUxPR19EQVRBKVxuICB9O1xuICBfZGF0YSA9IHsuLi5EZWZhdWx0VXNlckNob29zZXJEYXRhLCAuLi50aGlzLiNzZXJ2aWNlcy5kYXRhfTtcbiAgXG4gIC8vI3JlZ2lvbiBGaWVsZHNcbiAgXG4gIC8vQFZpZXdDaGlsZChNYXRTZWxlY3Rpb25MaXN0KSBzZWxlY3Rpb25MaXN0PzogTWF0U2VsZWN0aW9uTGlzdDtcbiAgc2VsZWN0aW9uTGlzdCA9IHZpZXdDaGlsZChNYXRTZWxlY3Rpb25MaXN0KTtcblxuICBAVmlld0NoaWxkKCdmaWx0ZXJJbnB1dCcpIHNldCBmaWx0ZXJJbnB1dChlbFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pikge1xuICAgIGlmIChlbFJlZikge1xuICAgICAgZWxSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfTtcbiAgLy9maWx0ZXJJbnB1dCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZmlsdGVySW5wdXQnKTtcblxuICBmaWx0ZXJGb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgZmlsdGVyOiBuZXcgRm9ybUNvbnRyb2woKVxuICB9KTtcblxuICBkYXRhU291cmNlPzogTWF0VGFibGVEYXRhU291cmNlPFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwPjtcbiAgcGhvdG9zPzogUGhvdG9JdGVtW107XG4gIGdyb3Vwcz86IFNlbGVjdGFibGVHcm91cFtdOyAvLyBNYXkgb3IgbWF5IG5vdCBnZXQgcG9wdWxhdGVkLCBkZXBlbmRpbmcgb24gY29uZmlnIGRhdGEgc2VudCBpblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gUHJvcGVydGllc1xuICBnZXQgaXNNdWx0aU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEubW9kZSA9PT0gVXNlckNob29zZXJNb2RlLk11bHRpcGxlO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkT3B0aW9ucygpOiBNYXRMaXN0T3B0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkxpc3QoKT8ub3B0aW9ucy5maWx0ZXIobyA9PiBvLnNlbGVjdGVkKSA/PyBbXTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZFVzZXJzKCk6IChTZWxlY3RhYmxlVXNlciB8IFNlbGVjdGFibGVHcm91cClbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZT8uZGF0YT8uZmlsdGVyKGQgPT4gZC5zZWxlY3RlZCkgPz8gW107XG4gIH1cblxuICBnZXQgZmlsdGVyVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJGb3JtLnZhbHVlLmZpbHRlcjtcbiAgfVxuXG4gIGdldCBhZEdyb3Vwc05lZWRlZCgpOiBib29sZWFuIHtcbiAgICAvLyBJZiBhbnkgYXJlIHRoZXNlIGFyZSB0cnVlLCB0aGVuIHdlIG5lZWQgdG8gcHVsbCBBRCBncm91cHMgZm9yIHVzZSBsYXRlclxuICAgIHJldHVybiAodGhpcy5fZGF0YS5zaG93R3JvdXBNZW1iZXJzaGlwVG9vbHRpcHMgPz8gZmFsc2UpIHx8XG4gICAgICAodGhpcy5fZGF0YS5leGNsdXNpb25zPy5ncm91cHM/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcbiAgICAgICh0aGlzLl9kYXRhLmluY2x1c2lvbnM/Lmdyb3Vwcz8ubGVuZ3RoID8/IDApID4gMCB8fFxuICAgICAgKHRoaXMuX2RhdGEucHJlU2VsZWN0aW9ucz8uZ3JvdXBzPy5sZW5ndGggPz8gMCkgPiAwIHx8XG4gICAgICB0aGlzLl9kYXRhLmZpbHRlck9wdGlvbnM/Lmdyb3VwTWVtYmVyc2hpcCB8fFxuICAgICAgKHRoaXMuX2RhdGEuc2VsZWN0YWJsZUdyb3VwTmFtZXM/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcbiAgICAgICh0aGlzLl9kYXRhLmdyb3Vwcz8ubGVuZ3RoID8/IDApID4gMDtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gTGlmZWN5Y2xlXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuI2dldERhdGEoKTtcbiAgICB0aGlzLiNsaXN0ZW5Gb3JGaWx0ZXJDaGFuZ2VzKCk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIEV2ZW50c1xuICBsaXN0U2VsZWN0aW9uQ2hhbmdlZChvcHRpb25zOiBNYXRMaXN0T3B0aW9uW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGF0YS5tb2RlID09PSBVc2VyQ2hvb3Nlck1vZGUuU2luZ2xlICYmXG4gICAgICB0aGlzLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGggJiZcbiAgICAgIHRoaXMuX2RhdGEuY2xvc2VXaGVuU2VsZWN0aW9uTWFkZVxuICAgICAgKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgb3B0aW9uU2VsZWN0aW9uQ2hhbmdlZChvcHRpb246IE1hdExpc3RPcHRpb24pOiB2b2lkIHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5kYXRhU291cmNlPy5kYXRhXG4gICAgICAuZmluZCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gKG9wdGlvbi52YWx1ZSBhcyBTZWxlY3RhYmxlVXNlcikuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgICBpZiAodXNlcikge1xuICAgICAgLy8gSWYgd2UgYXJlIGluIHNpbmdsZSB1c2VyIHNlbGVjdGlvbiBtb2RlLCBkZXNlbGVjdCBhbnkgZXhpc3Rpbmcgc2VsZWN0aW9ucyBmaXJzdFxuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlNb2RlICYmIG9wdGlvbi5zZWxlY3RlZCkge1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2U/LmRhdGFcbiAgICAgICAgICAuZmlsdGVyKHUgPT4gdS5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpICE9PSAob3B0aW9uLnZhbHVlIGFzIFNlbGVjdGFibGVVc2VyKS5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgIC5mb3JFYWNoKHUgPT4gdS5zZWxlY3RlZCA9IGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgdXNlci5zZWxlY3RlZCA9IG9wdGlvbi5zZWxlY3RlZDtcbiAgICB9XG4gIH1cblxuICBoaWRlVW5zZWxlY3RlZENoYW5nZWQoc2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8uc2V0VmFsdWUoc2VsZWN0ZWQgPyAne3NlbGVjdGVkOnRydWV9JyA6IG51bGwpO1xuICB9XG5cbiAgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uTGlzdCgpPy5zZWxlY3RBbGwoKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGlvbkxpc3QoKT8ub3B0aW9ucykge1xuICAgICAgdGhpcy5saXN0U2VsZWN0aW9uQ2hhbmdlZCh0aGlzLnNlbGVjdGlvbkxpc3QoKSEub3B0aW9ucy50b0FycmF5KCkpO1xuICAgIH1cbiAgfVxuXG4gIGRlc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uTGlzdCgpPy5kZXNlbGVjdEFsbCgpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBVdGlsaXRpZXNcbiAgaXNVc2VyKHVzZXJPckdyb3VwOiBTZWxlY3RhYmxlVXNlciB8IFNlbGVjdGFibGVHcm91cCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAndGl0bGUnIGluIHVzZXJPckdyb3VwO1xuICB9XG4gIGNhc3RVc2VyKHVzZXJPckdyb3VwOiBTZWxlY3RhYmxlVXNlciB8IFNlbGVjdGFibGVHcm91cCk6IFNlbGVjdGFibGVVc2VyIHtcbiAgICByZXR1cm4gdXNlck9yR3JvdXAgYXMgU2VsZWN0YWJsZVVzZXI7XG4gIH1cblxuICAjZ2V0RGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhT2JzZXJ2YWJsZXM6IE9ic2VydmFibGU8YW55PltdID0gW1xuICAgICAgdGhpcy5fZGF0YS51c2VycyA/XG4gICAgICAgIC8vIFVzZXJzIHdlcmUgcGFzc2VkIGluXG4gICAgICAgIG9mKHRoaXMuX2RhdGEudXNlcnMpIDpcbiAgICAgICAgLy8gVXNlcnMgbmVlZCB0byBiZSByZXRyaWV2ZWRcbiAgICAgICAgdGhpcy4jc2VydmljZXMuYWN0aXZlRGlyZWN0b3J5LmdldFVzZXJzKGZhbHNlLCB0aGlzLl9kYXRhLmluY2x1ZGVEaXNhYmxlZFVzZXJzLCB0aGlzLl9kYXRhLnBhcmVudE91KSxcblxuICAgICAgdGhpcy5fZGF0YS5waG90b3MgP1xuICAgICAgICAvLyBQaG90b3Mgd2VyZSBwYXNzZWQgaW5cbiAgICAgICAgb2YodGhpcy5fZGF0YS5waG90b3MpIDpcbiAgICAgICAgLy8gUGhvdG9zIG5lZWQgdG8gYmUgcmV0cmlldmVkXG4gICAgICAgIHRoaXMuI3NlcnZpY2VzLnNoYXJlUG9pbnQuZ2V0UGhvdG9zKClcbiAgICBdO1xuXG4gICAgLy8gRG8gd2UgbmVlZCBBRCBncm91cHM/XG4gICAgaWYgKHRoaXMuYWRHcm91cHNOZWVkZWQpIHtcbiAgICAgIHRoaXMuX2RhdGEuZ3JvdXBzPy5sZW5ndGggP1xuICAgICAgICAvLyBHcm91cHMgd2VyZSBwYXNzZWQgaW5cbiAgICAgICAgb2YodGhpcy5fZGF0YS5ncm91cHMpIDpcbiAgICAgICAgLy8gR3JvdXBzIG5lZWQgdG8gYmUgcmV0cmlldmVkXG4gICAgICAgIGRhdGFPYnNlcnZhYmxlcy5wdXNoKHRoaXMuI3NlcnZpY2VzLmFjdGl2ZURpcmVjdG9yeS5nZXRHcm91cHMoKSk7XG4gICAgfVxuXG5cbiAgICBmb3JrSm9pbihkYXRhT2JzZXJ2YWJsZXMpXG4gICAgICAvLy5zdWJzY3JpYmUoKFt1c2VycywgcGhvdG9zXSkgPT4ge1xuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgLy8gTmVlZCBncm91cHMgaW4gcGxhY2UgYmVmb3JlIHdlIGhhbmRsZSBleGNsdXNpb25zL2luY2x1c2lvbnMvcHJlLXNlbGVjdGlvbnNcbiAgICAgICAgdGhpcy5ncm91cHMgPSB0aGlzLmFkR3JvdXBzTmVlZGVkID9cbiAgICAgICAgICBkYXRhWzJdIDpcbiAgICAgICAgICBudWxsO1xuXG4gICAgICAgIGxldCB1c2VycyA9IGRhdGFbMF0gYXMgU2VsZWN0YWJsZVVzZXJbXTtcbiAgICAgICAgdXNlcnMuZm9yRWFjaCh1ID0+IHUuc2VsZWN0ZWQgPSBmYWxzZSk7IC8vIEluIGNhc2UgZXhpc3RpbmcgZGF0YSB3YXMgcmUtdXNlZFxuICAgICAgICB1c2VycyA9IHRoaXMuI2luY2x1ZGVVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuI2luY2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNpbmNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuI2luY2x1ZGVVc2Vyc0J5VGl0bGUodXNlcnMpO1xuXG4gICAgICAgIHVzZXJzID0gdGhpcy4jZXhjbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy4jZXhjbHVkZVVzZXJzQnlHcm91cE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuI2V4Y2x1ZGVVc2Vyc0J5RGVwYXJ0bWVudCh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy4jZXhjbHVkZVVzZXJzQnlUaXRsZSh1c2Vycyk7XG5cbiAgICAgICAgdXNlcnMgPSB0aGlzLiNwcmVTZWxlY3RVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuI3ByZVNlbGVjdFVzZXJzQnlHcm91cE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuI3ByZVNlbGVjdFVzZXJzQnlEZXBhcnRtZW50KHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNwcmVTZWxlY3RVc2Vyc0J5VGl0bGUodXNlcnMpO1xuXG4gICAgICAgIHRoaXMuI3ByZVNlbGVjdEdyb3Vwc0J5QWNjb3VudE5hbWUoKTtcblxuICAgICAgICBjb25zdCB1c2Vyc0FuZEdyb3VwczogKFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKVtdID0gW1xuICAgICAgICAgIC4uLnVzZXJzXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKHRoaXMuX2RhdGEuc2VsZWN0YWJsZUdyb3VwTmFtZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX2RhdGEuc2VsZWN0YWJsZUdyb3VwTmFtZXNcbiAgICAgICAgICAgIC5mb3JFYWNoKGdyb3VwTmFtZSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHMhLmZpbmQoZyA9PiBnLmRpc3BsYXlOYW1lID09PSBncm91cE5hbWUpO1xuXG4gICAgICAgICAgICAgIGlmIChncm91cCkge1xuICAgICAgICAgICAgICAgIHVzZXJzQW5kR3JvdXBzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZDogZ3JvdXAuc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHVzZXJzQW5kR3JvdXBzKTtcbiAgICAgIFxuICAgICAgICB0aGlzLnBob3RvcyA9IGRhdGFbMV07XG5cbiAgICAgICAgdGhpcy4jc2V0RmlsdGVyUHJlZGljYXRlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZFVzZXJzKSB7XG4gICAgICB0aGlzLiNzZXJ2aWNlcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnNlbGVjdGVkVXNlcnNcbiAgICAgIC5tYXAodSA9PiB0aGlzLl9kYXRhLnJldHVyblVzZXJPYmplY3RzID8gdSA6IHUuc0FNQWNjb3VudE5hbWUpO1xuXG4gICAgdGhpcy4jc2VydmljZXMuZGlhbG9nUmVmLmNsb3NlKHRoaXMuX2RhdGEubW9kZSA9PT0gVXNlckNob29zZXJNb2RlLk11bHRpcGxlID9cbiAgICAgIHZhbHVlIDpcbiAgICAgIHZhbHVlWzBdXG4gICAgKTtcbiAgfVxuXG4gIGdldFBob3RvKHVzZXI6IFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuaXNVc2VyKHVzZXIpKSB7IHJldHVybjsgfVxuXG4gICAgcmV0dXJuIHRoaXMucGhvdG9zPy5maW5kKHAgPT5cbiAgICAgIChwLmVtcGxveWVlTnVtYmVyICYmIHAuZW1wbG95ZWVOdW1iZXIudG9TdHJpbmcoKSA9PT0gKHVzZXIgYXMgU2VsZWN0YWJsZVVzZXIpLmVtcGxveWVlTnVtYmVyKSB8fFxuICAgICAgcC5hY2NvdW50TmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gdXNlci5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBwLmRpc3BsYXlOYW1lPy50b0xvd2VyQ2FzZSgpID09PSB1c2VyLmRpc3BsYXlOYW1lLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgIHAudGl0bGU/LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKVxuICAgICk/LmVuY29kZWRBYnNVcmw7XG4gIH1cblxuICAvLyNyZWdpb24gRXhjbHVzaW9ucyAtIHdvbid0IGJlIGluY2x1ZGVkIGluIHRoZSBkYXRhU291cmNlIGF0IGFsbFxuICAjZXhjbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuX2RhdGEuZXhjbHVzaW9ucz8uYWNjb3VudE5hbWVzXG4gICAgICA/LmZvckVhY2goYWNjb3VudE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmZpbmRJbmRleCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgI2V4Y2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5fZGF0YS5leGNsdXNpb25zPy5ncm91cHNcbiAgICAgID8uZm9yRWFjaChncm91cE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cbiAgICAgICAgXG4gICAgICAgIGdyb3VwLm1lbWJlci5mb3JFYWNoKGdyb3VwTWVtYmVyRG4gPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdXNlcnMuZmluZEluZGV4KHUgPT4gdS5kaXN0aW5ndWlzaGVkTmFtZSA9PT0gZ3JvdXBNZW1iZXJEbik7XG4gICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgeyByZXR1cm47IH1cblxuICAgICAgICAgIHVzZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cblxuICAjZXhjbHVkZVVzZXJzQnlEZXBhcnRtZW50KHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5fZGF0YS5leGNsdXNpb25zPy5kZXBhcnRtZW50c1xuICAgICAgPy5mb3JFYWNoKGRlcGFydG1lbnQgPT4ge1xuICAgICAgICBjb25zdCBleGNsdWRlZFVzZXJzID0gdXNlcnMuZmlsdGVyKHUgPT4gdS5kZXBhcnRtZW50Py50b0xvd2VyQ2FzZSgpID09PSBkZXBhcnRtZW50LnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgIGV4Y2x1ZGVkVXNlcnMuZm9yRWFjaCh1c2VyID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmluZGV4T2YodXNlcik7XG4gICAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gICNleGNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5fZGF0YS5leGNsdXNpb25zPy50aXRsZXNcbiAgICAgID8uZm9yRWFjaCh0aXRsZSA9PiB7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVkVXNlcnMgPSB1c2Vycy5maWx0ZXIodSA9PiB1LnRpdGxlPy50b0xvd2VyQ2FzZSgpID09PSB0aXRsZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgXG4gICAgICAgIGV4Y2x1ZGVkVXNlcnMuZm9yRWFjaCh1c2VyID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmluZGV4T2YodXNlcik7XG4gICAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gSW5jbHVzaW9ucyAtIG9ubHkgdGhlc2Ugd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZGF0YVNvdXJjZVxuICAjaW5jbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHJldHVybiB1c2Vycy5maWx0ZXIodXNlciA9PlxuICAgICAgIXRoaXMuX2RhdGEuaW5jbHVzaW9ucz8uYWNjb3VudE5hbWVzPy5sZW5ndGggfHwgLy8gTm8gYWNjb3VudCBpbmNsdXNpb25zIHNwZWNpZmllZFxuXG4gICAgICB0aGlzLl9kYXRhLmluY2x1c2lvbnMuYWNjb3VudE5hbWVzLmZpbmQoYWNjb3VudE5hbWUgPT5cbiAgICAgICAgYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gdXNlci5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICApKTtcbiAgfVxuXG4gICNpbmNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICByZXR1cm4gdXNlcnMuZmlsdGVyKHVzZXIgPT5cbiAgICAgICF0aGlzLl9kYXRhLmluY2x1c2lvbnM/LmRlcGFydG1lbnRzPy5sZW5ndGggfHwgLy8gTm8gZGVwYXJ0bWVudCBpbmNsdXNpb25zIHNwZWNpZmllZFxuXG4gICAgICB0aGlzLl9kYXRhLmluY2x1c2lvbnMuZGVwYXJ0bWVudHMuZmluZChkZXBhcnRtZW50ID0+XG4gICAgICAgIGRlcGFydG1lbnQudG9Mb3dlckNhc2UoKSA9PT0gdXNlci5kZXBhcnRtZW50Py50b0xvd2VyQ2FzZSgpXG4gICAgICApKTtcbiAgfVxuXG4gICNpbmNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgcmV0dXJuIHVzZXJzLmZpbHRlcih1c2VyID0+XG4gICAgICAhdGhpcy5fZGF0YS5pbmNsdXNpb25zPy50aXRsZXM/Lmxlbmd0aCB8fCAvLyBObyB0aXRsZSBpbmNsdXNpb25zIHNwZWNpZmllZFxuXG4gICAgICB0aGlzLl9kYXRhLmluY2x1c2lvbnMudGl0bGVzLmZpbmQodGl0bGUgPT5cbiAgICAgICAgdGl0bGUudG9Mb3dlckNhc2UoKSA9PT0gdXNlci50aXRsZT8udG9Mb3dlckNhc2UoKVxuICAgICAgKSk7XG4gIH1cblxuICAjaW5jbHVkZVVzZXJzQnlHcm91cE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICBpZiAoIXRoaXMuX2RhdGEuaW5jbHVzaW9ucz8uZ3JvdXBzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB1c2VyczsgLy8gTm8gZ3JvdXAgaW5jbHVzaW9ucyBzcGVjaWZpZWRcbiAgICB9XG5cbiAgICAvLyBDaGVhdGluZyBhIGJpdCBhbmQgbGV2ZXJhZ2luZyB0aGUgJ3NlbGVjdGVkJyBwcm9wZXJ0eSB0byBrZWVwIHRyYWNrIG9mIHdobyBzaG91bGQgYmUgaW5jbHVkZWRcbiAgICAvLyBTaW5jZSBpbmNsdXNpb25zIGhhcHBlbiBiZWZvciBwcmUtc2VsZWN0aW9ucywgd2UgY2FuIGRvIHRoYXQsIGFzIGxvbmcgYXMgd2Ugc2V0ICdzZWxlY3RlZCcgYmFjayB0byBmYWxzZSB3aGVuIHdlJ3JlIGRvbmVcbiAgICB0aGlzLl9kYXRhLmluY2x1c2lvbnMuZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cblxuICAgICAgICB1c2Vyc1xuICAgICAgICAgIC5maWx0ZXIodXNlciA9PlxuICAgICAgICAgICAgICBncm91cC5tZW1iZXIuZmluZChncm91cE1lbWJlckRuID0+IGdyb3VwTWVtYmVyRG4gPT09IHVzZXIuZGlzdGluZ3Vpc2hlZE5hbWUpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5mb3JFYWNoKHVzZXIgPT4gdXNlci5zZWxlY3RlZCA9IHRydWUpO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAvLyBBdCB0aGlzIHBvaW50LCBhbGwgb2YgdGhlIGFwcHJvcHJpYXRlIHVzZXJzIHNob3VsZCBoYXZlICdzZWxlY3RlZCcgc2V0IHRvIHRydWVcbiAgICBjb25zdCBzZWxlY3RlZFVzZXJzID0gdXNlcnMuZmlsdGVyKHVzZXIgPT4gdXNlci5zZWxlY3RlZCk7IC8vIFN1YnNldCBvZiB0aGUgb3JpZ2luYWwgbGlzdFxuICAgIC8vIFJlc2V0ICdzZWxlY3RlZCcgdG8gZmFsc2UsIGFuZCByZXR1cm5cbiAgICBzZWxlY3RlZFVzZXJzLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gZmFsc2UpO1xuICAgIHJldHVybiBzZWxlY3RlZFVzZXJzO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiAgUHJlLVNlbGVjdGlvbnNcbiAgI3ByZVNlbGVjdFVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuX2RhdGEucHJlU2VsZWN0aW9ucz8uYWNjb3VudE5hbWVzXG4gICAgICA/LmZvckVhY2goYWNjb3VudE5hbWUgPT4ge1xuICAgICAgICBjb25zdCB1c2VyID0gdXNlcnMuZmluZCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmICghdXNlcikgeyByZXR1cm47IH1cblxuICAgICAgICB1c2VyLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgI3ByZVNlbGVjdEdyb3Vwc0J5QWNjb3VudE5hbWUoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YS5wcmVTZWxlY3Rpb25zPy5hY2NvdW50TmFtZXNcbiAgICAgID8uZm9yRWFjaChhY2NvdW50TmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZyA9PiBnLnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgPT09IGFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoIWdyb3VwKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGdyb3VwLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH0pOztcbiAgfVxuXG4gICNwcmVTZWxlY3RVc2Vyc0J5RGVwYXJ0bWVudCh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuX2RhdGEucHJlU2VsZWN0aW9ucz8uZGVwYXJ0bWVudHNcbiAgICAgID8uZm9yRWFjaChkZXBhcnRtZW50ID0+XG4gICAgICAgIHVzZXJzXG4gICAgICAgICAgLmZpbHRlcih1ID0+IHUuZGVwYXJ0bWVudD8udG9Mb3dlckNhc2UoKSA9PT0gZGVwYXJ0bWVudC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgIC5mb3JFYWNoKHVzZXIgPT4gdXNlci5zZWxlY3RlZCA9IHRydWUpXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgI3ByZVNlbGVjdFVzZXJzQnlUaXRsZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuX2RhdGEucHJlU2VsZWN0aW9ucz8udGl0bGVzXG4gICAgICA/LmZvckVhY2godGl0bGUgPT5cbiAgICAgICAgdXNlcnNcbiAgICAgICAgICAuZmlsdGVyKHUgPT4gdS50aXRsZT8udG9Mb3dlckNhc2UoKSA9PT0gdGl0bGUudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAuZm9yRWFjaCh1c2VyID0+IHVzZXIuc2VsZWN0ZWQgPSB0cnVlKVxuICAgICAgKTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gICNwcmVTZWxlY3RVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5fZGF0YS5wcmVTZWxlY3Rpb25zPy5ncm91cHNcbiAgICAgID8uZm9yRWFjaChncm91cE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cblxuICAgICAgICBncm91cC5tZW1iZXIuZm9yRWFjaChncm91cE1lbWJlckRuID0+IHtcbiAgICAgICAgICBjb25zdCB1c2VyID0gdXNlcnMuZmluZCh1ID0+IHUuZGlzdGluZ3Vpc2hlZE5hbWUgPT09IGdyb3VwTWVtYmVyRG4pO1xuICAgICAgICAgIGlmICghdXNlcikgeyByZXR1cm47IH1cblxuICAgICAgICAgIHVzZXIuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuICBcbiAgI3NldEZpbHRlclByZWRpY2F0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJQcmVkaWNhdGUgPSAodXNlcjogKFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKSwgZmlsdGVyOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChmaWx0ZXIgPT09ICd7c2VsZWN0ZWQ6dHJ1ZX0nKSB7XG4gICAgICAgIHJldHVybiB1c2VyLnNlbGVjdGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGZpbHRlciwgJ2knKTsgLy8gQ2FzZS1pbnNlbnNpdGl2ZVxuICAgICAgICBsZXQgbWF0Y2ggPSBmYWxzZTsgLy8gVGhlIGVuZCByZXN1bHQgLSB3aGV0aGVyIG9yIG5vdCBhIGVtcGxveWVlIG1hdGNoZXMgdGhlIGZpbHRlclxuXG4gICAgICAgIGNvbnN0IGZpbHRlclByb3BlcnRpZXMgPSBbICdkaXNwbGF5TmFtZScgXTtcbiAgICAgICAgaWYgKHRoaXMuX2RhdGEuZmlsdGVyT3B0aW9ucz8uYWNjb3VudE5hbWUpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ3NBTUFjY291bnROYW1lJylcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGF0YS5maWx0ZXJPcHRpb25zPy50aXRsZSkge1xuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgndGl0bGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGF0YS5maWx0ZXJPcHRpb25zPy5kZXBhcnRtZW50KSB7XG4gICAgICAgICAgZmlsdGVyUHJvcGVydGllcy5wdXNoKCdkZXBhcnRtZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RhdGEuZmlsdGVyT3B0aW9ucz8ucGhvbmVOdW1iZXIpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ3RlbGVwaG9uZU51bWJlcicpO1xuICAgICAgICB9XG4gIFxuICAgICAgICAvLyBNYXRjaCBvbiB0aGUgcHJvcGVydGllcyBjb25maWd1cmVkIGFib3ZlXG4gICAgICAgIGZpbHRlclByb3BlcnRpZXNcbiAgICAgICAgICAuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAodXNlcltmaWVsZF0gJiYgdXNlcltmaWVsZF0ubWF0Y2gocmVnZXgpKSB7XG4gICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgXG4gICAgICAgIC8vIE1hdGNoIG9uIGdyb3VwIG1lbWJlcnNoaXAgKGdyb3VwIG5hbWUpXG4gICAgICAgIGlmICh0aGlzLl9kYXRhLmZpbHRlck9wdGlvbnM/Lmdyb3VwTWVtYmVyc2hpcCkge1xuICAgICAgICAgIHVzZXIubWVtYmVyT2YuZm9yRWFjaChncm91cERuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZ3JvdXAgPT4gZ3JvdXAuZGlzdGluZ3Vpc2hlZE5hbWUgPT09IGdyb3VwRG4gJiYgZ3JvdXAubmFtZS5tYXRjaChyZWdleCkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoZ3JvdXApIHtcbiAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAjbGlzdGVuRm9yRmlsdGVyQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKDI1MClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kYXRhU291cmNlIS5maWx0ZXIgPSB0aGlzLmZpbHRlckZvcm0udmFsdWUuZmlsdGVyPy50cmltKCkudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICB0b29sdGlwKHVzZXI6IFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zaG93R3JvdXBNZW1iZXJzaGlwVG9vbHRpcHMgP1xuICAgICAgdXNlci5tZW1iZXJPZlxuICAgICAgICAubWFwKGdyb3VwRG4gPT5cbiAgICAgICAgICB0aGlzLmdyb3Vwc1xuICAgICAgICAgICAgPy5maW5kKGdyb3VwID0+XG4gICAgICAgICAgICAgIGdyb3VwLmRpc3Rpbmd1aXNoZWROYW1lID09PSBncm91cERuXG4gICAgICAgICAgICApPy5uYW1lXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhISA+IGIhID8gMSA6IC0xKVxuICAgICAgICAgIC5qb2luKCdcXG4nKSA6XG4gICAgICAnJztcbiAgfVxuICAvLyNlbmRyZWdpb25cbn0iLCI8ZGl2IGlkPVwiZGlhbG9nLXRpdGxlXCI+XG4gIDxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7IF9kYXRhLnRpdGxlIH19PC9oMj5cblxuICA8ZGl2IGlkPVwibnVtLXNlbGVjdGVkXCI+XG4gICAge3sgc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCB9fSBzZWxlY3RlZFxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bWF0LWRpYWxvZy1jb250ZW50PlxuICBAaWYgKGRhdGFTb3VyY2UgJiYgcGhvdG9zKSB7XG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCI+XG4gICAgICBAaWYgKGRhdGFTb3VyY2UpIHtcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIlNlYXJjaFwiIGZvcm1Db250cm9sTmFtZT1cImZpbHRlclwiICNmaWx0ZXJJbnB1dD5cbiAgICAgICAgICBAaWYgKGZpbHRlckZvcm0udmFsdWUuZmlsdGVyKSB7XG4gICAgICAgICAgICA8YnV0dG9uIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gYXJpYS1sYWJlbD1cIkNsZWFyXCIgKGNsaWNrKT1cImZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8uc2V0VmFsdWUoJycpXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNsb3NlXCIvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgfVxuICAgIDwvZm9ybT5cbiAgICA8bWF0LXNlbGVjdGlvbi1saXN0IFttdWx0aXBsZV09XCJpc011bHRpTW9kZVwiXG4gICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImxpc3RTZWxlY3Rpb25DaGFuZ2VkKCRldmVudC5vcHRpb25zKVwiPlxuICAgICAgQGZvciAodXNlciBvZiBkYXRhU291cmNlLmZpbHRlcmVkRGF0YTsgdHJhY2sgdXNlcikge1xuICAgICAgICA8bWF0LWxpc3Qtb3B0aW9uIFt2YWx1ZV09XCJ1c2VyXCIgW3NlbGVjdGVkXT1cInVzZXIuc2VsZWN0ZWRcIlxuICAgICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJvcHRpb25TZWxlY3Rpb25DaGFuZ2VkKG9wdGlvbilcIiAjb3B0aW9uPlxuICAgICAgICAgIEBpZiAoZ2V0UGhvdG8odXNlcikpIHtcbiAgICAgICAgICAgIDxpbWcgbWF0TGlzdEl0ZW1BdmF0YXIgYWx0PVwiXCIgW3NyY109XCJnZXRQaG90byh1c2VyKVwiPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPG1hdC1pY29uIG1hdExpc3RJdGVtQXZhdGFyIGNsYXNzPVwibm8tcGhvdG9cIlxuICAgICAgICAgICAgICBbZm9udEljb25dPVwiaXNVc2VyKHVzZXIpID8gJ2FjY291bnRfY2lyY2xlJyA6ICdncm91cCdcIi8+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyXCI+XG4gICAgICAgICAgICA8ZGl2IFttYXRUb29sdGlwXT1cInRvb2x0aXAodXNlcilcIiBjbGFzcz1cInVzZXItbmFtZVwiPlxuICAgICAgICAgICAgICB7eyB1c2VyLmRpc3BsYXlOYW1lIH19XG4gICAgICAgICAgICAgIEBpZiAoaXNVc2VyKHVzZXIpICYmIF9kYXRhLnNob3dQaG9uZSAmJiBjYXN0VXNlcih1c2VyKS50ZWxlcGhvbmVOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICA8ZGl2Pnt7IGNhc3RVc2VyKHVzZXIpLnRlbGVwaG9uZU51bWJlciB9fTwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIEBpZiAoaXNVc2VyKHVzZXIpKSB7XG4gICAgICAgICAgICAgIDxkaXY+e3sgY2FzdFVzZXIodXNlcikuZGVwYXJ0bWVudCB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57eyBjYXN0VXNlcih1c2VyKS50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC1saXN0LW9wdGlvbj5cbiAgICAgIH1cbiAgICA8L21hdC1zZWxlY3Rpb24tbGlzdD5cbiAgfSBAZWxzZSB7XG4gICAgPGRpdj5cbiAgICAgIDxtYXQtc3Bpbm5lciBbZGlhbWV0ZXJdPVwiNTBcIi8+XG4gICAgICA8aDIgaWQ9XCJzcGlubmVyLW1lc3NhZ2VcIj5HZXR0aW5nIHVzZXJzIGFuZCBwaG90b3MuLi48L2gyPlxuICAgIDwvZGl2PlxuICB9XG48L21hdC1kaWFsb2ctY29udGVudD5cblxuPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgQGlmIChkYXRhU291cmNlICYmIHBob3Rvcykge1xuICAgIEBpZiAoc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgPG1hdC1zbGlkZS10b2dnbGUgKGNoYW5nZSk9XCJoaWRlVW5zZWxlY3RlZENoYW5nZWQoJGV2ZW50LmNoZWNrZWQpXCI+XG4gICAgICAgIEhpZGUgVW5zZWxlY3RlZFxuICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgIH1cbiAgICBAaWYgKGlzTXVsdGlNb2RlKSB7XG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzZWxlY3RBbGwoKVwiXG4gICAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwic2VsZWN0X2FsbFwiLz5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPlNlbGVjdCBBbGw8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gICAgQGlmIChpc011bHRpTW9kZSAmJiBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJkZXNlbGVjdEFsbCgpXCJcbiAgICAgICAgPlxuICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJjbGVhcl9hbGxcIi8+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1tb2JpbGVcIj5DbGVhciBBbGw8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gICAgQGlmIChpc011bHRpTW9kZSB8fCAhX2RhdGEuY2xvc2VXaGVuU2VsZWN0aW9uTWFkZSkge1xuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiY2xvc2UoKVwiIG1hdFRvb2x0aXA9XCJBY2NlcHQgeW91ciBzZWxlY3Rpb25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkT3B0aW9ucy5sZW5ndGhcIj5cbiAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiY2hlY2tcIi8+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1tb2JpbGVcIj5Pazwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgfVxuXG4gIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJ3YXJuXCIgbWF0LWRpYWxvZy1jbG9zZSBtYXRUb29sdGlwPVwiQ2xvc2UgdGhpcyB3aW5kb3dcIj5cbiAgICA8bWF0LWljb24gZm9udEljb249XCJjbG9zZVwiLz5cbiAgICA8c3BhbiBjbGFzcz1cImhpZGUtbW9iaWxlXCI+Q2FuY2VsPC9zcGFuPlxuICA8L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPiJdfQ==
@@ -158,7 +158,7 @@ class UserChooserComponent {
158
158
  ];
159
159
  // Do we need AD groups?
160
160
  if (this.adGroupsNeeded) {
161
- this._data.groups ?
161
+ this._data.groups?.length ?
162
162
  // Groups were passed in
163
163
  of(this._data.groups) :
164
164
  // Groups need to be retrieved
@@ -1 +1 @@
1
- {"version":3,"file":"cleavelandprice-ngx-lib-active-directory-material.mjs","sources":["../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/user-chooser-filter-options.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/user-chooser-mode.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/user-chooser-data.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/user-chooser-pre-processing-group.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-chooser/user-chooser.component.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-chooser/user-chooser.component.html","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-form-field/user-form-field.component.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-form-field/user-form-field.component.html","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/mat-active-directory.module.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/cleavelandprice-ngx-lib-active-directory-material.ts"],"sourcesContent":["/*export class UserChooserFilterOptions {\r\n accountName = true;\r\n department = true;\r\n groupMembership = false;\r\n phoneNumber = true;\r\n title = true;\r\n}*/\r\nexport interface UserChooserFilterOptions {\r\n accountName?: boolean;\r\n department?: boolean;\r\n groupMembership?: boolean;\r\n phoneNumber?: boolean;\r\n title?: boolean;\r\n};\r\n\r\nexport const DefaultUserChooserFilterOptions: UserChooserFilterOptions = {\r\n accountName: true,\r\n department: true,\r\n groupMembership: false,\r\n phoneNumber: true,\r\n title: true\r\n};","export enum UserChooserMode {\r\n Single,\r\n Multiple\r\n}","import { Group, User } from \"@cleavelandprice/ngx-lib/active-directory\";\r\nimport { PhotoItem } from \"@cleavelandprice/ngx-lib/sharepoint\";\r\n\r\nimport { DefaultUserChooserFilterOptions, UserChooserFilterOptions } from \"./user-chooser-filter-options\";\r\nimport { UserChooserMode } from \"./user-chooser-mode\";\r\nimport { UserChooserPreProcessingGroup } from \"./user-chooser-pre-processing-group\";\r\n\r\n/*export class UserChooserData {\r\n // Should the dialog close automatically when the user chooses an item?\r\n // Applies to single-user mode only\r\n closeWhenSelectionMade = false;\r\n\r\n // If the component is tasked with pulling Active Directory users (default setting),\r\n // should that include disabled users?\r\n includeDisabledUsers = false;\r\n\r\n // If the component is tasked with pulling Active Directory users (default setting),\r\n // should that search begin at a particular Organization Unit?\r\n parentOu?: string;\r\n\r\n // If true, the component will return an array of Active Directory User objects.\r\n // If false (default), the component will return an array of user account names.\r\n returnUserObjects = false;\r\n\r\n // Should the dialog include hover tooptips for each user that displays their group membership\r\n // You probably don't want this, which is why the default is false\r\n showGroupMembershipTooltips = false;\r\n\r\n // Should the user phone number be displayed next to their name in the dialog\r\n showPhone = true;\r\n\r\n // Title displayed in the dialog\r\n title = 'Select User(s)';\r\n\r\n // Single or Multi mode\r\n mode = UserChooserMode.Single;\r\n \r\n // As the user types into the filter field, the list of users is filtered.\r\n // The filterOptions determine which user properties are taken into consideration for that filter.\r\n // Note, displayName is always included (hard-coded), and is therefore not a filter option.\r\n filterOptions = new UserChooserFilterOptions();\r\n\r\n exclusions = new UserChooserPreProcessingGroup();\r\n inclusions = new UserChooserPreProcessingGroup();\r\n preSelections = new UserChooserPreProcessingGroup();\r\n\r\n // By default, the component will pull a fresh list of Active Directory users/groups and SharePoint photos.\r\n // But if the parent component already has them, you can pass them in via these properties.\r\n users?: User[];\r\n groups?: Group[];\r\n photos?: PhotoItem[];\r\n\r\n selectableGroupNames?: string[];\r\n}*/\r\n\r\nexport interface UserChooserData {\r\n // Should the dialog close automatically when the user chooses an item?\r\n // Applies to single-user mode only\r\n closeWhenSelectionMade?: boolean;\r\n\r\n // If the component is tasked with pulling Active Directory users (default setting),\r\n // should that include disabled users?\r\n includeDisabledUsers?: boolean;\r\n\r\n // If the component is tasked with pulling Active Directory users (default setting),\r\n // should that search begin at a particular Organization Unit?\r\n parentOu?: string;\r\n\r\n // If true, the component will return an array of Active Directory User objects.\r\n // If false (default), the component will return an array of user account names.\r\n returnUserObjects?: boolean;\r\n\r\n // Should the dialog include hover tooptips for each user that displays their group membership\r\n // You probably don't want this, which is why the default is false\r\n showGroupMembershipTooltips?: boolean;\r\n\r\n // Should the user phone number be displayed next to their name in the dialog\r\n showPhone?: boolean;\r\n\r\n // Title displayed in the dialog\r\n title?: string;\r\n\r\n // Single or Multi mode\r\n mode?: UserChooserMode;\r\n \r\n // As the user types into the filter field, the list of users is filtered.\r\n // The filterOptions determine which user properties are taken into consideration for that filter.\r\n // Note, displayName is always included (hard-coded), and is therefore not a filter option.\r\n filterOptions?: UserChooserFilterOptions;\r\n\r\n exclusions?: UserChooserPreProcessingGroup;\r\n inclusions?: UserChooserPreProcessingGroup;\r\n preSelections?: UserChooserPreProcessingGroup;\r\n\r\n // By default, the component will pull a fresh list of Active Directory users/groups and SharePoint photos.\r\n // But if the parent component already has them, you can pass them in via these properties.\r\n users?: User[];\r\n groups?: Group[];\r\n photos?: PhotoItem[];\r\n\r\n selectableGroupNames?: string[];\r\n}\r\n\r\nexport const DefaultUserChooserData: UserChooserData = {\r\n closeWhenSelectionMade: false,\r\n includeDisabledUsers: false,\r\n returnUserObjects: false,\r\n showGroupMembershipTooltips: false,\r\n showPhone: true,\r\n title: 'Select User(s)',\r\n mode: UserChooserMode.Single,\r\n filterOptions: DefaultUserChooserFilterOptions\r\n};","/*export class UserChooserPreProcessingGroup {\r\n accountNames: string[] = [];\r\n departments: string[] = [];\r\n groups: string[] = [];\r\n titles: string[] = [];\r\n}*/\r\nexport interface UserChooserPreProcessingGroup {\r\n accountNames?: string[];\r\n departments?: string[];\r\n groups?: string[];\r\n titles?: string[];\r\n};","import { Component, ElementRef, inject, OnInit, ViewChild, viewChild } from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef } from '@angular/material/dialog';\nimport { MatListItemAvatar, MatListOption, MatSelectionList } from '@angular/material/list';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { debounceTime, forkJoin, Observable, of } from 'rxjs';\n\nimport { ActiveDirectoryService } from '@cleavelandprice/ngx-lib/active-directory';\nimport { PhotoItem, SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';\n\nimport { MatButton, MatIconButton } from '@angular/material/button';\nimport { MatFormField } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { MatSlideToggle } from '@angular/material/slide-toggle';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { SelectableGroup } from '../../model/selectable-group';\nimport { SelectableUser } from '../../model/selectable-user';\nimport { DefaultUserChooserData, UserChooserData } from '../../model/user-chooser-data';\nimport { UserChooserMode } from '../../model/user-chooser-mode';\n\n@Component({\n standalone: true,\n templateUrl: './user-chooser.component.html',\n imports: [\n MatButton,\n MatDialogActions,\n MatDialogClose,\n MatDialogContent,\n MatFormField,\n MatIcon,\n MatIconButton,\n MatInput,\n MatListItemAvatar,\n MatListOption,\n MatProgressSpinner,\n MatSelectionList,\n MatSlideToggle,\n MatTooltip,\n ReactiveFormsModule,\n ],\n styleUrls: [\n './user-chooser.component.scss',\n '../../../../../styles/mat-icon.scss'\n ]\n})\nexport class UserChooserComponent implements OnInit {\n #services = {\n dialogRef: inject(MatDialogRef<UserChooserComponent>),\n activeDirectory: inject(ActiveDirectoryService),\n sharePoint: inject(SharePointService),\n data: inject<UserChooserData>(MAT_DIALOG_DATA)\n };\n _data = {...DefaultUserChooserData, ...this.#services.data};\n \n //#region Fields\n \n //@ViewChild(MatSelectionList) selectionList?: MatSelectionList;\n selectionList = viewChild(MatSelectionList);\n\n @ViewChild('filterInput') set filterInput(elRef: ElementRef<HTMLInputElement>) {\n if (elRef) {\n elRef.nativeElement.focus();\n }\n };\n //filterInput = viewChild<ElementRef>('filterInput');\n\n filterForm = new FormGroup({\n filter: new FormControl()\n });\n\n dataSource?: MatTableDataSource<SelectableUser | SelectableGroup>;\n photos?: PhotoItem[];\n groups?: SelectableGroup[]; // May or may not get populated, depending on config data sent in\n //#endregion\n\n //#region Properties\n get isMultiMode(): boolean {\n return this._data.mode === UserChooserMode.Multiple;\n }\n\n get selectedOptions(): MatListOption[] {\n return this.selectionList()?.options.filter(o => o.selected) ?? [];\n }\n\n get selectedUsers(): (SelectableUser | SelectableGroup)[] {\n return this.dataSource?.data?.filter(d => d.selected) ?? [];\n }\n\n get filterValue(): string {\n return this.filterForm.value.filter;\n }\n\n get adGroupsNeeded(): boolean {\n // If any are these are true, then we need to pull AD groups for use later\n return (this._data.showGroupMembershipTooltips ?? false) ||\n (this._data.exclusions?.groups?.length ?? 0) > 0 ||\n (this._data.inclusions?.groups?.length ?? 0) > 0 ||\n (this._data.preSelections?.groups?.length ?? 0) > 0 ||\n this._data.filterOptions?.groupMembership ||\n (this._data.selectableGroupNames?.length ?? 0) > 0 ||\n (this._data.groups?.length ?? 0) > 0;\n }\n //#endregion\n\n //#region Lifecycle\n ngOnInit(): void {\n this.#getData();\n this.#listenForFilterChanges();\n }\n //#endregion\n\n //#region Events\n listSelectionChanged(options: MatListOption[]): void {\n if (this._data.mode === UserChooserMode.Single &&\n this.selectedOptions.length &&\n this._data.closeWhenSelectionMade\n ) {\n this.close();\n }\n }\n\n optionSelectionChanged(option: MatListOption): void {\n const user = this.dataSource?.data\n .find(u => u.sAMAccountName.toLocaleLowerCase() === (option.value as SelectableUser).sAMAccountName.toLowerCase());\n\n if (user) {\n // If we are in single user selection mode, deselect any existing selections first\n if (!this.isMultiMode && option.selected) {\n this.dataSource?.data\n .filter(u => u.sAMAccountName.toLowerCase() !== (option.value as SelectableUser).sAMAccountName.toLowerCase())\n .forEach(u => u.selected = false);\n }\n\n user.selected = option.selected;\n }\n }\n\n hideUnselectedChanged(selected: boolean): void {\n this.filterForm.get('filter')?.setValue(selected ? '{selected:true}' : null);\n }\n\n selectAll(): void {\n this.selectionList()?.selectAll();\n\n if (this.selectionList()?.options) {\n this.listSelectionChanged(this.selectionList()!.options.toArray());\n }\n }\n\n deselectAll(): void {\n this.selectionList()?.deselectAll();\n }\n //#endregion\n\n //#region Utilities\n isUser(userOrGroup: SelectableUser | SelectableGroup): boolean {\n return 'title' in userOrGroup;\n }\n castUser(userOrGroup: SelectableUser | SelectableGroup): SelectableUser {\n return userOrGroup as SelectableUser;\n }\n\n #getData(): void {\n const dataObservables: Observable<any>[] = [\n this._data.users ?\n // Users were passed in\n of(this._data.users) :\n // Users need to be retrieved\n this.#services.activeDirectory.getUsers(false, this._data.includeDisabledUsers, this._data.parentOu),\n\n this._data.photos ?\n // Photos were passed in\n of(this._data.photos) :\n // Photos need to be retrieved\n this.#services.sharePoint.getPhotos()\n ];\n\n // Do we need AD groups?\n if (this.adGroupsNeeded) {\n this._data.groups ?\n // Groups were passed in\n of(this._data.groups) :\n // Groups need to be retrieved\n dataObservables.push(this.#services.activeDirectory.getGroups());\n }\n\n\n forkJoin(dataObservables)\n //.subscribe(([users, photos]) => {\n .subscribe(data => {\n // Need groups in place before we handle exclusions/inclusions/pre-selections\n this.groups = this.adGroupsNeeded ?\n data[2] :\n null;\n\n let users = data[0] as SelectableUser[];\n users.forEach(u => u.selected = false); // In case existing data was re-used\n users = this.#includeUsersByAccountName(users);\n users = this.#includeUsersByGroupName(users);\n users = this.#includeUsersByDepartment(users);\n users = this.#includeUsersByTitle(users);\n\n users = this.#excludeUsersByAccountName(users);\n users = this.#excludeUsersByGroupName(users);\n users = this.#excludeUsersByDepartment(users);\n users = this.#excludeUsersByTitle(users);\n\n users = this.#preSelectUsersByAccountName(users);\n users = this.#preSelectUsersByGroupName(users);\n users = this.#preSelectUsersByDepartment(users);\n users = this.#preSelectUsersByTitle(users);\n\n this.#preSelectGroupsByAccountName();\n\n const usersAndGroups: (SelectableUser | SelectableGroup)[] = [\n ...users\n ];\n\n if (this._data.selectableGroupNames?.length) {\n this._data.selectableGroupNames\n .forEach(groupName => {\n const group = this.groups!.find(g => g.displayName === groupName);\n\n if (group) {\n usersAndGroups.push({\n ...group,\n selected: group.selected\n });\n }\n });\n }\n\n this.dataSource = new MatTableDataSource(usersAndGroups);\n \n this.photos = data[1];\n\n this.#setFilterPredicate();\n });\n }\n\n close(): void {\n if (!this.selectedUsers) {\n this.#services.dialogRef.close();\n return;\n }\n const value = this.selectedUsers\n .map(u => this._data.returnUserObjects ? u : u.sAMAccountName);\n\n this.#services.dialogRef.close(this._data.mode === UserChooserMode.Multiple ?\n value :\n value[0]\n );\n }\n\n getPhoto(user: SelectableUser | SelectableGroup): string | undefined {\n if (!this.isUser(user)) { return; }\n\n return this.photos?.find(p =>\n (p.employeeNumber && p.employeeNumber.toString() === (user as SelectableUser).employeeNumber) ||\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\n p.displayName?.toLowerCase() === user.displayName.toLowerCase() ||\n p.title?.toLowerCase() === user.displayName.toLowerCase()\n )?.encodedAbsUrl;\n }\n\n //#region Exclusions - won't be included in the dataSource at all\n #excludeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.accountNames\n ?.forEach(accountName => {\n const index = users.findIndex(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());\n if (index === -1) { return; }\n\n users.splice(index, 1);\n });\n\n return users;\n }\n\n #excludeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.groups\n ?.forEach(groupName => {\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\n if (!group) { return; }\n \n group.member.forEach(groupMemberDn => {\n const index = users.findIndex(u => u.distinguishedName === groupMemberDn);\n if (index === -1) { return; }\n\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n\n #excludeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.departments\n ?.forEach(department => {\n const excludedUsers = users.filter(u => u.department?.toLowerCase() === department.toLowerCase());\n\n excludedUsers.forEach(user => {\n const index = users.indexOf(user);\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n\n #excludeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.titles\n ?.forEach(title => {\n const excludedUsers = users.filter(u => u.title?.toLowerCase() === title.toLowerCase());\n \n excludedUsers.forEach(user => {\n const index = users.indexOf(user);\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n //#endregion\n\n //#region Inclusions - only these will be included in the dataSource\n #includeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n return users.filter(user =>\n !this._data.inclusions?.accountNames?.length || // No account inclusions specified\n\n this._data.inclusions.accountNames.find(accountName =>\n accountName.toLowerCase() === user.sAMAccountName.toLowerCase()\n ));\n }\n\n #includeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n return users.filter(user =>\n !this._data.inclusions?.departments?.length || // No department inclusions specified\n\n this._data.inclusions.departments.find(department =>\n department.toLowerCase() === user.department?.toLowerCase()\n ));\n }\n\n #includeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n return users.filter(user =>\n !this._data.inclusions?.titles?.length || // No title inclusions specified\n\n this._data.inclusions.titles.find(title =>\n title.toLowerCase() === user.title?.toLowerCase()\n ));\n }\n\n #includeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n if (!this._data.inclusions?.groups?.length) {\n return users; // No group inclusions specified\n }\n\n // Cheating a bit and leveraging the 'selected' property to keep track of who should be included\n // Since inclusions happen befor pre-selections, we can do that, as long as we set 'selected' back to false when we're done\n this._data.inclusions.groups\n .forEach(groupName => {\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\n if (!group) { return; }\n\n users\n .filter(user =>\n group.member.find(groupMemberDn => groupMemberDn === user.distinguishedName)\n )\n .forEach(user => user.selected = true);\n });\n \n // At this point, all of the appropriate users should have 'selected' set to true\n const selectedUsers = users.filter(user => user.selected); // Subset of the original list\n // Reset 'selected' to false, and return\n selectedUsers.forEach(user => user.selected = false);\n return selectedUsers;\n }\n //#endregion\n\n //#region Pre-Selections\n #preSelectUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.accountNames\n ?.forEach(accountName => {\n const user = users.find(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());\n if (!user) { return; }\n\n user.selected = true;\n });\n\n return users;\n }\n\n #preSelectGroupsByAccountName(): void {\n this._data.preSelections?.accountNames\n ?.forEach(accountName => {\n const group = this.groups?.find(g => g.sAMAccountName.toLowerCase() === accountName.toLowerCase());\n if (!group) { return; }\n\n group.selected = true;\n });;\n }\n\n #preSelectUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.departments\n ?.forEach(department =>\n users\n .filter(u => u.department?.toLowerCase() === department.toLowerCase())\n .forEach(user => user.selected = true)\n );\n\n return users;\n }\n\n #preSelectUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.titles\n ?.forEach(title =>\n users\n .filter(u => u.title?.toLowerCase() === title.toLowerCase())\n .forEach(user => user.selected = true)\n );\n\n return users;\n }\n\n #preSelectUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.groups\n ?.forEach(groupName => {\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\n if (!group) { return; }\n\n group.member.forEach(groupMemberDn => {\n const user = users.find(u => u.distinguishedName === groupMemberDn);\n if (!user) { return; }\n\n user.selected = true;\n });\n });\n\n return users;\n }\n //#endregion\n \n #setFilterPredicate(): void {\n if (!this.dataSource) {\n return;\n }\n\n this.dataSource.filterPredicate = (user: (SelectableUser | SelectableGroup), filter: string) => {\n if (filter === '{selected:true}') {\n return user.selected;\n } else {\n const regex = new RegExp(filter, 'i'); // Case-insensitive\n let match = false; // The end result - whether or not a employee matches the filter\n\n const filterProperties = [ 'displayName' ];\n if (this._data.filterOptions?.accountName) {\n filterProperties.push('sAMAccountName')\n }\n if (this._data.filterOptions?.title) {\n filterProperties.push('title');\n }\n if (this._data.filterOptions?.department) {\n filterProperties.push('department');\n }\n if (this._data.filterOptions?.phoneNumber) {\n filterProperties.push('telephoneNumber');\n }\n \n // Match on the properties configured above\n filterProperties\n .forEach(field => {\n // @ts-ignore\n if (user[field] && user[field].match(regex)) {\n match = true;\n }\n });\n \n // Match on group membership (group name)\n if (this._data.filterOptions?.groupMembership) {\n user.memberOf.forEach(groupDn => {\n const group = this.groups?.find(group => group.distinguishedName === groupDn && group.name.match(regex));\n \n if (group) {\n match = true;\n }\n });\n }\n\n return match;\n }\n };\n }\n\n #listenForFilterChanges(): void {\n this.filterForm.get('filter')?.valueChanges\n .pipe(\n debounceTime(250)\n )\n .subscribe(() => this.dataSource!.filter = this.filterForm.value.filter?.trim().toLowerCase());\n }\n\n tooltip(user: SelectableUser | SelectableGroup): string {\n return this._data.showGroupMembershipTooltips ?\n user.memberOf\n .map(groupDn =>\n this.groups\n ?.find(group =>\n group.distinguishedName === groupDn\n )?.name\n )\n .sort((a, b) => a! > b! ? 1 : -1)\n .join('\\n') :\n '';\n }\n //#endregion\n}","<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ _data.title }}</h2>\n\n <div id=\"num-selected\">\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n @if (dataSource && photos) {\n <form [formGroup]=\"filterForm\">\n @if (dataSource) {\n <mat-form-field>\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\n @if (filterForm.value.filter) {\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\n <mat-icon fontIcon=\"close\"/>\n </button>\n }\n </mat-form-field>\n }\n </form>\n <mat-selection-list [multiple]=\"isMultiMode\"\n (selectionChange)=\"listSelectionChanged($event.options)\">\n @for (user of dataSource.filteredData; track user) {\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\n @if (getPhoto(user)) {\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\n } @else {\n <mat-icon matListItemAvatar class=\"no-photo\"\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\"/>\n }\n <div class=\"user\">\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\n {{ user.displayName }}\n @if (isUser(user) && _data.showPhone && castUser(user).telephoneNumber) {\n <div>{{ castUser(user).telephoneNumber }}</div>\n }\n </div>\n @if (isUser(user)) {\n <div>{{ castUser(user).department }}</div>\n <div class=\"title\">{{ castUser(user).title }}</div>\n }\n </div>\n </mat-list-option>\n }\n </mat-selection-list>\n } @else {\n <div>\n <mat-spinner [diameter]=\"50\"/>\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\n </div>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (dataSource && photos) {\n @if (selectedOptions.length) {\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\n Hide Unselected\n </mat-slide-toggle>\n }\n @if (isMultiMode) {\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\n >\n <mat-icon fontIcon=\"select_all\"/>\n <span class=\"hide-mobile\">Select All</span>\n </button>\n }\n @if (isMultiMode && selectedOptions.length) {\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\n >\n <mat-icon fontIcon=\"clear_all\"/>\n <span class=\"hide-mobile\">Clear All</span>\n </button>\n }\n @if (isMultiMode || !_data.closeWhenSelectionMade) {\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\n [disabled]=\"!selectedOptions.length\">\n <mat-icon fontIcon=\"check\"/>\n <span class=\"hide-mobile\">Ok</span>\n </button>\n }\n }\n\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\n <mat-icon fontIcon=\"close\"/>\n <span class=\"hide-mobile\">Cancel</span>\n </button>\n</mat-dialog-actions>","import { Component, inject, input, OnInit, output } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { forkJoin, of } from 'rxjs';\n\nimport { ActiveDirectoryService, User, UserOrGroup } from '@cleavelandprice/ngx-lib/active-directory';\nimport { PhotoItem, SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';\n\nimport { DefaultUserChooserData, UserChooserData } from '../../model/user-chooser-data';\n\nimport { MatButton, MatIconButton } from '@angular/material/button';\nimport { MatFormField } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { UserChooserComponent } from '../user-chooser/user-chooser.component';\n\n@Component({\n selector: 'cp-user-field',\n standalone: true,\n imports: [\n MatButton,\n MatFormField,\n MatIcon,\n MatIconButton,\n MatInput,\n MatProgressBar,\n ],\n templateUrl: './user-form-field.component.html',\n styleUrl: './user-form-field.component.scss'\n})\nexport class UserFormFieldComponent implements OnInit {\n //#region Fields\n #services = {\n dialog: inject(MatDialog),\n activeDirectory: inject(ActiveDirectoryService),\n sharePoint: inject(SharePointService)\n };\n usersSelected = output<string | string[] | UserOrGroup | UserOrGroup[]>(); // string for Single mode, string[] for multi\n userUnSelected = output<string>();\n placeholder = input('Select User(s)');\n clickable = input(true);\n userChooserData = input.required<UserChooserData>();\n _userChooserData!: UserChooserData;\n\n accountNames?: string[];\n\n users?: User[];\n groups?: UserOrGroup[];\n photos?: PhotoItem[];\n //#endregion\n\n //#region Properties\n /*get isEdge(): boolean {\n return window.navigator.userAgent.indexOf('Edge') > -1;\n }*/\n //#endregion\n \n //#region Lifecycle\n ngOnInit(): void {\n this._userChooserData = {\n ...DefaultUserChooserData,\n ...this.userChooserData()\n }\n\n // If users have been pre-selected in the config, store those in accountNames, which drives the UI of this component\n this.accountNames = this._userChooserData.preSelections?.accountNames;\n\n this.#getData();\n }\n //#endregion\n\n //#region Events\n selectUser(): void {\n if (!this.clickable()) { return; }\n\n const data: UserChooserData = {\n ...this._userChooserData,\n\n users: this.users,\n photos: this.photos,\n };\n\n this.#services.dialog.open(UserChooserComponent, {\n data: data\n })\n .afterClosed()\n .subscribe((selected: string | string[] | UserOrGroup | UserOrGroup[]) => {\n if (!selected) { return; }\n \n this.accountNames = Array.isArray(selected) ?\n selected.map(s => typeof(s) === 'string' ? s : s.sAMAccountName) :\n [ selected ].map(s => typeof(s) === 'string' ? s : s.sAMAccountName);\n\n // Overwrite what may have been passed in, for subsequent launches of UserChooserComponent - otherwise it just keeps getting fed stale data\n if (this._userChooserData.preSelections) {\n this._userChooserData.preSelections.accountNames = this.accountNames;\n }\n\n this.usersSelected.emit(selected);\n });\n }\n\n unSelectUser(accountName: string): void {\n const index = this.accountNames?.findIndex(a => a === accountName);\n this.accountNames?.splice(index ?? -1, 1);\n\n if (this._userChooserData.preSelections) {\n this._userChooserData.preSelections.accountNames = this.accountNames;\n }\n\n this.userUnSelected.emit(accountName);\n }\n //#endregion\n\n //#region Utilities\n #getData(): void {\n forkJoin([\n this._userChooserData!.users ?\n // Users were passed in\n of(this._userChooserData!.users) :\n // Users need to be retrieved\n this.#services.activeDirectory.getUsers(false, this._userChooserData!.includeDisabledUsers, this._userChooserData!.parentOu),\n\n this._userChooserData!.groups ?\n // Groups were passed in\n of(this._userChooserData!.groups) :\n // Groups need to be retrieved\n this.#services.activeDirectory.getGroups(this._userChooserData!.parentOu),\n\n this._userChooserData!.photos ?\n // Photos were passed in\n of(this._userChooserData!.photos) :\n // Photos need to be retrieved\n this.#services.sharePoint.getPhotos()\n ])\n .subscribe(([users, groups, photos]) => {\n this.users = users;\n this.groups = groups;\n this.photos = photos;\n });\n }\n\n getUser(user: string | User | undefined): User | undefined {\n user = typeof(user) === 'string' ?\n this.users?.find(u => u.sAMAccountName.toLowerCase() === user?.toString().toLowerCase()) :\n user;\n\n return !user ? undefined :\n 'groupType' in user ? undefined : user;\n }\n\n getGroup(group: string | UserOrGroup | undefined): UserOrGroup | undefined {\n group = typeof(group) === 'string' ?\n this.groups?.find(g => g.sAMAccountName.toLowerCase() === group?.toString().toLowerCase()) :\n group;\n\n return !group ? undefined :\n 'groupType' in group ? group : undefined;\n }\n\n getPhoto(accountName: string): string | undefined {\n const user = this.getUser(accountName);\n if (!user) { return undefined; }\n\n return this.photos?.find(p =>\n (p.employeeNumber && p.employeeNumber.toString() === user.employeeNumber) ||\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\n p.displayName?.toLowerCase() === user.displayName.toLowerCase() ||\n p.title?.toLowerCase() === user.displayName.toLowerCase()\n )?.encodedAbsUrl;\n }\n //#endregion\n}","\n<!-- In Microsoft Edge, selectUser() never gets called if the input fields are disabled\nSo... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\nIt's definitely a better experience if the field IS disabled.\nOtherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\n-->\n<!-- Update 8/24/2023:\nThe above problem also exists in Chrome now.\nSo instead of dynamically setting [disabled] based on browser type,\nI'm applying CSS to suppress mouse events on the input - thus making it bubble up to the parent control, which responds the way we want/\n-->\n\n@if (users && photos) {\n <div (click)=\"selectUser()\" [class.clickable]=\"clickable()\">\n @if (accountNames?.length) {\n <div\n [class.grid]=\"accountNames?.length ?? 0 > 1\"\n [class.three]=\"accountNames?.length ?? 0 > 2\"\n [class.four]=\"accountNames?.length ?? 0 > 3\"\n [class.five]=\"accountNames?.length ?? 0 > 4\">\n @for (accountName of accountNames; track accountName; let i = $index) {\n <div class=\"user\">\n <!--<img *ngIf=\"accountName && empUtils.getEmployee(accountName)\" alt=\"\" [src]=\"empUtils.getEmployee(accountName) | employeePhotoUrl:cacheService.photos\">-->\n @if (getPhoto(accountName)) {\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(accountName)\">\n }\n @if (getGroup(accountName)) {\n <mat-icon>group</mat-icon>\n }\n <mat-form-field>\n <!-- [disabled]=\"!isEdge\" -->\n <input matInput disabled [placeholder]=\"i === 0 ? placeholder() : ''\"\n [value]=\"getUser(accountName)?.displayName ?? getGroup(accountName)?.displayName ?? accountName\">\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"$event.stopPropagation(); unSelectUser(accountName)\">\n <mat-icon fontIcon=\"close\"/>\n </button>\n </mat-form-field>\n </div>\n }\n </div>\n } @else {\n <mat-form-field>\n <input matInput disabled [placeholder]=\"placeholder()\"> <!-- [disabled]=\"!isEdge\" -->\n </mat-form-field>\n }\n </div>\n} @else {\n <mat-progress-bar mode=\"indeterminate\"/>\n}","import { CommonModule } from '@angular/common';\nimport { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatListModule } from '@angular/material/list';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { ActiveDirectoryServiceOptions, ActiveDirectoryServiceOptionsToken } from '@cleavelandprice/ngx-lib/active-directory';\n\nimport { UserChooserComponent } from './components/user-chooser/user-chooser.component';\nimport { UserFormFieldComponent } from './components/user-form-field/user-form-field.component';\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n\n MatButtonModule,\n MatDialogModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatListModule,\n MatProgressBarModule,\n MatProgressSpinnerModule,\n MatSlideToggleModule,\n MatTableModule,\n MatTooltipModule,\n\n UserChooserComponent,\n UserFormFieldComponent\n ],\n exports: [\n UserChooserComponent,\n UserFormFieldComponent\n ]\n})\nexport class MatActiveDirectoryModule {\n static forRoot(config: ActiveDirectoryServiceOptions): ModuleWithProviders<MatActiveDirectoryModule> {\n return {\n ngModule: MatActiveDirectoryModule,\n providers: [\n {\n provide: ActiveDirectoryServiceOptionsToken,\n useValue: config\n }\n ]\n };\n }\n\n constructor(@Optional() @SkipSelf() parentModule: MatActiveDirectoryModule) {\n if (parentModule) {\n throw new Error(\n 'MatActiveDirectoryModule is already loaded. Import it in the AppModule only');\n }\n }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './mat-active-directory.api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cleavelandprice-ngx-lib-active-directory-material.mjs","sources":["../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/user-chooser-filter-options.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/user-chooser-mode.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/user-chooser-data.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/user-chooser-pre-processing-group.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-chooser/user-chooser.component.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-chooser/user-chooser.component.html","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-form-field/user-form-field.component.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-form-field/user-form-field.component.html","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/mat-active-directory.module.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/cleavelandprice-ngx-lib-active-directory-material.ts"],"sourcesContent":["/*export class UserChooserFilterOptions {\r\n accountName = true;\r\n department = true;\r\n groupMembership = false;\r\n phoneNumber = true;\r\n title = true;\r\n}*/\r\nexport interface UserChooserFilterOptions {\r\n accountName?: boolean;\r\n department?: boolean;\r\n groupMembership?: boolean;\r\n phoneNumber?: boolean;\r\n title?: boolean;\r\n};\r\n\r\nexport const DefaultUserChooserFilterOptions: UserChooserFilterOptions = {\r\n accountName: true,\r\n department: true,\r\n groupMembership: false,\r\n phoneNumber: true,\r\n title: true\r\n};","export enum UserChooserMode {\r\n Single,\r\n Multiple\r\n}","import { Group, User } from \"@cleavelandprice/ngx-lib/active-directory\";\r\nimport { PhotoItem } from \"@cleavelandprice/ngx-lib/sharepoint\";\r\n\r\nimport { DefaultUserChooserFilterOptions, UserChooserFilterOptions } from \"./user-chooser-filter-options\";\r\nimport { UserChooserMode } from \"./user-chooser-mode\";\r\nimport { UserChooserPreProcessingGroup } from \"./user-chooser-pre-processing-group\";\r\n\r\n/*export class UserChooserData {\r\n // Should the dialog close automatically when the user chooses an item?\r\n // Applies to single-user mode only\r\n closeWhenSelectionMade = false;\r\n\r\n // If the component is tasked with pulling Active Directory users (default setting),\r\n // should that include disabled users?\r\n includeDisabledUsers = false;\r\n\r\n // If the component is tasked with pulling Active Directory users (default setting),\r\n // should that search begin at a particular Organization Unit?\r\n parentOu?: string;\r\n\r\n // If true, the component will return an array of Active Directory User objects.\r\n // If false (default), the component will return an array of user account names.\r\n returnUserObjects = false;\r\n\r\n // Should the dialog include hover tooptips for each user that displays their group membership\r\n // You probably don't want this, which is why the default is false\r\n showGroupMembershipTooltips = false;\r\n\r\n // Should the user phone number be displayed next to their name in the dialog\r\n showPhone = true;\r\n\r\n // Title displayed in the dialog\r\n title = 'Select User(s)';\r\n\r\n // Single or Multi mode\r\n mode = UserChooserMode.Single;\r\n \r\n // As the user types into the filter field, the list of users is filtered.\r\n // The filterOptions determine which user properties are taken into consideration for that filter.\r\n // Note, displayName is always included (hard-coded), and is therefore not a filter option.\r\n filterOptions = new UserChooserFilterOptions();\r\n\r\n exclusions = new UserChooserPreProcessingGroup();\r\n inclusions = new UserChooserPreProcessingGroup();\r\n preSelections = new UserChooserPreProcessingGroup();\r\n\r\n // By default, the component will pull a fresh list of Active Directory users/groups and SharePoint photos.\r\n // But if the parent component already has them, you can pass them in via these properties.\r\n users?: User[];\r\n groups?: Group[];\r\n photos?: PhotoItem[];\r\n\r\n selectableGroupNames?: string[];\r\n}*/\r\n\r\nexport interface UserChooserData {\r\n // Should the dialog close automatically when the user chooses an item?\r\n // Applies to single-user mode only\r\n closeWhenSelectionMade?: boolean;\r\n\r\n // If the component is tasked with pulling Active Directory users (default setting),\r\n // should that include disabled users?\r\n includeDisabledUsers?: boolean;\r\n\r\n // If the component is tasked with pulling Active Directory users (default setting),\r\n // should that search begin at a particular Organization Unit?\r\n parentOu?: string;\r\n\r\n // If true, the component will return an array of Active Directory User objects.\r\n // If false (default), the component will return an array of user account names.\r\n returnUserObjects?: boolean;\r\n\r\n // Should the dialog include hover tooptips for each user that displays their group membership\r\n // You probably don't want this, which is why the default is false\r\n showGroupMembershipTooltips?: boolean;\r\n\r\n // Should the user phone number be displayed next to their name in the dialog\r\n showPhone?: boolean;\r\n\r\n // Title displayed in the dialog\r\n title?: string;\r\n\r\n // Single or Multi mode\r\n mode?: UserChooserMode;\r\n \r\n // As the user types into the filter field, the list of users is filtered.\r\n // The filterOptions determine which user properties are taken into consideration for that filter.\r\n // Note, displayName is always included (hard-coded), and is therefore not a filter option.\r\n filterOptions?: UserChooserFilterOptions;\r\n\r\n exclusions?: UserChooserPreProcessingGroup;\r\n inclusions?: UserChooserPreProcessingGroup;\r\n preSelections?: UserChooserPreProcessingGroup;\r\n\r\n // By default, the component will pull a fresh list of Active Directory users/groups and SharePoint photos.\r\n // But if the parent component already has them, you can pass them in via these properties.\r\n users?: User[];\r\n groups?: Group[];\r\n photos?: PhotoItem[];\r\n\r\n selectableGroupNames?: string[];\r\n}\r\n\r\nexport const DefaultUserChooserData: UserChooserData = {\r\n closeWhenSelectionMade: false,\r\n includeDisabledUsers: false,\r\n returnUserObjects: false,\r\n showGroupMembershipTooltips: false,\r\n showPhone: true,\r\n title: 'Select User(s)',\r\n mode: UserChooserMode.Single,\r\n filterOptions: DefaultUserChooserFilterOptions\r\n};","/*export class UserChooserPreProcessingGroup {\r\n accountNames: string[] = [];\r\n departments: string[] = [];\r\n groups: string[] = [];\r\n titles: string[] = [];\r\n}*/\r\nexport interface UserChooserPreProcessingGroup {\r\n accountNames?: string[];\r\n departments?: string[];\r\n groups?: string[];\r\n titles?: string[];\r\n};","import { Component, ElementRef, inject, OnInit, ViewChild, viewChild } from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef } from '@angular/material/dialog';\nimport { MatListItemAvatar, MatListOption, MatSelectionList } from '@angular/material/list';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { debounceTime, forkJoin, Observable, of } from 'rxjs';\n\nimport { ActiveDirectoryService } from '@cleavelandprice/ngx-lib/active-directory';\nimport { PhotoItem, SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';\n\nimport { MatButton, MatIconButton } from '@angular/material/button';\nimport { MatFormField } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { MatSlideToggle } from '@angular/material/slide-toggle';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { SelectableGroup } from '../../model/selectable-group';\nimport { SelectableUser } from '../../model/selectable-user';\nimport { DefaultUserChooserData, UserChooserData } from '../../model/user-chooser-data';\nimport { UserChooserMode } from '../../model/user-chooser-mode';\n\n@Component({\n standalone: true,\n templateUrl: './user-chooser.component.html',\n imports: [\n MatButton,\n MatDialogActions,\n MatDialogClose,\n MatDialogContent,\n MatFormField,\n MatIcon,\n MatIconButton,\n MatInput,\n MatListItemAvatar,\n MatListOption,\n MatProgressSpinner,\n MatSelectionList,\n MatSlideToggle,\n MatTooltip,\n ReactiveFormsModule,\n ],\n styleUrls: [\n './user-chooser.component.scss',\n '../../../../../styles/mat-icon.scss'\n ]\n})\nexport class UserChooserComponent implements OnInit {\n #services = {\n dialogRef: inject(MatDialogRef<UserChooserComponent>),\n activeDirectory: inject(ActiveDirectoryService),\n sharePoint: inject(SharePointService),\n data: inject<UserChooserData>(MAT_DIALOG_DATA)\n };\n _data = {...DefaultUserChooserData, ...this.#services.data};\n \n //#region Fields\n \n //@ViewChild(MatSelectionList) selectionList?: MatSelectionList;\n selectionList = viewChild(MatSelectionList);\n\n @ViewChild('filterInput') set filterInput(elRef: ElementRef<HTMLInputElement>) {\n if (elRef) {\n elRef.nativeElement.focus();\n }\n };\n //filterInput = viewChild<ElementRef>('filterInput');\n\n filterForm = new FormGroup({\n filter: new FormControl()\n });\n\n dataSource?: MatTableDataSource<SelectableUser | SelectableGroup>;\n photos?: PhotoItem[];\n groups?: SelectableGroup[]; // May or may not get populated, depending on config data sent in\n //#endregion\n\n //#region Properties\n get isMultiMode(): boolean {\n return this._data.mode === UserChooserMode.Multiple;\n }\n\n get selectedOptions(): MatListOption[] {\n return this.selectionList()?.options.filter(o => o.selected) ?? [];\n }\n\n get selectedUsers(): (SelectableUser | SelectableGroup)[] {\n return this.dataSource?.data?.filter(d => d.selected) ?? [];\n }\n\n get filterValue(): string {\n return this.filterForm.value.filter;\n }\n\n get adGroupsNeeded(): boolean {\n // If any are these are true, then we need to pull AD groups for use later\n return (this._data.showGroupMembershipTooltips ?? false) ||\n (this._data.exclusions?.groups?.length ?? 0) > 0 ||\n (this._data.inclusions?.groups?.length ?? 0) > 0 ||\n (this._data.preSelections?.groups?.length ?? 0) > 0 ||\n this._data.filterOptions?.groupMembership ||\n (this._data.selectableGroupNames?.length ?? 0) > 0 ||\n (this._data.groups?.length ?? 0) > 0;\n }\n //#endregion\n\n //#region Lifecycle\n ngOnInit(): void {\n this.#getData();\n this.#listenForFilterChanges();\n }\n //#endregion\n\n //#region Events\n listSelectionChanged(options: MatListOption[]): void {\n if (this._data.mode === UserChooserMode.Single &&\n this.selectedOptions.length &&\n this._data.closeWhenSelectionMade\n ) {\n this.close();\n }\n }\n\n optionSelectionChanged(option: MatListOption): void {\n const user = this.dataSource?.data\n .find(u => u.sAMAccountName.toLocaleLowerCase() === (option.value as SelectableUser).sAMAccountName.toLowerCase());\n\n if (user) {\n // If we are in single user selection mode, deselect any existing selections first\n if (!this.isMultiMode && option.selected) {\n this.dataSource?.data\n .filter(u => u.sAMAccountName.toLowerCase() !== (option.value as SelectableUser).sAMAccountName.toLowerCase())\n .forEach(u => u.selected = false);\n }\n\n user.selected = option.selected;\n }\n }\n\n hideUnselectedChanged(selected: boolean): void {\n this.filterForm.get('filter')?.setValue(selected ? '{selected:true}' : null);\n }\n\n selectAll(): void {\n this.selectionList()?.selectAll();\n\n if (this.selectionList()?.options) {\n this.listSelectionChanged(this.selectionList()!.options.toArray());\n }\n }\n\n deselectAll(): void {\n this.selectionList()?.deselectAll();\n }\n //#endregion\n\n //#region Utilities\n isUser(userOrGroup: SelectableUser | SelectableGroup): boolean {\n return 'title' in userOrGroup;\n }\n castUser(userOrGroup: SelectableUser | SelectableGroup): SelectableUser {\n return userOrGroup as SelectableUser;\n }\n\n #getData(): void {\n const dataObservables: Observable<any>[] = [\n this._data.users ?\n // Users were passed in\n of(this._data.users) :\n // Users need to be retrieved\n this.#services.activeDirectory.getUsers(false, this._data.includeDisabledUsers, this._data.parentOu),\n\n this._data.photos ?\n // Photos were passed in\n of(this._data.photos) :\n // Photos need to be retrieved\n this.#services.sharePoint.getPhotos()\n ];\n\n // Do we need AD groups?\n if (this.adGroupsNeeded) {\n this._data.groups?.length ?\n // Groups were passed in\n of(this._data.groups) :\n // Groups need to be retrieved\n dataObservables.push(this.#services.activeDirectory.getGroups());\n }\n\n\n forkJoin(dataObservables)\n //.subscribe(([users, photos]) => {\n .subscribe(data => {\n // Need groups in place before we handle exclusions/inclusions/pre-selections\n this.groups = this.adGroupsNeeded ?\n data[2] :\n null;\n\n let users = data[0] as SelectableUser[];\n users.forEach(u => u.selected = false); // In case existing data was re-used\n users = this.#includeUsersByAccountName(users);\n users = this.#includeUsersByGroupName(users);\n users = this.#includeUsersByDepartment(users);\n users = this.#includeUsersByTitle(users);\n\n users = this.#excludeUsersByAccountName(users);\n users = this.#excludeUsersByGroupName(users);\n users = this.#excludeUsersByDepartment(users);\n users = this.#excludeUsersByTitle(users);\n\n users = this.#preSelectUsersByAccountName(users);\n users = this.#preSelectUsersByGroupName(users);\n users = this.#preSelectUsersByDepartment(users);\n users = this.#preSelectUsersByTitle(users);\n\n this.#preSelectGroupsByAccountName();\n\n const usersAndGroups: (SelectableUser | SelectableGroup)[] = [\n ...users\n ];\n\n if (this._data.selectableGroupNames?.length) {\n this._data.selectableGroupNames\n .forEach(groupName => {\n const group = this.groups!.find(g => g.displayName === groupName);\n\n if (group) {\n usersAndGroups.push({\n ...group,\n selected: group.selected\n });\n }\n });\n }\n\n this.dataSource = new MatTableDataSource(usersAndGroups);\n \n this.photos = data[1];\n\n this.#setFilterPredicate();\n });\n }\n\n close(): void {\n if (!this.selectedUsers) {\n this.#services.dialogRef.close();\n return;\n }\n const value = this.selectedUsers\n .map(u => this._data.returnUserObjects ? u : u.sAMAccountName);\n\n this.#services.dialogRef.close(this._data.mode === UserChooserMode.Multiple ?\n value :\n value[0]\n );\n }\n\n getPhoto(user: SelectableUser | SelectableGroup): string | undefined {\n if (!this.isUser(user)) { return; }\n\n return this.photos?.find(p =>\n (p.employeeNumber && p.employeeNumber.toString() === (user as SelectableUser).employeeNumber) ||\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\n p.displayName?.toLowerCase() === user.displayName.toLowerCase() ||\n p.title?.toLowerCase() === user.displayName.toLowerCase()\n )?.encodedAbsUrl;\n }\n\n //#region Exclusions - won't be included in the dataSource at all\n #excludeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.accountNames\n ?.forEach(accountName => {\n const index = users.findIndex(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());\n if (index === -1) { return; }\n\n users.splice(index, 1);\n });\n\n return users;\n }\n\n #excludeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.groups\n ?.forEach(groupName => {\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\n if (!group) { return; }\n \n group.member.forEach(groupMemberDn => {\n const index = users.findIndex(u => u.distinguishedName === groupMemberDn);\n if (index === -1) { return; }\n\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n\n #excludeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.departments\n ?.forEach(department => {\n const excludedUsers = users.filter(u => u.department?.toLowerCase() === department.toLowerCase());\n\n excludedUsers.forEach(user => {\n const index = users.indexOf(user);\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n\n #excludeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.titles\n ?.forEach(title => {\n const excludedUsers = users.filter(u => u.title?.toLowerCase() === title.toLowerCase());\n \n excludedUsers.forEach(user => {\n const index = users.indexOf(user);\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n //#endregion\n\n //#region Inclusions - only these will be included in the dataSource\n #includeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n return users.filter(user =>\n !this._data.inclusions?.accountNames?.length || // No account inclusions specified\n\n this._data.inclusions.accountNames.find(accountName =>\n accountName.toLowerCase() === user.sAMAccountName.toLowerCase()\n ));\n }\n\n #includeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n return users.filter(user =>\n !this._data.inclusions?.departments?.length || // No department inclusions specified\n\n this._data.inclusions.departments.find(department =>\n department.toLowerCase() === user.department?.toLowerCase()\n ));\n }\n\n #includeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n return users.filter(user =>\n !this._data.inclusions?.titles?.length || // No title inclusions specified\n\n this._data.inclusions.titles.find(title =>\n title.toLowerCase() === user.title?.toLowerCase()\n ));\n }\n\n #includeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n if (!this._data.inclusions?.groups?.length) {\n return users; // No group inclusions specified\n }\n\n // Cheating a bit and leveraging the 'selected' property to keep track of who should be included\n // Since inclusions happen befor pre-selections, we can do that, as long as we set 'selected' back to false when we're done\n this._data.inclusions.groups\n .forEach(groupName => {\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\n if (!group) { return; }\n\n users\n .filter(user =>\n group.member.find(groupMemberDn => groupMemberDn === user.distinguishedName)\n )\n .forEach(user => user.selected = true);\n });\n \n // At this point, all of the appropriate users should have 'selected' set to true\n const selectedUsers = users.filter(user => user.selected); // Subset of the original list\n // Reset 'selected' to false, and return\n selectedUsers.forEach(user => user.selected = false);\n return selectedUsers;\n }\n //#endregion\n\n //#region Pre-Selections\n #preSelectUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.accountNames\n ?.forEach(accountName => {\n const user = users.find(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());\n if (!user) { return; }\n\n user.selected = true;\n });\n\n return users;\n }\n\n #preSelectGroupsByAccountName(): void {\n this._data.preSelections?.accountNames\n ?.forEach(accountName => {\n const group = this.groups?.find(g => g.sAMAccountName.toLowerCase() === accountName.toLowerCase());\n if (!group) { return; }\n\n group.selected = true;\n });;\n }\n\n #preSelectUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.departments\n ?.forEach(department =>\n users\n .filter(u => u.department?.toLowerCase() === department.toLowerCase())\n .forEach(user => user.selected = true)\n );\n\n return users;\n }\n\n #preSelectUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.titles\n ?.forEach(title =>\n users\n .filter(u => u.title?.toLowerCase() === title.toLowerCase())\n .forEach(user => user.selected = true)\n );\n\n return users;\n }\n\n #preSelectUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.groups\n ?.forEach(groupName => {\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\n if (!group) { return; }\n\n group.member.forEach(groupMemberDn => {\n const user = users.find(u => u.distinguishedName === groupMemberDn);\n if (!user) { return; }\n\n user.selected = true;\n });\n });\n\n return users;\n }\n //#endregion\n \n #setFilterPredicate(): void {\n if (!this.dataSource) {\n return;\n }\n\n this.dataSource.filterPredicate = (user: (SelectableUser | SelectableGroup), filter: string) => {\n if (filter === '{selected:true}') {\n return user.selected;\n } else {\n const regex = new RegExp(filter, 'i'); // Case-insensitive\n let match = false; // The end result - whether or not a employee matches the filter\n\n const filterProperties = [ 'displayName' ];\n if (this._data.filterOptions?.accountName) {\n filterProperties.push('sAMAccountName')\n }\n if (this._data.filterOptions?.title) {\n filterProperties.push('title');\n }\n if (this._data.filterOptions?.department) {\n filterProperties.push('department');\n }\n if (this._data.filterOptions?.phoneNumber) {\n filterProperties.push('telephoneNumber');\n }\n \n // Match on the properties configured above\n filterProperties\n .forEach(field => {\n // @ts-ignore\n if (user[field] && user[field].match(regex)) {\n match = true;\n }\n });\n \n // Match on group membership (group name)\n if (this._data.filterOptions?.groupMembership) {\n user.memberOf.forEach(groupDn => {\n const group = this.groups?.find(group => group.distinguishedName === groupDn && group.name.match(regex));\n \n if (group) {\n match = true;\n }\n });\n }\n\n return match;\n }\n };\n }\n\n #listenForFilterChanges(): void {\n this.filterForm.get('filter')?.valueChanges\n .pipe(\n debounceTime(250)\n )\n .subscribe(() => this.dataSource!.filter = this.filterForm.value.filter?.trim().toLowerCase());\n }\n\n tooltip(user: SelectableUser | SelectableGroup): string {\n return this._data.showGroupMembershipTooltips ?\n user.memberOf\n .map(groupDn =>\n this.groups\n ?.find(group =>\n group.distinguishedName === groupDn\n )?.name\n )\n .sort((a, b) => a! > b! ? 1 : -1)\n .join('\\n') :\n '';\n }\n //#endregion\n}","<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ _data.title }}</h2>\n\n <div id=\"num-selected\">\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n @if (dataSource && photos) {\n <form [formGroup]=\"filterForm\">\n @if (dataSource) {\n <mat-form-field>\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\n @if (filterForm.value.filter) {\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\n <mat-icon fontIcon=\"close\"/>\n </button>\n }\n </mat-form-field>\n }\n </form>\n <mat-selection-list [multiple]=\"isMultiMode\"\n (selectionChange)=\"listSelectionChanged($event.options)\">\n @for (user of dataSource.filteredData; track user) {\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\n @if (getPhoto(user)) {\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\n } @else {\n <mat-icon matListItemAvatar class=\"no-photo\"\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\"/>\n }\n <div class=\"user\">\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\n {{ user.displayName }}\n @if (isUser(user) && _data.showPhone && castUser(user).telephoneNumber) {\n <div>{{ castUser(user).telephoneNumber }}</div>\n }\n </div>\n @if (isUser(user)) {\n <div>{{ castUser(user).department }}</div>\n <div class=\"title\">{{ castUser(user).title }}</div>\n }\n </div>\n </mat-list-option>\n }\n </mat-selection-list>\n } @else {\n <div>\n <mat-spinner [diameter]=\"50\"/>\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\n </div>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (dataSource && photos) {\n @if (selectedOptions.length) {\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\n Hide Unselected\n </mat-slide-toggle>\n }\n @if (isMultiMode) {\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\n >\n <mat-icon fontIcon=\"select_all\"/>\n <span class=\"hide-mobile\">Select All</span>\n </button>\n }\n @if (isMultiMode && selectedOptions.length) {\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\n >\n <mat-icon fontIcon=\"clear_all\"/>\n <span class=\"hide-mobile\">Clear All</span>\n </button>\n }\n @if (isMultiMode || !_data.closeWhenSelectionMade) {\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\n [disabled]=\"!selectedOptions.length\">\n <mat-icon fontIcon=\"check\"/>\n <span class=\"hide-mobile\">Ok</span>\n </button>\n }\n }\n\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\n <mat-icon fontIcon=\"close\"/>\n <span class=\"hide-mobile\">Cancel</span>\n </button>\n</mat-dialog-actions>","import { Component, inject, input, OnInit, output } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { forkJoin, of } from 'rxjs';\n\nimport { ActiveDirectoryService, User, UserOrGroup } from '@cleavelandprice/ngx-lib/active-directory';\nimport { PhotoItem, SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';\n\nimport { DefaultUserChooserData, UserChooserData } from '../../model/user-chooser-data';\n\nimport { MatButton, MatIconButton } from '@angular/material/button';\nimport { MatFormField } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { UserChooserComponent } from '../user-chooser/user-chooser.component';\n\n@Component({\n selector: 'cp-user-field',\n standalone: true,\n imports: [\n MatButton,\n MatFormField,\n MatIcon,\n MatIconButton,\n MatInput,\n MatProgressBar,\n ],\n templateUrl: './user-form-field.component.html',\n styleUrl: './user-form-field.component.scss'\n})\nexport class UserFormFieldComponent implements OnInit {\n //#region Fields\n #services = {\n dialog: inject(MatDialog),\n activeDirectory: inject(ActiveDirectoryService),\n sharePoint: inject(SharePointService)\n };\n usersSelected = output<string | string[] | UserOrGroup | UserOrGroup[]>(); // string for Single mode, string[] for multi\n userUnSelected = output<string>();\n placeholder = input('Select User(s)');\n clickable = input(true);\n userChooserData = input.required<UserChooserData>();\n _userChooserData!: UserChooserData;\n\n accountNames?: string[];\n\n users?: User[];\n groups?: UserOrGroup[];\n photos?: PhotoItem[];\n //#endregion\n\n //#region Properties\n /*get isEdge(): boolean {\n return window.navigator.userAgent.indexOf('Edge') > -1;\n }*/\n //#endregion\n \n //#region Lifecycle\n ngOnInit(): void {\n this._userChooserData = {\n ...DefaultUserChooserData,\n ...this.userChooserData()\n }\n\n // If users have been pre-selected in the config, store those in accountNames, which drives the UI of this component\n this.accountNames = this._userChooserData.preSelections?.accountNames;\n\n this.#getData();\n }\n //#endregion\n\n //#region Events\n selectUser(): void {\n if (!this.clickable()) { return; }\n\n const data: UserChooserData = {\n ...this._userChooserData,\n\n users: this.users,\n photos: this.photos,\n };\n\n this.#services.dialog.open(UserChooserComponent, {\n data: data\n })\n .afterClosed()\n .subscribe((selected: string | string[] | UserOrGroup | UserOrGroup[]) => {\n if (!selected) { return; }\n \n this.accountNames = Array.isArray(selected) ?\n selected.map(s => typeof(s) === 'string' ? s : s.sAMAccountName) :\n [ selected ].map(s => typeof(s) === 'string' ? s : s.sAMAccountName);\n\n // Overwrite what may have been passed in, for subsequent launches of UserChooserComponent - otherwise it just keeps getting fed stale data\n if (this._userChooserData.preSelections) {\n this._userChooserData.preSelections.accountNames = this.accountNames;\n }\n\n this.usersSelected.emit(selected);\n });\n }\n\n unSelectUser(accountName: string): void {\n const index = this.accountNames?.findIndex(a => a === accountName);\n this.accountNames?.splice(index ?? -1, 1);\n\n if (this._userChooserData.preSelections) {\n this._userChooserData.preSelections.accountNames = this.accountNames;\n }\n\n this.userUnSelected.emit(accountName);\n }\n //#endregion\n\n //#region Utilities\n #getData(): void {\n forkJoin([\n this._userChooserData!.users ?\n // Users were passed in\n of(this._userChooserData!.users) :\n // Users need to be retrieved\n this.#services.activeDirectory.getUsers(false, this._userChooserData!.includeDisabledUsers, this._userChooserData!.parentOu),\n\n this._userChooserData!.groups ?\n // Groups were passed in\n of(this._userChooserData!.groups) :\n // Groups need to be retrieved\n this.#services.activeDirectory.getGroups(this._userChooserData!.parentOu),\n\n this._userChooserData!.photos ?\n // Photos were passed in\n of(this._userChooserData!.photos) :\n // Photos need to be retrieved\n this.#services.sharePoint.getPhotos()\n ])\n .subscribe(([users, groups, photos]) => {\n this.users = users;\n this.groups = groups;\n this.photos = photos;\n });\n }\n\n getUser(user: string | User | undefined): User | undefined {\n user = typeof(user) === 'string' ?\n this.users?.find(u => u.sAMAccountName.toLowerCase() === user?.toString().toLowerCase()) :\n user;\n\n return !user ? undefined :\n 'groupType' in user ? undefined : user;\n }\n\n getGroup(group: string | UserOrGroup | undefined): UserOrGroup | undefined {\n group = typeof(group) === 'string' ?\n this.groups?.find(g => g.sAMAccountName.toLowerCase() === group?.toString().toLowerCase()) :\n group;\n\n return !group ? undefined :\n 'groupType' in group ? group : undefined;\n }\n\n getPhoto(accountName: string): string | undefined {\n const user = this.getUser(accountName);\n if (!user) { return undefined; }\n\n return this.photos?.find(p =>\n (p.employeeNumber && p.employeeNumber.toString() === user.employeeNumber) ||\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\n p.displayName?.toLowerCase() === user.displayName.toLowerCase() ||\n p.title?.toLowerCase() === user.displayName.toLowerCase()\n )?.encodedAbsUrl;\n }\n //#endregion\n}","\n<!-- In Microsoft Edge, selectUser() never gets called if the input fields are disabled\nSo... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\nIt's definitely a better experience if the field IS disabled.\nOtherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\n-->\n<!-- Update 8/24/2023:\nThe above problem also exists in Chrome now.\nSo instead of dynamically setting [disabled] based on browser type,\nI'm applying CSS to suppress mouse events on the input - thus making it bubble up to the parent control, which responds the way we want/\n-->\n\n@if (users && photos) {\n <div (click)=\"selectUser()\" [class.clickable]=\"clickable()\">\n @if (accountNames?.length) {\n <div\n [class.grid]=\"accountNames?.length ?? 0 > 1\"\n [class.three]=\"accountNames?.length ?? 0 > 2\"\n [class.four]=\"accountNames?.length ?? 0 > 3\"\n [class.five]=\"accountNames?.length ?? 0 > 4\">\n @for (accountName of accountNames; track accountName; let i = $index) {\n <div class=\"user\">\n <!--<img *ngIf=\"accountName && empUtils.getEmployee(accountName)\" alt=\"\" [src]=\"empUtils.getEmployee(accountName) | employeePhotoUrl:cacheService.photos\">-->\n @if (getPhoto(accountName)) {\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(accountName)\">\n }\n @if (getGroup(accountName)) {\n <mat-icon>group</mat-icon>\n }\n <mat-form-field>\n <!-- [disabled]=\"!isEdge\" -->\n <input matInput disabled [placeholder]=\"i === 0 ? placeholder() : ''\"\n [value]=\"getUser(accountName)?.displayName ?? getGroup(accountName)?.displayName ?? accountName\">\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"$event.stopPropagation(); unSelectUser(accountName)\">\n <mat-icon fontIcon=\"close\"/>\n </button>\n </mat-form-field>\n </div>\n }\n </div>\n } @else {\n <mat-form-field>\n <input matInput disabled [placeholder]=\"placeholder()\"> <!-- [disabled]=\"!isEdge\" -->\n </mat-form-field>\n }\n </div>\n} @else {\n <mat-progress-bar mode=\"indeterminate\"/>\n}","import { CommonModule } from '@angular/common';\nimport { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatListModule } from '@angular/material/list';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { ActiveDirectoryServiceOptions, ActiveDirectoryServiceOptionsToken } from '@cleavelandprice/ngx-lib/active-directory';\n\nimport { UserChooserComponent } from './components/user-chooser/user-chooser.component';\nimport { UserFormFieldComponent } from './components/user-form-field/user-form-field.component';\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n\n MatButtonModule,\n MatDialogModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatListModule,\n MatProgressBarModule,\n MatProgressSpinnerModule,\n MatSlideToggleModule,\n MatTableModule,\n MatTooltipModule,\n\n UserChooserComponent,\n UserFormFieldComponent\n ],\n exports: [\n UserChooserComponent,\n UserFormFieldComponent\n ]\n})\nexport class MatActiveDirectoryModule {\n static forRoot(config: ActiveDirectoryServiceOptions): ModuleWithProviders<MatActiveDirectoryModule> {\n return {\n ngModule: MatActiveDirectoryModule,\n providers: [\n {\n provide: ActiveDirectoryServiceOptionsToken,\n useValue: config\n }\n ]\n };\n }\n\n constructor(@Optional() @SkipSelf() parentModule: MatActiveDirectoryModule) {\n if (parentModule) {\n throw new Error(\n 'MatActiveDirectoryModule is already loaded. Import it in the AppModule only');\n }\n }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './mat-active-directory.api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "comment": "NGX-LIB primary entry point package.json",
3
3
  "name": "@cleavelandprice/ngx-lib",
4
- "version": "4.1.6",
4
+ "version": "4.1.8",
5
5
  "description": "Angular library providing foundational functionality to Cleaveland-Price applications",
6
6
  "peerDependencies": {
7
7
  "@angular/common": "^17.3.5",
@@ -41,18 +41,18 @@
41
41
  "esm": "./esm2022/active-directory/cleavelandprice-ngx-lib-active-directory.mjs",
42
42
  "default": "./fesm2022/cleavelandprice-ngx-lib-active-directory.mjs"
43
43
  },
44
- "./authentication": {
45
- "types": "./authentication/index.d.ts",
46
- "esm2022": "./esm2022/authentication/cleavelandprice-ngx-lib-authentication.mjs",
47
- "esm": "./esm2022/authentication/cleavelandprice-ngx-lib-authentication.mjs",
48
- "default": "./fesm2022/cleavelandprice-ngx-lib-authentication.mjs"
49
- },
50
44
  "./dialog": {
51
45
  "types": "./dialog/index.d.ts",
52
46
  "esm2022": "./esm2022/dialog/cleavelandprice-ngx-lib-dialog.mjs",
53
47
  "esm": "./esm2022/dialog/cleavelandprice-ngx-lib-dialog.mjs",
54
48
  "default": "./fesm2022/cleavelandprice-ngx-lib-dialog.mjs"
55
49
  },
50
+ "./authentication": {
51
+ "types": "./authentication/index.d.ts",
52
+ "esm2022": "./esm2022/authentication/cleavelandprice-ngx-lib-authentication.mjs",
53
+ "esm": "./esm2022/authentication/cleavelandprice-ngx-lib-authentication.mjs",
54
+ "default": "./fesm2022/cleavelandprice-ngx-lib-authentication.mjs"
55
+ },
56
56
  "./msgraph": {
57
57
  "types": "./msgraph/index.d.ts",
58
58
  "esm2022": "./esm2022/msgraph/cleavelandprice-ngx-lib-msgraph.mjs",