@po-ui/ng-templates 18.22.0 → 19.0.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/po-ui-ng-templates.mjs +139 -122
- package/fesm2022/po-ui-ng-templates.mjs.map +1 -1
- package/lib/components/po-modal-password-recovery/po-modal-password-recovery-base.component.d.ts +1 -1
- package/lib/components/po-modal-password-recovery/po-modal-password-recovery.service.d.ts +1 -1
- package/lib/components/po-page-blocked-user/po-page-blocked-user-base.component.d.ts +1 -1
- package/lib/components/po-page-blocked-user/po-page-blocked-user.component.d.ts +1 -1
- package/lib/components/po-page-change-password/po-page-change-password-base.component.d.ts +1 -1
- package/lib/components/po-page-change-password/po-page-change-password.service.d.ts +1 -1
- package/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-base.component.d.ts +1 -1
- package/lib/components/po-page-dynamic-search/po-page-dynamic-search-base.component.d.ts +1 -1
- package/lib/components/po-page-dynamic-search/po-page-dynamic-search.component.d.ts +2 -2
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-action.interface.d.ts +1 -1
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-table-action.interface.d.ts +1 -1
- package/lib/components/po-page-dynamic-table/po-page-dynamic-list-base.component.d.ts +2 -2
- package/lib/components/po-page-dynamic-table/po-page-dynamic-table.component.d.ts +2 -2
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-base.component.d.ts +1 -1
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-execution/po-page-job-scheduler-execution.component.d.ts +2 -2
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-job-scheduler-parameters-template/po-job-scheduler-parameters-template.directive.d.ts +1 -1
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-page-job-scheduler-summary.component.d.ts +1 -1
- package/lib/components/po-page-login/po-page-login-base.component.d.ts +1 -1
- package/lib/components/po-page-login/po-page-login.service.d.ts +1 -1
- package/package.json +13 -15
- package/po-ui-ng-templates-19.0.0-next.0.tgz +0 -0
- package/schematics/ng-add/index.js +2 -2
- package/schematics/ng-add/index.js.map +1 -1
- package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-blocked-user/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-blocked-user/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-blocked-user/index.js +1 -1
- package/schematics/ng-generate/po-page-blocked-user/index.js.map +1 -1
- package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-change-password/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-change-password/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-change-password/index.js +1 -1
- package/schematics/ng-generate/po-page-change-password/index.js.map +1 -1
- package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-dynamic-detail/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-dynamic-detail/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-dynamic-detail/index.js +1 -1
- package/schematics/ng-generate/po-page-dynamic-detail/index.js.map +1 -1
- package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-dynamic-edit/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-dynamic-edit/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-dynamic-edit/index.js +1 -1
- package/schematics/ng-generate/po-page-dynamic-edit/index.js.map +1 -1
- package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-dynamic-search/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-dynamic-search/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-dynamic-search/index.js +1 -1
- package/schematics/ng-generate/po-page-dynamic-search/index.js.map +1 -1
- package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-dynamic-table/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-dynamic-table/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-dynamic-table/index.js +1 -1
- package/schematics/ng-generate/po-page-dynamic-table/index.js.map +1 -1
- package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-job-scheduler/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-job-scheduler/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-job-scheduler/index.js +1 -1
- package/schematics/ng-generate/po-page-job-scheduler/index.js.map +1 -1
- package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-login/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-login/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-login/index.js +1 -1
- package/schematics/ng-generate/po-page-login/index.js.map +1 -1
- package/esm2022/lib/components/components.module.mjs +0 -84
- package/esm2022/lib/components/index.mjs +0 -12
- package/esm2022/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-modal-content.enum.mjs +0 -17
- package/esm2022/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-type.enum.mjs +0 -17
- package/esm2022/lib/components/po-modal-password-recovery/index.mjs +0 -8
- package/esm2022/lib/components/po-modal-password-recovery/interfaces/po-modal-password-recovery.interface.mjs +0 -2
- package/esm2022/lib/components/po-modal-password-recovery/literals/i18n/po-modal-password-recovery-literals.mjs +0 -119
- package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery-base.component.mjs +0 -293
- package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery-error-message/po-modal-password-recovery-error-message.component.mjs +0 -34
- package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery.component.mjs +0 -451
- package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery.module.mjs +0 -29
- package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery.service.mjs +0 -18
- package/esm2022/lib/components/po-page-background/index.mjs +0 -3
- package/esm2022/lib/components/po-page-background/po-page-background.component.mjs +0 -191
- package/esm2022/lib/components/po-page-background/po-page-background.module.mjs +0 -27
- package/esm2022/lib/components/po-page-blocked-user/enums/po-page-blocked-user-reason.enum.mjs +0 -17
- package/esm2022/lib/components/po-page-blocked-user/index.mjs +0 -8
- package/esm2022/lib/components/po-page-blocked-user/interfaces/po-page-blocked-user-reason-params.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-blocked-user/literals/i18n/po-page-blocked-user-literals.mjs +0 -78
- package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user-base.component.mjs +0 -197
- package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user-contacts/po-page-blocked-user-contacts.component.mjs +0 -105
- package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user-reason/po-page-blocked-user-reason.component.mjs +0 -107
- package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user.component.mjs +0 -108
- package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user.module.mjs +0 -29
- package/esm2022/lib/components/po-page-change-password/index.mjs +0 -7
- package/esm2022/lib/components/po-page-change-password/interfaces/po-page-change-password-recovery.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-change-password/interfaces/po-page-change-password-requirement.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-change-password/interfaces/po-page-change-password.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-change-password/literals/i18n/po-page-change-password-literals.mjs +0 -79
- package/esm2022/lib/components/po-page-change-password/po-page-change-password-base.component.mjs +0 -300
- package/esm2022/lib/components/po-page-change-password/po-page-change-password.component.mjs +0 -401
- package/esm2022/lib/components/po-page-change-password/po-page-change-password.module.mjs +0 -30
- package/esm2022/lib/components/po-page-change-password/po-page-change-password.service.mjs +0 -18
- package/esm2022/lib/components/po-page-dynamic-detail/index.mjs +0 -10
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-actions.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-back.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-edit.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-remove.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-field.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-metadata.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-options.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/po-page-dynamic-detail-actions.service.mjs +0 -44
- package/esm2022/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.component.mjs +0 -546
- package/esm2022/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.module.mjs +0 -54
- package/esm2022/lib/components/po-page-dynamic-edit/index.mjs +0 -11
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-actions.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-cancel.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save-new.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-field.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-literals.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-metadata.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-options.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/po-page-dynamic-edit-actions.service.mjs +0 -44
- package/esm2022/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.component.mjs +0 -889
- package/esm2022/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.module.mjs +0 -60
- package/esm2022/lib/components/po-page-dynamic-search/index.mjs +0 -7
- package/esm2022/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-base.component.mjs +0 -133
- package/esm2022/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-literals.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter.component.mjs +0 -76
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-base.component.mjs +0 -365
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-filters.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-literals.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-options.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search.component.mjs +0 -349
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search.module.mjs +0 -52
- package/esm2022/lib/components/po-page-dynamic-table/index.mjs +0 -16
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-actions.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-detail.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-duplicate.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-edit.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-new.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove-all.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-action.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-table-action.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-field.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-filters.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-metadata.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-options.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-list-base.component.mjs +0 -271
- package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table-actions.service.mjs +0 -59
- package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table-literals.mjs +0 -63
- package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table.component.mjs +0 -1257
- package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table.module.mjs +0 -50
- package/esm2022/lib/components/po-page-job-scheduler/index.mjs +0 -6
- package/esm2022/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler-internal.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-base.component.mjs +0 -302
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-execution/po-page-job-scheduler-execution.component.mjs +0 -393
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-internal.mjs +0 -13
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-literals.mjs +0 -195
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-lookup.service.mjs +0 -22
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/index.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-job-scheduler-parameters-template/index.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-job-scheduler-parameters-template/po-job-scheduler-parameters-template.directive.mjs +0 -92
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-page-job-scheduler-parameters.component.mjs +0 -79
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/index.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-job-scheduler-summary-template/index.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-job-scheduler-summary-template/po-job-scheduler-summary-template.directive.mjs +0 -44
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-page-job-scheduler-summary.component.mjs +0 -211
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler.component.mjs +0 -418
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler.module.mjs +0 -85
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler.service.mjs +0 -224
- package/esm2022/lib/components/po-page-login/enums/po-page-login-authentication-type.enum.mjs +0 -15
- package/esm2022/lib/components/po-page-login/index.mjs +0 -8
- package/esm2022/lib/components/po-page-login/interfaces/po-page-login-custom-field.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-login/interfaces/po-page-login-literals.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-login/interfaces/po-page-login-recovery.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-login/interfaces/po-page-login.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-login/po-page-login-base.component.mjs +0 -1099
- package/esm2022/lib/components/po-page-login/po-page-login-popover/po-page-login-popover.component.mjs +0 -137
- package/esm2022/lib/components/po-page-login/po-page-login.component.mjs +0 -483
- package/esm2022/lib/components/po-page-login/po-page-login.module.mjs +0 -31
- package/esm2022/lib/components/po-page-login/po-page-login.service.mjs +0 -32
- package/esm2022/lib/index.mjs +0 -4
- package/esm2022/lib/po-templates.module.mjs +0 -18
- package/esm2022/lib/services/index.mjs +0 -4
- package/esm2022/lib/services/po-page-customization/index.mjs +0 -4
- package/esm2022/lib/services/po-page-customization/po-page-customization.module.mjs +0 -23
- package/esm2022/lib/services/po-page-customization/po-page-customization.service.mjs +0 -86
- package/esm2022/lib/services/po-page-customization/po-page-dynamic-options.interface.mjs +0 -2
- package/esm2022/lib/services/po-page-dynamic/index.mjs +0 -3
- package/esm2022/lib/services/po-page-dynamic/po-page-dynamic-literals.interface.mjs +0 -2
- package/esm2022/lib/services/po-page-dynamic/po-page-dynamic.module.mjs +0 -23
- package/esm2022/lib/services/po-page-dynamic/po-page-dynamic.service.mjs +0 -106
- package/esm2022/lib/services/services.module.mjs +0 -18
- package/esm2022/lib/utils/util.mjs +0 -428
- package/esm2022/po-ui-ng-templates.mjs +0 -5
- package/esm2022/public-api.mjs +0 -2
- package/po-ui-ng-templates-18.22.0.tgz +0 -0
|
@@ -1,1257 +0,0 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
2
|
-
import { EMPTY, Subscription, of } from 'rxjs';
|
|
3
|
-
import { map, switchMap, tap } from 'rxjs/operators';
|
|
4
|
-
import { PoTableColumnSortType, PoTableColumnSpacing, poLocaleDefault } from '@po-ui/ng-components';
|
|
5
|
-
import * as util from '../../utils/util';
|
|
6
|
-
import { convertToBoolean } from '../../utils/util';
|
|
7
|
-
import { PoPageDynamicDetailComponent } from '../po-page-dynamic-detail/po-page-dynamic-detail.component';
|
|
8
|
-
import { PoPageDynamicService } from '../../services/po-page-dynamic/po-page-dynamic.service';
|
|
9
|
-
import { isExternalLink, openExternalLink, removeDuplicateItemsWithArrayKey } from '../../utils/util';
|
|
10
|
-
import { PoPageDynamicListBaseComponent } from './po-page-dynamic-list-base.component';
|
|
11
|
-
import { poPageDynamicTableLiteralsDefault } from './po-page-dynamic-table-literals';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@angular/router";
|
|
14
|
-
import * as i2 from "@po-ui/ng-components";
|
|
15
|
-
import * as i3 from "../../services/po-page-dynamic/po-page-dynamic.service";
|
|
16
|
-
import * as i4 from "./../../services/po-page-customization/po-page-customization.service";
|
|
17
|
-
import * as i5 from "./po-page-dynamic-table-actions.service";
|
|
18
|
-
import * as i6 from "../po-page-dynamic-search/po-page-dynamic-search.component";
|
|
19
|
-
const PAGE_SIZE_DEFAULT = 10;
|
|
20
|
-
/**
|
|
21
|
-
* @docsExtends PoPageDynamicListBaseComponent
|
|
22
|
-
*
|
|
23
|
-
* @description
|
|
24
|
-
*
|
|
25
|
-
* O `po-page-dynamic-table` é uma página que exibe uma lista de registros em uma tabela baseado em uma lista de fields,
|
|
26
|
-
* o mesmo também suporta metadados conforme especificado na documentação.
|
|
27
|
-
*
|
|
28
|
-
* ### Utilização via rota
|
|
29
|
-
*
|
|
30
|
-
* Ao utilizar as rotas para inicializar o template, o `page-dynamic-table` disponibiliza propriedades que devem ser fornecidas no arquivo de configuração de rotas da aplicação, para
|
|
31
|
-
* poder especificar o endpoint dos dados e dos metadados que serão carregados na inicialização.
|
|
32
|
-
*
|
|
33
|
-
* Exemplo de utilização:
|
|
34
|
-
*
|
|
35
|
-
* Arquivo de configuração de rotas da aplicação: `app-routing.module.ts`
|
|
36
|
-
* ```
|
|
37
|
-
* const routes: Routes = [
|
|
38
|
-
* {
|
|
39
|
-
* path: 'people',
|
|
40
|
-
* component: PoPageDynamicTableComponent,
|
|
41
|
-
* data: {
|
|
42
|
-
* serviceApi: 'http://localhost:3000/v1/people', // endpoint dos dados
|
|
43
|
-
* serviceMetadataApi: 'http://localhost:3000/v1/metadata', // endpoint dos metadados utilizando o método HTTP Get
|
|
44
|
-
* serviceLoadApi: 'http://localhost:3000/load-metadata' // endpoint de customizações dos metadados utilizando o método HTTP Post
|
|
45
|
-
* }
|
|
46
|
-
* },
|
|
47
|
-
* {
|
|
48
|
-
* path: 'home',
|
|
49
|
-
* component: HomeExampleComponent
|
|
50
|
-
* }
|
|
51
|
-
* ];
|
|
52
|
-
*
|
|
53
|
-
* ```
|
|
54
|
-
* O componente primeiro irá carregar o metadado da rota definida na propriedade serviceMetadataApi
|
|
55
|
-
* e depois irá buscar da rota definida na propriedade serviceLoadApi.
|
|
56
|
-
*
|
|
57
|
-
* A requisição dos metadados é feita na inicialização do template para buscar os metadados da página passando o
|
|
58
|
-
* tipo do metadado esperado e a versão cacheada pelo browser.
|
|
59
|
-
*
|
|
60
|
-
* > Caso o servidor retornar um erro ao recuperar os metadados, serão repassados os metadados salvos em cache,
|
|
61
|
-
* se o cache não existir será disparada uma notificação.
|
|
62
|
-
*
|
|
63
|
-
* O formato esperado na resposta da requisição está especificado na interface
|
|
64
|
-
* [PoPageDynamicTableMetadata](/documentation/po-page-dynamic-table#po-page-dynamic-table-metadata). Por exemplo:
|
|
65
|
-
*
|
|
66
|
-
* ```
|
|
67
|
-
* {
|
|
68
|
-
* version: 1,
|
|
69
|
-
* title: 'Person Table',
|
|
70
|
-
* fields: [
|
|
71
|
-
* { property: 'id', key: true, disabled: true },
|
|
72
|
-
* { property: 'status' },
|
|
73
|
-
* { property: 'name' },
|
|
74
|
-
* { property: 'nickname' },
|
|
75
|
-
* { property: 'birthdate', label: 'Birth date' },
|
|
76
|
-
* { property: 'genre' },
|
|
77
|
-
* { property: 'city' },
|
|
78
|
-
* { property: 'country' }
|
|
79
|
-
* ],
|
|
80
|
-
* keepFilters: true
|
|
81
|
-
* }
|
|
82
|
-
* ```
|
|
83
|
-
*
|
|
84
|
-
* > Caso o endpoint dos metadados não seja especificado, será feito uma requisição utilizando o `serviceApi` da seguinte forma:
|
|
85
|
-
* ```
|
|
86
|
-
* GET {end-point}/metadata?type=list&version={version}
|
|
87
|
-
* ```
|
|
88
|
-
*
|
|
89
|
-
* @example
|
|
90
|
-
*
|
|
91
|
-
* <example name="po-page-dynamic-table-basic" title="PO Page Dynamic Table Basic">
|
|
92
|
-
* <file name="sample-po-page-dynamic-table-basic/sample-po-page-dynamic-table-basic.component.html"> </file>
|
|
93
|
-
* <file name="sample-po-page-dynamic-table-basic/sample-po-page-dynamic-table-basic.component.ts"> </file>
|
|
94
|
-
* </example>
|
|
95
|
-
*
|
|
96
|
-
* <example name="po-page-dynamic-table-people" title="PO Page Dynamic Table - People">
|
|
97
|
-
* <file name="sample-po-page-dynamic-table-people/sample-po-page-dynamic-table-people.component.html"> </file>
|
|
98
|
-
* <file name="sample-po-page-dynamic-table-people/sample-po-page-dynamic-table-people.component.ts"> </file>
|
|
99
|
-
* </example>
|
|
100
|
-
*
|
|
101
|
-
* <example name="po-page-dynamic-table-users" title="PO Page Dynamic Table - Users">
|
|
102
|
-
* <file name="sample-po-page-dynamic-table-users/sample-po-page-dynamic-table-users.component.html"> </file>
|
|
103
|
-
* <file name="sample-po-page-dynamic-table-users/sample-po-page-dynamic-table-users.component.ts"> </file>
|
|
104
|
-
* <file name="sample-po-page-dynamic-table-users/sample-po-page-dynamic-table-users.service.ts"> </file>
|
|
105
|
-
* </example>
|
|
106
|
-
*
|
|
107
|
-
* <example name="po-page-dynamic-table-hotels" title="PO Page Dynamic Table - Hotels">
|
|
108
|
-
* <file name="sample-po-page-dynamic-table-hotels/sample-po-page-dynamic-table-hotels.component.html"> </file>
|
|
109
|
-
* <file name="sample-po-page-dynamic-table-hotels/sample-po-page-dynamic-table-hotels.component.ts"> </file>
|
|
110
|
-
* </example>
|
|
111
|
-
*
|
|
112
|
-
* <example name="po-page-dynamic-table-drag-and-drop" title="PO Page Dynamic Table - Drag and Drop">
|
|
113
|
-
* <file name="sample-po-page-dynamic-table-drag-and-drop/sample-po-page-dynamic-table-drag-and-drop.component.html"> </file>
|
|
114
|
-
* <file name="sample-po-page-dynamic-table-drag-and-drop/sample-po-page-dynamic-table-drag-and-drop.component.ts"> </file>
|
|
115
|
-
* </example>
|
|
116
|
-
*/
|
|
117
|
-
export class PoPageDynamicTableComponent extends PoPageDynamicListBaseComponent {
|
|
118
|
-
router;
|
|
119
|
-
activatedRoute;
|
|
120
|
-
poDialogService;
|
|
121
|
-
poNotification;
|
|
122
|
-
poPageDynamicService;
|
|
123
|
-
poPageCustomizationService;
|
|
124
|
-
poPageDynamicTableActionsService;
|
|
125
|
-
/**
|
|
126
|
-
* Função ou serviço que será executado na inicialização do componente.
|
|
127
|
-
*
|
|
128
|
-
* A propriedade aceita os seguintes tipos:
|
|
129
|
-
* - `string`: *Endpoint* usado pelo componente para requisição via `POST`.
|
|
130
|
-
* - `function`: Método que será executado.
|
|
131
|
-
*
|
|
132
|
-
* O retorno desta função deve ser do tipo `PoPageDynamicTableOptions`,
|
|
133
|
-
* onde o usuário poderá customizar novos campos, breadcrumb, title e actions
|
|
134
|
-
*
|
|
135
|
-
* Por exemplo:
|
|
136
|
-
*
|
|
137
|
-
* ```
|
|
138
|
-
* getPageOptions(): PoPageDynamicTableOptions {
|
|
139
|
-
* return {
|
|
140
|
-
* actions:
|
|
141
|
-
* { new: 'new', edit: 'edit/:id', remove: true },
|
|
142
|
-
* fields: [
|
|
143
|
-
* { property: 'idCard', gridColumns: 6 }
|
|
144
|
-
* ]
|
|
145
|
-
* };
|
|
146
|
-
* }
|
|
147
|
-
*
|
|
148
|
-
* ```
|
|
149
|
-
* Para referenciar a sua função utilize a propriedade `bind`, por exemplo:
|
|
150
|
-
* ```
|
|
151
|
-
* [p-load]="onLoadOptions.bind(this)"
|
|
152
|
-
* ```
|
|
153
|
-
*/
|
|
154
|
-
onLoad;
|
|
155
|
-
/**
|
|
156
|
-
* @optional
|
|
157
|
-
*
|
|
158
|
-
* @description
|
|
159
|
-
*
|
|
160
|
-
* Mantém na modal de `Busca Avançada` os valores preenchidos do último filtro realizado pelo usuário.
|
|
161
|
-
*
|
|
162
|
-
* @default `false`
|
|
163
|
-
*/
|
|
164
|
-
keepFilters = false;
|
|
165
|
-
/**
|
|
166
|
-
* @optional
|
|
167
|
-
*
|
|
168
|
-
* @description
|
|
169
|
-
*
|
|
170
|
-
* Define que a coluna de ações ficará no lado direito da tabela.
|
|
171
|
-
*
|
|
172
|
-
* @default `false`
|
|
173
|
-
*/
|
|
174
|
-
actionRight = false;
|
|
175
|
-
/**
|
|
176
|
-
* @optional
|
|
177
|
-
*
|
|
178
|
-
* @description
|
|
179
|
-
*
|
|
180
|
-
* Permite a utilização da pesquisa rápida junto com a pesquisa avançada.
|
|
181
|
-
*
|
|
182
|
-
* Desta forma, ao ter uma pesquisa avançada estabelecida e ser
|
|
183
|
-
* preenchido a pesquisa rápida, o filtro será concatenado adicionando a pesquisa
|
|
184
|
-
* rápida também na lista de `disclaimers` a aplicando uma nova busca com a concatenação.
|
|
185
|
-
*
|
|
186
|
-
* Por exemplo, com os seguintes filtros aplicados:
|
|
187
|
-
* - filtro avançado: `{ name: 'Mike', age: '12' }`
|
|
188
|
-
* - filtro rápido: `{ search: 'paper' }`
|
|
189
|
-
*
|
|
190
|
-
* A requisição dos dados na API ficará com os parâmetros:
|
|
191
|
-
* ```
|
|
192
|
-
* page=1&pageSize=10&name=Mike&age=12&search=paper
|
|
193
|
-
* ```
|
|
194
|
-
*
|
|
195
|
-
* @default `false`
|
|
196
|
-
*/
|
|
197
|
-
concatFilters = false;
|
|
198
|
-
/**
|
|
199
|
-
* @optional
|
|
200
|
-
*
|
|
201
|
-
* @description
|
|
202
|
-
*
|
|
203
|
-
* Permite que o gerenciador de colunas, responsável pela definição de quais colunas serão exibidas, seja escondido.
|
|
204
|
-
*
|
|
205
|
-
* @default `false`
|
|
206
|
-
*/
|
|
207
|
-
hideColumnsManager = false;
|
|
208
|
-
/**
|
|
209
|
-
* @optional
|
|
210
|
-
*
|
|
211
|
-
* @description
|
|
212
|
-
*
|
|
213
|
-
* Oculta o botão para remover todos os *disclaimers* do grupo.
|
|
214
|
-
*
|
|
215
|
-
* > Por padrão, o mesmo é exibido à partir de dois ou mais *disclaimers* com a opção `hideClose` habilitada.
|
|
216
|
-
*
|
|
217
|
-
* @default `false`
|
|
218
|
-
*/
|
|
219
|
-
hideRemoveAllDisclaimer = false;
|
|
220
|
-
/**
|
|
221
|
-
* @optional
|
|
222
|
-
*
|
|
223
|
-
* @description
|
|
224
|
-
*
|
|
225
|
-
* Se verdadeiro, ativa a funcionalidade de scroll infinito para a tabela e o botão "Carregar Mais" deixará de ser exibido. Ao chegar no fim da tabela
|
|
226
|
-
* executará a função `p-show-more`.
|
|
227
|
-
*
|
|
228
|
-
* **Regras de utilização:**
|
|
229
|
-
* - O scroll infinito só funciona para tabelas que utilizam a propriedade `p-height` e que possuem o scroll já na carga inicial dos dados.
|
|
230
|
-
*
|
|
231
|
-
* @default `false`
|
|
232
|
-
*/
|
|
233
|
-
infiniteScroll = false;
|
|
234
|
-
hasNext = false;
|
|
235
|
-
items = [];
|
|
236
|
-
literals;
|
|
237
|
-
pageActions = [];
|
|
238
|
-
tableActions = [];
|
|
239
|
-
_actions = {};
|
|
240
|
-
_pageCustomActions = [];
|
|
241
|
-
_height;
|
|
242
|
-
_oldQuickSearchParam;
|
|
243
|
-
_quickSearchParam = 'search';
|
|
244
|
-
_quickSearchValue;
|
|
245
|
-
_quickSearchWidth;
|
|
246
|
-
_tableCustomActions = [];
|
|
247
|
-
page = 1;
|
|
248
|
-
currentPage = 1;
|
|
249
|
-
itemSelectedAction;
|
|
250
|
-
params = {};
|
|
251
|
-
sortedColumn;
|
|
252
|
-
subscriptions = new Subscription();
|
|
253
|
-
hasCustomActionWithSelectable = false;
|
|
254
|
-
_customPageListActions = [];
|
|
255
|
-
_customTableActions = [];
|
|
256
|
-
_defaultPageActions = [];
|
|
257
|
-
_defaultTableActions = [];
|
|
258
|
-
_hideCloseDisclaimers = [];
|
|
259
|
-
_draggable = false;
|
|
260
|
-
_spacing = PoTableColumnSpacing.Medium;
|
|
261
|
-
_virtualScroll = true;
|
|
262
|
-
set defaultPageActions(value) {
|
|
263
|
-
this._defaultPageActions = value;
|
|
264
|
-
this.updatePageActions();
|
|
265
|
-
}
|
|
266
|
-
set defaultTableActions(value) {
|
|
267
|
-
this._defaultTableActions = value;
|
|
268
|
-
this.updateTableActions();
|
|
269
|
-
}
|
|
270
|
-
set customPageListActions(value) {
|
|
271
|
-
this._customPageListActions = value;
|
|
272
|
-
this.updatePageActions();
|
|
273
|
-
}
|
|
274
|
-
set customTableActions(value) {
|
|
275
|
-
this._customTableActions = value;
|
|
276
|
-
this.updateTableActions();
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* @optional
|
|
280
|
-
*
|
|
281
|
-
* @description
|
|
282
|
-
*
|
|
283
|
-
* Ações da página e da tabela.
|
|
284
|
-
* > Caso utilizar a ação padrão de excluir, a mesma será exibida por último na tabela.
|
|
285
|
-
*/
|
|
286
|
-
set actions(value) {
|
|
287
|
-
this._actions = value && typeof value === 'object' && Object.keys(value).length > 0 ? value : {};
|
|
288
|
-
this.setPageActions(this.actions);
|
|
289
|
-
this.setRemoveAllAction();
|
|
290
|
-
this.setTableActions(this.actions);
|
|
291
|
-
}
|
|
292
|
-
get actions() {
|
|
293
|
-
return this._actions;
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* @optional
|
|
297
|
-
*
|
|
298
|
-
* @description
|
|
299
|
-
*
|
|
300
|
-
* Lista de ações customizadas da página que serão incorporadas às ações
|
|
301
|
-
* informadas através da propriedade `p-actions`.
|
|
302
|
-
*
|
|
303
|
-
* Essas ações ficam localizadas na parte superior da página em botões com ações.
|
|
304
|
-
*
|
|
305
|
-
* Exemplo de utilização:
|
|
306
|
-
* ```
|
|
307
|
-
* [
|
|
308
|
-
* { label: 'Export', action: this.export.bind(this) },
|
|
309
|
-
* { label: 'Print', action: this.print.bind(this) }
|
|
310
|
-
* ];
|
|
311
|
-
* ```
|
|
312
|
-
*/
|
|
313
|
-
set pageCustomActions(value) {
|
|
314
|
-
this._pageCustomActions = Array.isArray(value) ? value : [];
|
|
315
|
-
this.customPageListActions = this.transformCustomActionsToPageListAction(this.pageCustomActions);
|
|
316
|
-
this.hasCustomActionWithSelectable = this.pageCustomActions.some(customAction => customAction.selectable);
|
|
317
|
-
}
|
|
318
|
-
get pageCustomActions() {
|
|
319
|
-
return this._pageCustomActions;
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* @optional
|
|
323
|
-
*
|
|
324
|
-
* @description
|
|
325
|
-
*
|
|
326
|
-
* Lista de ações customizadas na tabela da página que serão incorporadas às ações
|
|
327
|
-
* informadas através da propriedade `p-actions`.
|
|
328
|
-
*
|
|
329
|
-
* Exemplo de utilização:
|
|
330
|
-
* ```
|
|
331
|
-
* [
|
|
332
|
-
* { label: 'Apply discount', action: this.applyDiscount.bind(this) },
|
|
333
|
-
* { label: 'Details', action: this.details.bind(this) }
|
|
334
|
-
* ];
|
|
335
|
-
* ```
|
|
336
|
-
* > Caso utilizar a ação padrão de excluir, a mesma será exibida por último na tabela.
|
|
337
|
-
*/
|
|
338
|
-
set tableCustomActions(value) {
|
|
339
|
-
this._tableCustomActions = Array.isArray(value) ? value : [];
|
|
340
|
-
this.customTableActions = this.transformTableCustomActionsToTableActions(this.tableCustomActions);
|
|
341
|
-
}
|
|
342
|
-
get tableCustomActions() {
|
|
343
|
-
return this._tableCustomActions;
|
|
344
|
-
}
|
|
345
|
-
/**
|
|
346
|
-
* @optional
|
|
347
|
-
*
|
|
348
|
-
* @description
|
|
349
|
-
*
|
|
350
|
-
* Largura do campo de busca, utilizando o *Grid System*,
|
|
351
|
-
* e limitado ao máximo de 6 colunas. O tamanho mínimo é controlado
|
|
352
|
-
* conforme resolução de tela para manter a consistência do layout.
|
|
353
|
-
*/
|
|
354
|
-
set quickSearchWidth(value) {
|
|
355
|
-
this._quickSearchWidth = util.convertToInt(value);
|
|
356
|
-
}
|
|
357
|
-
get quickSearchWidth() {
|
|
358
|
-
return this._quickSearchWidth;
|
|
359
|
-
}
|
|
360
|
-
/**
|
|
361
|
-
* @optional
|
|
362
|
-
*
|
|
363
|
-
* @description
|
|
364
|
-
*
|
|
365
|
-
* Define a altura da tabela em *pixels* e fixa o cabeçalho.
|
|
366
|
-
*/
|
|
367
|
-
set height(value) {
|
|
368
|
-
this._height = util.convertToInt(value);
|
|
369
|
-
}
|
|
370
|
-
get height() {
|
|
371
|
-
return this._height;
|
|
372
|
-
}
|
|
373
|
-
/**
|
|
374
|
-
* @optional
|
|
375
|
-
*
|
|
376
|
-
* @description
|
|
377
|
-
*
|
|
378
|
-
* Lista de filtros que terão a opção de fechar ocultada
|
|
379
|
-
* em seu respectivo disclaimer. Utilizar o atributo `property` do campo.
|
|
380
|
-
*
|
|
381
|
-
* Exemplo de utilização:
|
|
382
|
-
* ```
|
|
383
|
-
* ['city','name'];
|
|
384
|
-
* ```
|
|
385
|
-
*/
|
|
386
|
-
set hideCloseDisclaimers(value) {
|
|
387
|
-
this._hideCloseDisclaimers = Array.isArray(value) ? value : [];
|
|
388
|
-
}
|
|
389
|
-
get hideCloseDisclaimers() {
|
|
390
|
-
return this._hideCloseDisclaimers;
|
|
391
|
-
}
|
|
392
|
-
/**
|
|
393
|
-
* @optional
|
|
394
|
-
*
|
|
395
|
-
* @description
|
|
396
|
-
*
|
|
397
|
-
* Identificador do parâmetro enviado ao serviço ao realizar uma busca rápida.
|
|
398
|
-
*
|
|
399
|
-
* @default 'search'
|
|
400
|
-
*/
|
|
401
|
-
set quickSearchParam(value) {
|
|
402
|
-
this._quickSearchParam = value ?? 'search';
|
|
403
|
-
}
|
|
404
|
-
get quickSearchParam() {
|
|
405
|
-
return this._quickSearchParam;
|
|
406
|
-
}
|
|
407
|
-
/**
|
|
408
|
-
* @optional
|
|
409
|
-
*
|
|
410
|
-
* @description
|
|
411
|
-
*
|
|
412
|
-
* Valor padrão na busca rápida ao inicializar o componente
|
|
413
|
-
*
|
|
414
|
-
*/
|
|
415
|
-
set quickSearchValue(value) {
|
|
416
|
-
this._quickSearchValue = value;
|
|
417
|
-
}
|
|
418
|
-
get quickSearchValue() {
|
|
419
|
-
return this._quickSearchValue;
|
|
420
|
-
}
|
|
421
|
-
/**
|
|
422
|
-
* @optional
|
|
423
|
-
*
|
|
424
|
-
* @description
|
|
425
|
-
*
|
|
426
|
-
* Objeto com as literais usadas no `po-page-dynamic-table`.
|
|
427
|
-
*
|
|
428
|
-
* Existem duas maneiras de customizar o componente, passando um objeto com todas as literais disponíveis:
|
|
429
|
-
*
|
|
430
|
-
* ```
|
|
431
|
-
* const customLiterals: PoPageDynamicSearchLiterals = {
|
|
432
|
-
* disclaimerGroupTitle: 'Filtros aplicados:',
|
|
433
|
-
* filterTitle: 'Filtro avançado',
|
|
434
|
-
* filterCancelLabel: 'Fechar',
|
|
435
|
-
* filterConfirmLabel: 'Aplicar',
|
|
436
|
-
* quickSearchLabel: 'Valor pesquisado:',
|
|
437
|
-
* searchPlaceholder: 'Pesquise aqui'
|
|
438
|
-
* };
|
|
439
|
-
* ```
|
|
440
|
-
*
|
|
441
|
-
* Ou passando apenas as literais que deseja customizar:
|
|
442
|
-
*
|
|
443
|
-
* ```
|
|
444
|
-
* const customLiterals: PoPageDynamicSearchLiterals = {
|
|
445
|
-
* filterTitle: 'Filtro avançado'
|
|
446
|
-
* };
|
|
447
|
-
* ```
|
|
448
|
-
*
|
|
449
|
-
* E para carregar as literais customizadas, basta apenas passar o objeto para o componente.
|
|
450
|
-
*
|
|
451
|
-
* ```
|
|
452
|
-
* <po-page-dynamic-table
|
|
453
|
-
* [p-literals]="customLiterals">
|
|
454
|
-
* </po-page-dynamic-table>
|
|
455
|
-
* ```
|
|
456
|
-
*
|
|
457
|
-
* > O valor padrão será traduzido de acordo com o idioma configurado no [`PoI18nService`](/documentation/po-i18n) ou *browser*.
|
|
458
|
-
*/
|
|
459
|
-
searchLiterals;
|
|
460
|
-
/**
|
|
461
|
-
* @optional
|
|
462
|
-
*
|
|
463
|
-
* @description
|
|
464
|
-
*
|
|
465
|
-
* Responsável por aplicar espaçamento nas colunas.
|
|
466
|
-
*
|
|
467
|
-
* Deve receber um dos valores do enum `PoTableColumnSpacing`.
|
|
468
|
-
*
|
|
469
|
-
* @default `medium`
|
|
470
|
-
*/
|
|
471
|
-
set spacing(value) {
|
|
472
|
-
if (value === 'small' || value === 'medium' || value === 'large') {
|
|
473
|
-
this._spacing = value;
|
|
474
|
-
}
|
|
475
|
-
else {
|
|
476
|
-
this._spacing = PoTableColumnSpacing.Medium;
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
get spacing() {
|
|
480
|
-
return this._spacing;
|
|
481
|
-
}
|
|
482
|
-
/**
|
|
483
|
-
* @optional
|
|
484
|
-
*
|
|
485
|
-
* @description
|
|
486
|
-
*
|
|
487
|
-
* Habilita ou desabilita a quebra automática de texto. Quando ativada, o texto que excede
|
|
488
|
-
* o espaço disponível é transferido para a próxima linha em pontos apropriados para uma
|
|
489
|
-
* leitura clara.
|
|
490
|
-
*
|
|
491
|
-
* > Incompatível com `virtual-scroll`, que requer altura fixa nas linhas.
|
|
492
|
-
*
|
|
493
|
-
* @default `false`
|
|
494
|
-
*/
|
|
495
|
-
textWrap = false;
|
|
496
|
-
/**
|
|
497
|
-
* @optional
|
|
498
|
-
*
|
|
499
|
-
* @description
|
|
500
|
-
*
|
|
501
|
-
* Habilita o modo drag and drop para as colunas da tabela.
|
|
502
|
-
*
|
|
503
|
-
*/
|
|
504
|
-
set draggable(value) {
|
|
505
|
-
this._draggable = value;
|
|
506
|
-
}
|
|
507
|
-
get draggable() {
|
|
508
|
-
return this._draggable;
|
|
509
|
-
}
|
|
510
|
-
/**
|
|
511
|
-
* @optional
|
|
512
|
-
*
|
|
513
|
-
* @description
|
|
514
|
-
*
|
|
515
|
-
* Habilita o `virtual-scroll` na tabela para melhorar a performance com grandes volumes de dados.
|
|
516
|
-
* Requer altura (`p-height`) para funcionar corretamente.
|
|
517
|
-
*
|
|
518
|
-
* > Incompatível com `p-text-wrap` e `master-detail`, pois o `virtual-scroll` exige altura fixa nas linhas.
|
|
519
|
-
*
|
|
520
|
-
* @default `true`
|
|
521
|
-
*/
|
|
522
|
-
set virtualScroll(value) {
|
|
523
|
-
this._virtualScroll = convertToBoolean(value && this.height > 0);
|
|
524
|
-
}
|
|
525
|
-
get virtualScroll() {
|
|
526
|
-
return this._virtualScroll;
|
|
527
|
-
}
|
|
528
|
-
/**
|
|
529
|
-
* @optional
|
|
530
|
-
*
|
|
531
|
-
* @description
|
|
532
|
-
*
|
|
533
|
-
* Controla a visibilidade dos filtros fixos na página.
|
|
534
|
-
*
|
|
535
|
-
* - Quando `true` (default), todos os filtros, incluindo os fixos, são exibidos, permitindo que o usuário visualize os filtros aplicados.
|
|
536
|
-
* - Quando `false`, os filtros fixos são ocultados, não sendo exibidos na interface, mas ainda sendo aplicados como filtros nas requisições.
|
|
537
|
-
*
|
|
538
|
-
* Esta propriedade trabalha em conjunto com a propriedade `fixed` dos filtros individuais. Filtros marcados como `fixed: true` não serão exibidos na interface do filtro avançado quando `visibleFixedFilters` for `false`, mas continuarão a ser aplicados de forma transparente ao usuário. Dessa forma, permite-se maior flexibilidade no controle de quais filtros devem ser visíveis ao usuário ou devem ser aplicados permanentemente sem interferência.
|
|
539
|
-
*
|
|
540
|
-
* **Exemplo de uso:**
|
|
541
|
-
* ```html
|
|
542
|
-
* <!-- Para ocultar os filtros fixos -->
|
|
543
|
-
* <po-page-dynamic-table [p-visible-fixed-filters]="false"></po-page-dynamic-table>
|
|
544
|
-
* ```
|
|
545
|
-
*/
|
|
546
|
-
visibleFixedFilters = true;
|
|
547
|
-
constructor(router, activatedRoute, poDialogService, poNotification, poPageDynamicService, poPageCustomizationService, poPageDynamicTableActionsService, languageService) {
|
|
548
|
-
super();
|
|
549
|
-
this.router = router;
|
|
550
|
-
this.activatedRoute = activatedRoute;
|
|
551
|
-
this.poDialogService = poDialogService;
|
|
552
|
-
this.poNotification = poNotification;
|
|
553
|
-
this.poPageDynamicService = poPageDynamicService;
|
|
554
|
-
this.poPageCustomizationService = poPageCustomizationService;
|
|
555
|
-
this.poPageDynamicTableActionsService = poPageDynamicTableActionsService;
|
|
556
|
-
const language = languageService.getShortLanguage();
|
|
557
|
-
this.literals = {
|
|
558
|
-
...poPageDynamicTableLiteralsDefault[poLocaleDefault],
|
|
559
|
-
...poPageDynamicTableLiteralsDefault[language]
|
|
560
|
-
};
|
|
561
|
-
}
|
|
562
|
-
ngOnInit() {
|
|
563
|
-
this.loadDataFromAPI();
|
|
564
|
-
}
|
|
565
|
-
ngOnDestroy() {
|
|
566
|
-
this.subscriptions.unsubscribe();
|
|
567
|
-
}
|
|
568
|
-
onAdvancedSearch(filter) {
|
|
569
|
-
this.subscriptions.add(this.loadData({ page: 1, ...filter }).subscribe());
|
|
570
|
-
this.params = filter;
|
|
571
|
-
if (this.keepFilters) {
|
|
572
|
-
this.updateFilterValue(filter);
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
onChangeDisclaimers(disclaimers) {
|
|
576
|
-
const filter = {};
|
|
577
|
-
disclaimers.forEach(disclaimer => {
|
|
578
|
-
filter[disclaimer.property] = disclaimer.value;
|
|
579
|
-
});
|
|
580
|
-
this.onAdvancedSearch(filter);
|
|
581
|
-
}
|
|
582
|
-
onQuickSearch(termTypedInQuickSearch) {
|
|
583
|
-
const quickSearchParam = termTypedInQuickSearch ? { [this.quickSearchParam]: termTypedInQuickSearch } : {};
|
|
584
|
-
this.params = this.concatFilters ? { ...this.params, ...quickSearchParam } : { ...quickSearchParam };
|
|
585
|
-
if (this._oldQuickSearchParam in this.params && this._oldQuickSearchParam !== this.quickSearchParam) {
|
|
586
|
-
delete this.params[this._oldQuickSearchParam];
|
|
587
|
-
}
|
|
588
|
-
this._oldQuickSearchParam = this.quickSearchParam;
|
|
589
|
-
this.subscriptions.add(this.loadData(termTypedInQuickSearch ? { page: 1, ...this.params } : undefined).subscribe());
|
|
590
|
-
}
|
|
591
|
-
onSort(sortedColumn) {
|
|
592
|
-
if (this.height) {
|
|
593
|
-
const order = sortedColumn.type === 'ascending' ? true : false;
|
|
594
|
-
util.sortArrayOfObjects(this.items, sortedColumn.column.property, order);
|
|
595
|
-
}
|
|
596
|
-
this.sortedColumn = sortedColumn;
|
|
597
|
-
}
|
|
598
|
-
onChangeVisibleColumns(value) {
|
|
599
|
-
this.changeVisibleColumns.emit(value);
|
|
600
|
-
}
|
|
601
|
-
onColumnRestoreManager(value) {
|
|
602
|
-
this.columnRestoreManager.emit(value);
|
|
603
|
-
}
|
|
604
|
-
onSortBy(sortedColumn) {
|
|
605
|
-
this.sortBy.emit(sortedColumn);
|
|
606
|
-
}
|
|
607
|
-
showMore() {
|
|
608
|
-
this.subscriptions.add(this.loadData({ page: ++this.page, ...this.params }).subscribe());
|
|
609
|
-
}
|
|
610
|
-
get enableSelectionTable() {
|
|
611
|
-
return this.hasActionRemoveAll || this.hasCustomActionWithSelectable;
|
|
612
|
-
}
|
|
613
|
-
get hasActionRemoveAll() {
|
|
614
|
-
return !!this.actions.removeAll;
|
|
615
|
-
}
|
|
616
|
-
/**
|
|
617
|
-
* Função que realiza a atualização dos dados da tabela.
|
|
618
|
-
*
|
|
619
|
-
* Para utilizá-la é necessário capturar a instância do `page dynamic table`, como por exemplo:
|
|
620
|
-
*
|
|
621
|
-
* ``` html
|
|
622
|
-
* <po-page-dynamic-table #dynamicTable [p-service-api]="serviceApi"></po-page-dynamic-table>
|
|
623
|
-
* ```
|
|
624
|
-
*
|
|
625
|
-
* ``` javascript
|
|
626
|
-
* import { PoPageDynamicTableComponent, PoDynamicFormField } from '@po-ui/ng-components';
|
|
627
|
-
*
|
|
628
|
-
* ...
|
|
629
|
-
*
|
|
630
|
-
* @ViewChild('dynamicTable', { static: true }) dynamicTable: PoPageDynamicTableComponent;
|
|
631
|
-
*
|
|
632
|
-
* pageCustomActions: Array<PoPageDynamicTableCustomAction> = [
|
|
633
|
-
* {
|
|
634
|
-
* label: 'Update',
|
|
635
|
-
* action: this.updateTable.bind(this),
|
|
636
|
-
* icon: 'ph-arrows-clockwise'
|
|
637
|
-
* }]
|
|
638
|
-
*
|
|
639
|
-
* updateTable() {
|
|
640
|
-
* this.dynamicTable.updateDataTable();
|
|
641
|
-
* }
|
|
642
|
-
* ```
|
|
643
|
-
*
|
|
644
|
-
*
|
|
645
|
-
* @param {{page: number, key: value }} filter Propriedade para envio de um filtro customizado.
|
|
646
|
-
* Exemplo de envio:
|
|
647
|
-
*
|
|
648
|
-
*```
|
|
649
|
-
* this.dynamicTable.updateDataTable({page: 3, search: 'Brasil'});
|
|
650
|
-
* ```
|
|
651
|
-
* Caso não seja passado um filtro customizado para o método `updateDataTable` a tabela será atualizada conforme a página do ultimo item modificado.
|
|
652
|
-
*/
|
|
653
|
-
updateDataTable(filter) {
|
|
654
|
-
const indexItemSelected = this.items.findIndex(item => item === this.itemSelectedAction);
|
|
655
|
-
const pageNumber = Math.floor(indexItemSelected / PAGE_SIZE_DEFAULT);
|
|
656
|
-
this.currentPage = pageNumber < 0 ? this.currentPage : pageNumber + 1;
|
|
657
|
-
if (this.currentPage === undefined) {
|
|
658
|
-
this.currentPage = 1;
|
|
659
|
-
}
|
|
660
|
-
if (filter) {
|
|
661
|
-
this.subscriptions.add(this.loadData(filter).subscribe());
|
|
662
|
-
}
|
|
663
|
-
else {
|
|
664
|
-
this.subscriptions.add(this.loadData({ page: this.currentPage, ...this.params }).subscribe());
|
|
665
|
-
}
|
|
666
|
-
}
|
|
667
|
-
confirmRemove(actionRemove, actionBeforeRemove, item) {
|
|
668
|
-
const confirmOptions = {
|
|
669
|
-
title: this.literals.confirmRemoveTitle,
|
|
670
|
-
message: this.literals.confirmRemoveMessage,
|
|
671
|
-
confirm: this.remove.bind(this, item, actionRemove, actionBeforeRemove)
|
|
672
|
-
};
|
|
673
|
-
this.poDialogService.confirm(confirmOptions);
|
|
674
|
-
}
|
|
675
|
-
confirmRemoveAll(actionRemoveAll, actionBeforeRemoveAll) {
|
|
676
|
-
const confirmOptions = {
|
|
677
|
-
title: this.literals.confirmRemoveAllTitle,
|
|
678
|
-
message: this.literals.confirmRemoveAllMessage,
|
|
679
|
-
confirm: this.removeAll.bind(this, actionRemoveAll, actionBeforeRemoveAll)
|
|
680
|
-
};
|
|
681
|
-
this.poDialogService.confirm(confirmOptions);
|
|
682
|
-
}
|
|
683
|
-
formatUniqueKey(item) {
|
|
684
|
-
const keys = util.mapObjectByProperties(item, this.keys);
|
|
685
|
-
return util.valuesFromObject(keys).join('|');
|
|
686
|
-
}
|
|
687
|
-
getOrderParam(sortedColumn = { type: undefined }) {
|
|
688
|
-
const { column, type } = sortedColumn;
|
|
689
|
-
if (!column) {
|
|
690
|
-
return {};
|
|
691
|
-
}
|
|
692
|
-
if (type === PoTableColumnSortType.Descending) {
|
|
693
|
-
return { order: `-${column.property}` };
|
|
694
|
-
}
|
|
695
|
-
return { order: `${column.property}` };
|
|
696
|
-
}
|
|
697
|
-
loadData(params = {}) {
|
|
698
|
-
if (!this.serviceApi) {
|
|
699
|
-
this.poNotification.error(this.literals.loadDataErrorNotification);
|
|
700
|
-
return EMPTY;
|
|
701
|
-
}
|
|
702
|
-
const orderParam = this.getOrderParam(this.sortedColumn);
|
|
703
|
-
const defaultParams = { page: 1, pageSize: PAGE_SIZE_DEFAULT };
|
|
704
|
-
const fullParams = { ...defaultParams, ...params, ...orderParam };
|
|
705
|
-
return this.poPageDynamicService.getResources(fullParams).pipe(tap(response => {
|
|
706
|
-
let newArray;
|
|
707
|
-
if (fullParams.page === 1) {
|
|
708
|
-
newArray = removeDuplicateItemsWithArrayKey(response.items, response.items, this.keys);
|
|
709
|
-
}
|
|
710
|
-
else {
|
|
711
|
-
newArray = removeDuplicateItemsWithArrayKey(this.items, response.items, this.keys);
|
|
712
|
-
}
|
|
713
|
-
this.items = newArray ? [...newArray] : this.items;
|
|
714
|
-
this.page = fullParams.page;
|
|
715
|
-
this.hasNext = response.hasNext;
|
|
716
|
-
}));
|
|
717
|
-
}
|
|
718
|
-
getMetadata(serviceApiFromRoute, onLoad) {
|
|
719
|
-
if (serviceApiFromRoute) {
|
|
720
|
-
return this.poPageDynamicService.getMetadata().pipe(tap(response => {
|
|
721
|
-
this.autoRouter = response.autoRouter || this.autoRouter;
|
|
722
|
-
this.actions = response.actions || this.actions;
|
|
723
|
-
this.breadcrumb = response.breadcrumb || this.breadcrumb;
|
|
724
|
-
this.fields = response.fields || this.fields;
|
|
725
|
-
this.title = response.title || this.title;
|
|
726
|
-
this.pageCustomActions = response.pageCustomActions || this.pageCustomActions;
|
|
727
|
-
this.tableCustomActions = response.tableCustomActions || this.tableCustomActions;
|
|
728
|
-
this.keepFilters = response.keepFilters || this.keepFilters;
|
|
729
|
-
this.concatFilters = response.concatFilters || this.concatFilters;
|
|
730
|
-
this.hideRemoveAllDisclaimer = response.hideRemoveAllDisclaimer || this.hideRemoveAllDisclaimer;
|
|
731
|
-
this.hideCloseDisclaimers = response.hideCloseDisclaimers || this.hideCloseDisclaimers;
|
|
732
|
-
this.quickSearchWidth = response.quickSearchWidth || this.quickSearchWidth;
|
|
733
|
-
}), switchMap(() => this.loadOptionsOnInitialize(onLoad)));
|
|
734
|
-
}
|
|
735
|
-
return this.loadOptionsOnInitialize(onLoad);
|
|
736
|
-
}
|
|
737
|
-
// @todo Validar rotas na mão pois se existir uma rota '**' o catch do navigation não funciona.
|
|
738
|
-
navigateTo(route, forceStopAutoRouter = false) {
|
|
739
|
-
if (isExternalLink(route.path)) {
|
|
740
|
-
return openExternalLink(route.path);
|
|
741
|
-
}
|
|
742
|
-
this.router.navigate([route.url || route.path], { queryParams: route.params }).catch(() => {
|
|
743
|
-
if (forceStopAutoRouter || !this.autoRouter) {
|
|
744
|
-
return;
|
|
745
|
-
}
|
|
746
|
-
this.router.config.unshift({
|
|
747
|
-
path: route.path,
|
|
748
|
-
component: route.component,
|
|
749
|
-
data: { serviceApi: this.serviceApi, autoRouter: true }
|
|
750
|
-
});
|
|
751
|
-
this.navigateTo(route, true);
|
|
752
|
-
});
|
|
753
|
-
}
|
|
754
|
-
createConcatenatedUrl(concatKeys, url, selectedItem) {
|
|
755
|
-
const keys = this.keys.map(key => encodeURIComponent(selectedItem[key])).join();
|
|
756
|
-
return concatKeys ? `${url}/${keys}` : url;
|
|
757
|
-
}
|
|
758
|
-
openDetail(action, item) {
|
|
759
|
-
const id = this.formatUniqueKey(item);
|
|
760
|
-
this.subscriptions.add(this.poPageDynamicTableActionsService
|
|
761
|
-
.beforeDetail(this.actions.beforeDetail, id, item)
|
|
762
|
-
.subscribe((beforeDetailResult) => this.executeDetail(action, beforeDetailResult, id, item)));
|
|
763
|
-
}
|
|
764
|
-
executeDetail(action, beforeDetailResult, id, item) {
|
|
765
|
-
const before = beforeDetailResult ?? {};
|
|
766
|
-
const allowAction = typeof before.allowAction === 'boolean' ? before.allowAction : true;
|
|
767
|
-
const { newUrl } = before;
|
|
768
|
-
if (allowAction && action) {
|
|
769
|
-
if (newUrl) {
|
|
770
|
-
const path = this.getPathFromNewUrl(newUrl, id);
|
|
771
|
-
return this.navigateTo({ path });
|
|
772
|
-
}
|
|
773
|
-
if (typeof action === 'string') {
|
|
774
|
-
const url = this.resolveUrl(item, action);
|
|
775
|
-
this.navigateTo({ path: action, url, component: PoPageDynamicDetailComponent });
|
|
776
|
-
}
|
|
777
|
-
else {
|
|
778
|
-
action(id, item);
|
|
779
|
-
}
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
getPathFromNewUrl(newUrl, id) {
|
|
783
|
-
if (newUrl.includes(':id')) {
|
|
784
|
-
return newUrl.replace(/:id/g, id);
|
|
785
|
-
}
|
|
786
|
-
return newUrl;
|
|
787
|
-
}
|
|
788
|
-
openDuplicate(actionDuplicate, item) {
|
|
789
|
-
const id = this.formatUniqueKey(item);
|
|
790
|
-
const duplicates = util.removeKeysProperties(this.keys, util.mapObjectByProperties(item, this.duplicates));
|
|
791
|
-
this.subscriptions.add(this.poPageDynamicTableActionsService
|
|
792
|
-
.beforeDuplicate(this.actions.beforeDuplicate, id, duplicates)
|
|
793
|
-
.subscribe((beforeDuplicateResult) => this.executeDuplicate(actionDuplicate, beforeDuplicateResult, duplicates)));
|
|
794
|
-
}
|
|
795
|
-
executeDuplicate(actionDuplicate, beforeDuplicateResult, duplicates) {
|
|
796
|
-
const before = beforeDuplicateResult ?? {};
|
|
797
|
-
const allowAction = typeof before.allowAction === 'boolean' ? before.allowAction : true;
|
|
798
|
-
const beforeDuplicateResource = before.resource;
|
|
799
|
-
const newAction = before.newUrl ?? actionDuplicate;
|
|
800
|
-
if (allowAction && actionDuplicate) {
|
|
801
|
-
if (typeof beforeDuplicateResource === 'object' && beforeDuplicateResource !== null) {
|
|
802
|
-
duplicates = util.removeKeysProperties(this.keys, beforeDuplicateResource);
|
|
803
|
-
}
|
|
804
|
-
if (typeof newAction === 'string') {
|
|
805
|
-
return this.navigateTo({ path: newAction, params: { duplicate: JSON.stringify(duplicates) } });
|
|
806
|
-
}
|
|
807
|
-
return newAction(duplicates);
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
openEdit(actionEdit, item) {
|
|
811
|
-
const id = this.formatUniqueKey(item);
|
|
812
|
-
this.subscriptions.add(this.poPageDynamicTableActionsService
|
|
813
|
-
.beforeEdit(this.actions.beforeEdit, id, item)
|
|
814
|
-
.pipe(switchMap((beforeEditResult) => this.executeEditAction(actionEdit, beforeEditResult, item, id)))
|
|
815
|
-
.subscribe());
|
|
816
|
-
}
|
|
817
|
-
executeEditAction(action, beforeEditResult, item, id) {
|
|
818
|
-
const newEditAction = beforeEditResult?.newUrl ?? action;
|
|
819
|
-
const allowAction = beforeEditResult?.allowAction ?? true;
|
|
820
|
-
if (!allowAction) {
|
|
821
|
-
return EMPTY;
|
|
822
|
-
}
|
|
823
|
-
if (typeof newEditAction === 'string') {
|
|
824
|
-
this.openEditUrl(newEditAction, item);
|
|
825
|
-
}
|
|
826
|
-
else {
|
|
827
|
-
const updatedItem = newEditAction(id, item);
|
|
828
|
-
if (typeof updatedItem === 'object' && updatedItem !== null) {
|
|
829
|
-
this.modifyUITableItem(item, util.removeKeysProperties(this.keys, updatedItem));
|
|
830
|
-
}
|
|
831
|
-
}
|
|
832
|
-
return EMPTY;
|
|
833
|
-
}
|
|
834
|
-
openEditUrl(path, item) {
|
|
835
|
-
const url = this.resolveUrl(item, path);
|
|
836
|
-
this.navigateTo({ path, url });
|
|
837
|
-
}
|
|
838
|
-
modifyUITableItem(currentItem, newItemValue) {
|
|
839
|
-
const tableItem = this.items.findIndex(item => item === currentItem);
|
|
840
|
-
this.items[tableItem] = { ...currentItem, ...newItemValue };
|
|
841
|
-
}
|
|
842
|
-
openNew(actionNew) {
|
|
843
|
-
this.subscriptions.add(this.poPageDynamicTableActionsService
|
|
844
|
-
.beforeNew(this.actions.beforeNew)
|
|
845
|
-
.subscribe((beforeNewResult) => this.executeNew(actionNew, beforeNewResult)));
|
|
846
|
-
}
|
|
847
|
-
executeNew(actionNew, beforeNewResult) {
|
|
848
|
-
const before = beforeNewResult ?? {};
|
|
849
|
-
const allowAction = typeof before.allowAction === 'boolean' ? before.allowAction : true;
|
|
850
|
-
const { newUrl } = before;
|
|
851
|
-
if (allowAction && actionNew) {
|
|
852
|
-
if (newUrl) {
|
|
853
|
-
return this.navigateTo({ path: newUrl });
|
|
854
|
-
}
|
|
855
|
-
if (typeof actionNew === 'string') {
|
|
856
|
-
return this.navigateTo({ path: actionNew });
|
|
857
|
-
}
|
|
858
|
-
return actionNew();
|
|
859
|
-
}
|
|
860
|
-
}
|
|
861
|
-
/**
|
|
862
|
-
* Caso exista mais de um identificador, será concatenado com '|'.
|
|
863
|
-
*
|
|
864
|
-
* Ex: { id: 1, company: 'po' }
|
|
865
|
-
*
|
|
866
|
-
* Para o endpoint /resources/:id será executada a url /resources/1|po
|
|
867
|
-
*/
|
|
868
|
-
remove(item, actionRemove, actionBeforeRemove) {
|
|
869
|
-
const uniqueKey = this.formatUniqueKey(item);
|
|
870
|
-
this.subscriptions.add(this.poPageDynamicTableActionsService
|
|
871
|
-
.beforeRemove(actionBeforeRemove, uniqueKey, item)
|
|
872
|
-
.pipe(switchMap(beforeRemove => this.deleteAction(item, actionRemove, beforeRemove)))
|
|
873
|
-
.subscribe());
|
|
874
|
-
}
|
|
875
|
-
deleteAction(item, actionRemove, beforeRemove) {
|
|
876
|
-
const { allowAction, newUrl } = beforeRemove || {};
|
|
877
|
-
const allow = allowAction ?? true;
|
|
878
|
-
if (allow) {
|
|
879
|
-
let uniqueKey = this.formatUniqueKey(item);
|
|
880
|
-
const resourceToRemoveKey = this.returnResourcesKeys([item]);
|
|
881
|
-
if (typeof actionRemove === 'boolean' || newUrl) {
|
|
882
|
-
uniqueKey = newUrl ? undefined : uniqueKey;
|
|
883
|
-
return this.poPageDynamicService
|
|
884
|
-
.deleteResource(uniqueKey, newUrl)
|
|
885
|
-
.pipe(map(() => this.removeFromUI(resourceToRemoveKey, this.literals.removeSuccessNotification)));
|
|
886
|
-
}
|
|
887
|
-
return of(actionRemove(uniqueKey, item)).pipe(tap(remove => {
|
|
888
|
-
const removeItem = remove ?? false;
|
|
889
|
-
this.removeFromUI(resourceToRemoveKey, this.literals.removeSuccessNotification, removeItem);
|
|
890
|
-
}));
|
|
891
|
-
}
|
|
892
|
-
return of({});
|
|
893
|
-
}
|
|
894
|
-
removeFromUI(items, message, remove = true) {
|
|
895
|
-
if (remove === true && items?.length) {
|
|
896
|
-
this.removeLocalItems(items);
|
|
897
|
-
this.poNotification.success(message);
|
|
898
|
-
}
|
|
899
|
-
}
|
|
900
|
-
removeAll(actionRemoveAll, actionBeforeRemoveAll) {
|
|
901
|
-
const originalResourcesKeys = this.getSelectedItemsKeys();
|
|
902
|
-
this.subscriptions.add(this.poPageDynamicTableActionsService
|
|
903
|
-
.beforeRemoveAll(actionBeforeRemoveAll, originalResourcesKeys)
|
|
904
|
-
.pipe(switchMap(beforeRemove => this.deleteAllAction(actionRemoveAll, beforeRemove, originalResourcesKeys)))
|
|
905
|
-
.subscribe());
|
|
906
|
-
}
|
|
907
|
-
getSelectedItemsKeys() {
|
|
908
|
-
const resources = this.items.filter(item => item.$selected);
|
|
909
|
-
if (resources.length === 0) {
|
|
910
|
-
return;
|
|
911
|
-
}
|
|
912
|
-
return this.returnResourcesKeys(resources);
|
|
913
|
-
}
|
|
914
|
-
returnResourcesKeys(resources) {
|
|
915
|
-
return util.mapArrayByProperties(resources, this.keys);
|
|
916
|
-
}
|
|
917
|
-
deleteAllAction(actionRemoveAll, beforeRemoveAll, originalResources) {
|
|
918
|
-
const { allowAction, newUrl, resources } = beforeRemoveAll ?? {};
|
|
919
|
-
const allow = allowAction ?? true;
|
|
920
|
-
const resourcestoDelete = resources ?? originalResources;
|
|
921
|
-
if (allow && Array.isArray(resourcestoDelete)) {
|
|
922
|
-
if (typeof actionRemoveAll === 'boolean' || newUrl) {
|
|
923
|
-
return this.poPageDynamicService.deleteResources(resourcestoDelete, newUrl).pipe(tap(() => {
|
|
924
|
-
this.removeFromUI(resourcestoDelete, this.literals.removeAllSuccessNotification);
|
|
925
|
-
}));
|
|
926
|
-
}
|
|
927
|
-
return of(actionRemoveAll(resourcestoDelete)).pipe(tap(removeItems => this.removeFromUI(removeItems, this.literals.removeSuccessNotification)));
|
|
928
|
-
}
|
|
929
|
-
return of({});
|
|
930
|
-
}
|
|
931
|
-
removeLocalItems(itemsKeysToRemove = []) {
|
|
932
|
-
if (itemsKeysToRemove.length) {
|
|
933
|
-
this.items = this.items.filter(item => {
|
|
934
|
-
const itemKey = this.formatUniqueKey(item);
|
|
935
|
-
return !itemsKeysToRemove.find(itemKeyToRemove => util.valuesFromObject(itemKeyToRemove).join('|') === itemKey);
|
|
936
|
-
});
|
|
937
|
-
}
|
|
938
|
-
}
|
|
939
|
-
resolveUrl(item, path) {
|
|
940
|
-
const uniqueKey = this.formatUniqueKey(item);
|
|
941
|
-
return path.replace(/:id/g, uniqueKey);
|
|
942
|
-
}
|
|
943
|
-
setPageActions(actions) {
|
|
944
|
-
if (actions?.new) {
|
|
945
|
-
this.defaultPageActions = [{ label: this.literals.pageAction, action: this.openNew.bind(this, actions.new) }];
|
|
946
|
-
}
|
|
947
|
-
}
|
|
948
|
-
transformCustomActionsToPageListAction(customActions) {
|
|
949
|
-
/* istanbul ignore next */
|
|
950
|
-
return customActions.map(customAction => ({
|
|
951
|
-
label: customAction.label,
|
|
952
|
-
action: this.callPageCustomAction.bind(this, customAction),
|
|
953
|
-
disabled: this.isDisablePageCustomAction.bind(this, customAction),
|
|
954
|
-
...(customAction.icon && { icon: customAction.icon }),
|
|
955
|
-
visible: customAction.visible
|
|
956
|
-
}));
|
|
957
|
-
}
|
|
958
|
-
transformTableCustomActionsToTableActions(tableCustomActions) {
|
|
959
|
-
return tableCustomActions.map(tableCustomAction => ({
|
|
960
|
-
label: tableCustomAction.label,
|
|
961
|
-
icon: tableCustomAction.icon,
|
|
962
|
-
action: this.callTableCustomAction.bind(this, tableCustomAction),
|
|
963
|
-
disabled: tableCustomAction.disabled,
|
|
964
|
-
visible: tableCustomAction.visible
|
|
965
|
-
}));
|
|
966
|
-
}
|
|
967
|
-
isDisablePageCustomAction(customAction) {
|
|
968
|
-
return customAction.selectable && !this.getSelectedItemsKeys();
|
|
969
|
-
}
|
|
970
|
-
callPageCustomAction(customAction) {
|
|
971
|
-
if (customAction.action) {
|
|
972
|
-
const selectedItems = customAction.selectable ? this.getSelectedItemsKeys() : undefined;
|
|
973
|
-
const sendCustomActionSubscription = this.poPageDynamicTableActionsService
|
|
974
|
-
.customAction(customAction.action, selectedItems)
|
|
975
|
-
.subscribe();
|
|
976
|
-
this.subscriptions.add(sendCustomActionSubscription);
|
|
977
|
-
}
|
|
978
|
-
else if (customAction.url) {
|
|
979
|
-
this.navigateTo({ path: customAction.url });
|
|
980
|
-
}
|
|
981
|
-
}
|
|
982
|
-
callTableCustomAction(customAction, selectedItem) {
|
|
983
|
-
this.itemSelectedAction = selectedItem;
|
|
984
|
-
if (customAction.action) {
|
|
985
|
-
const sendCustomActionSubscription = this.poPageDynamicTableActionsService
|
|
986
|
-
.customAction(customAction.action, selectedItem)
|
|
987
|
-
.subscribe(updatedItem => {
|
|
988
|
-
if (typeof updatedItem === 'object' && updatedItem !== null) {
|
|
989
|
-
this.modifyUITableItem(selectedItem, util.removeKeysProperties(this.keys, updatedItem));
|
|
990
|
-
}
|
|
991
|
-
});
|
|
992
|
-
this.subscriptions.add(sendCustomActionSubscription);
|
|
993
|
-
}
|
|
994
|
-
else if (customAction.url) {
|
|
995
|
-
if (isExternalLink(customAction.url)) {
|
|
996
|
-
openExternalLink(this.createConcatenatedUrl(customAction.concatKeys, customAction.url, selectedItem));
|
|
997
|
-
}
|
|
998
|
-
else {
|
|
999
|
-
this.navigateTo({
|
|
1000
|
-
path: this.createConcatenatedUrl(customAction.concatKeys, customAction.url, selectedItem)
|
|
1001
|
-
});
|
|
1002
|
-
}
|
|
1003
|
-
}
|
|
1004
|
-
}
|
|
1005
|
-
setRemoveAllAction() {
|
|
1006
|
-
const action = this._actions;
|
|
1007
|
-
if (this.showRemove(action.removeAll)) {
|
|
1008
|
-
this.defaultPageActions = [
|
|
1009
|
-
...this._defaultPageActions,
|
|
1010
|
-
{
|
|
1011
|
-
label: this.literals.pageActionRemoveAll,
|
|
1012
|
-
action: this.confirmRemoveAll.bind(this, action.removeAll, action.beforeRemoveAll),
|
|
1013
|
-
disabled: this.disableRemoveAll.bind(this),
|
|
1014
|
-
type: 'danger'
|
|
1015
|
-
}
|
|
1016
|
-
];
|
|
1017
|
-
}
|
|
1018
|
-
}
|
|
1019
|
-
disableRemoveAll() {
|
|
1020
|
-
return !this.getSelectedItemsKeys();
|
|
1021
|
-
}
|
|
1022
|
-
setTableActions(actions) {
|
|
1023
|
-
if (actions) {
|
|
1024
|
-
const visibleRemove = this.showRemove(actions.remove);
|
|
1025
|
-
this.defaultTableActions = [
|
|
1026
|
-
{
|
|
1027
|
-
action: this.openDetail.bind(this, actions.detail),
|
|
1028
|
-
label: this.literals.tableActionView,
|
|
1029
|
-
visible: !!this._actions.detail
|
|
1030
|
-
},
|
|
1031
|
-
{
|
|
1032
|
-
action: this.openEdit.bind(this, actions.edit),
|
|
1033
|
-
label: this.literals.tableActionEdit,
|
|
1034
|
-
visible: !!this._actions.edit
|
|
1035
|
-
},
|
|
1036
|
-
{
|
|
1037
|
-
action: this.openDuplicate.bind(this, actions.duplicate),
|
|
1038
|
-
label: this.literals.tableActionDuplicate,
|
|
1039
|
-
visible: !!this._actions.duplicate
|
|
1040
|
-
},
|
|
1041
|
-
{
|
|
1042
|
-
action: this.confirmRemove.bind(this, actions.remove, actions.beforeRemove),
|
|
1043
|
-
label: this.literals.tableActionDelete,
|
|
1044
|
-
separator: true,
|
|
1045
|
-
type: 'danger',
|
|
1046
|
-
visible: visibleRemove
|
|
1047
|
-
}
|
|
1048
|
-
];
|
|
1049
|
-
}
|
|
1050
|
-
}
|
|
1051
|
-
loadDataFromAPI() {
|
|
1052
|
-
const { serviceApi: serviceApiFromRoute, serviceMetadataApi, serviceLoadApi } = this.activatedRoute.snapshot.data;
|
|
1053
|
-
const onLoad = serviceLoadApi || this.onLoad;
|
|
1054
|
-
this.serviceApi = serviceApiFromRoute || this.serviceApi;
|
|
1055
|
-
this.poPageDynamicService.configServiceApi({ endpoint: this.serviceApi, metadata: serviceMetadataApi });
|
|
1056
|
-
const metadata$ = this.getMetadata(serviceApiFromRoute, onLoad);
|
|
1057
|
-
let data$;
|
|
1058
|
-
if (this.quickSearchValue) {
|
|
1059
|
-
const paramsQuickSearchValue = { [this.quickSearchParam]: this.quickSearchValue };
|
|
1060
|
-
data$ = this.loadData(paramsQuickSearchValue);
|
|
1061
|
-
}
|
|
1062
|
-
else {
|
|
1063
|
-
data$ = this.loadData();
|
|
1064
|
-
}
|
|
1065
|
-
this.subscriptions.add(metadata$
|
|
1066
|
-
.pipe(switchMap(() => {
|
|
1067
|
-
const initialFilters = this.getInitialValuesFromFilter();
|
|
1068
|
-
if (!Object.keys(initialFilters).length) {
|
|
1069
|
-
return data$;
|
|
1070
|
-
}
|
|
1071
|
-
return EMPTY;
|
|
1072
|
-
}))
|
|
1073
|
-
.subscribe());
|
|
1074
|
-
}
|
|
1075
|
-
getInitialValuesFromFilter() {
|
|
1076
|
-
const initialFilters = this.filters.reduce((result, item) => Object.assign(result, { [item.property]: item.initValue }), {});
|
|
1077
|
-
Object.keys(initialFilters).forEach(key => {
|
|
1078
|
-
if (!initialFilters[key]) {
|
|
1079
|
-
delete initialFilters[key];
|
|
1080
|
-
}
|
|
1081
|
-
});
|
|
1082
|
-
return initialFilters;
|
|
1083
|
-
}
|
|
1084
|
-
loadOptionsOnInitialize(onLoad) {
|
|
1085
|
-
if (onLoad) {
|
|
1086
|
-
return this.getPoDynamicPageOptions(onLoad).pipe(tap(responsePoOption => this.poPageCustomizationService.changeOriginalOptionsToNewOptions(this, responsePoOption)));
|
|
1087
|
-
}
|
|
1088
|
-
return of(null);
|
|
1089
|
-
}
|
|
1090
|
-
getPoDynamicPageOptions(onLoad) {
|
|
1091
|
-
const originalOption = {
|
|
1092
|
-
fields: this.fields,
|
|
1093
|
-
actions: this.actions,
|
|
1094
|
-
breadcrumb: this.breadcrumb,
|
|
1095
|
-
title: this.title,
|
|
1096
|
-
keepFilters: this.keepFilters,
|
|
1097
|
-
concatFilters: this.concatFilters,
|
|
1098
|
-
hideRemoveAllDisclaimer: this.hideRemoveAllDisclaimer,
|
|
1099
|
-
hideCloseDisclaimers: this.hideCloseDisclaimers,
|
|
1100
|
-
pageCustomActions: this.pageCustomActions,
|
|
1101
|
-
tableCustomActions: this.tableCustomActions,
|
|
1102
|
-
quickSearchWidth: this.quickSearchWidth
|
|
1103
|
-
};
|
|
1104
|
-
const pageOptionSchema = {
|
|
1105
|
-
schema: [
|
|
1106
|
-
{
|
|
1107
|
-
nameProp: 'fields',
|
|
1108
|
-
merge: true,
|
|
1109
|
-
keyForMerge: 'property'
|
|
1110
|
-
},
|
|
1111
|
-
{
|
|
1112
|
-
nameProp: 'actions',
|
|
1113
|
-
merge: true
|
|
1114
|
-
},
|
|
1115
|
-
{
|
|
1116
|
-
nameProp: 'breadcrumb'
|
|
1117
|
-
},
|
|
1118
|
-
{
|
|
1119
|
-
nameProp: 'title'
|
|
1120
|
-
},
|
|
1121
|
-
{
|
|
1122
|
-
nameProp: 'keepFilters'
|
|
1123
|
-
},
|
|
1124
|
-
{
|
|
1125
|
-
nameProp: 'quickSearchWidth'
|
|
1126
|
-
},
|
|
1127
|
-
{
|
|
1128
|
-
nameProp: 'concatFilters'
|
|
1129
|
-
},
|
|
1130
|
-
{
|
|
1131
|
-
nameProp: 'hideRemoveAllDisclaimer'
|
|
1132
|
-
},
|
|
1133
|
-
{
|
|
1134
|
-
nameProp: 'hideCloseDisclaimers'
|
|
1135
|
-
},
|
|
1136
|
-
{
|
|
1137
|
-
nameProp: 'pageCustomActions',
|
|
1138
|
-
merge: true,
|
|
1139
|
-
keyForMerge: 'label'
|
|
1140
|
-
},
|
|
1141
|
-
{
|
|
1142
|
-
nameProp: 'tableCustomActions',
|
|
1143
|
-
merge: true,
|
|
1144
|
-
keyForMerge: 'label'
|
|
1145
|
-
}
|
|
1146
|
-
]
|
|
1147
|
-
};
|
|
1148
|
-
return this.poPageCustomizationService.getCustomOptions(onLoad, originalOption, pageOptionSchema);
|
|
1149
|
-
}
|
|
1150
|
-
showRemove(actionRemove) {
|
|
1151
|
-
const action = actionRemove ?? false;
|
|
1152
|
-
if (typeof action === 'boolean') {
|
|
1153
|
-
return action;
|
|
1154
|
-
}
|
|
1155
|
-
return true;
|
|
1156
|
-
}
|
|
1157
|
-
updateFilterValue(filter) {
|
|
1158
|
-
return this.fields.map(item => {
|
|
1159
|
-
if (filter.hasOwnProperty(item.property)) {
|
|
1160
|
-
item.initValue = filter[item.property];
|
|
1161
|
-
}
|
|
1162
|
-
});
|
|
1163
|
-
}
|
|
1164
|
-
updatePageActions() {
|
|
1165
|
-
this.pageActions = [...this._defaultPageActions, ...this._customPageListActions];
|
|
1166
|
-
}
|
|
1167
|
-
updateTableActions() {
|
|
1168
|
-
const defaultTableActionsWithoutActionDelete = this._defaultTableActions.filter(tableAction => tableAction.label !== this.literals.tableActionDelete);
|
|
1169
|
-
const tableActionDelete = this._defaultTableActions.find(tableAction => tableAction.label === this.literals.tableActionDelete);
|
|
1170
|
-
const newTableActions = [...defaultTableActionsWithoutActionDelete, ...this._customTableActions];
|
|
1171
|
-
if (tableActionDelete) {
|
|
1172
|
-
newTableActions.push(tableActionDelete);
|
|
1173
|
-
}
|
|
1174
|
-
this.tableActions = newTableActions;
|
|
1175
|
-
}
|
|
1176
|
-
static ɵfac = function PoPageDynamicTableComponent_Factory(t) { return new (t || PoPageDynamicTableComponent)(i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i1.ActivatedRoute), i0.ɵɵdirectiveInject(i2.PoDialogService), i0.ɵɵdirectiveInject(i2.PoNotificationService), i0.ɵɵdirectiveInject(i3.PoPageDynamicService), i0.ɵɵdirectiveInject(i4.PoPageCustomizationService), i0.ɵɵdirectiveInject(i5.PoPageDynamicTableActionsService), i0.ɵɵdirectiveInject(i2.PoLanguageService)); };
|
|
1177
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PoPageDynamicTableComponent, selectors: [["po-page-dynamic-table"]], inputs: { onLoad: [0, "p-load", "onLoad"], keepFilters: [2, "p-keep-filters", "keepFilters", convertToBoolean], actionRight: [2, "p-actions-right", "actionRight", convertToBoolean], concatFilters: [2, "p-concat-filters", "concatFilters", convertToBoolean], hideColumnsManager: [2, "p-hide-columns-manager", "hideColumnsManager", convertToBoolean], hideRemoveAllDisclaimer: [2, "p-hide-remove-all-disclaimer", "hideRemoveAllDisclaimer", convertToBoolean], infiniteScroll: [2, "p-infinite-scroll", "infiniteScroll", convertToBoolean], actions: [0, "p-actions", "actions"], pageCustomActions: [0, "p-page-custom-actions", "pageCustomActions"], tableCustomActions: [0, "p-table-custom-actions", "tableCustomActions"], quickSearchWidth: [0, "p-quick-search-width", "quickSearchWidth"], height: [0, "p-height", "height"], hideCloseDisclaimers: [0, "p-hide-close-disclaimers", "hideCloseDisclaimers"], quickSearchParam: [0, "p-quick-search-param", "quickSearchParam"], quickSearchValue: [0, "p-quick-search-value", "quickSearchValue"], searchLiterals: [0, "p-literals", "searchLiterals"], spacing: [0, "p-spacing", "spacing"], textWrap: [2, "p-text-wrap", "textWrap", convertToBoolean], draggable: [0, "p-draggable", "draggable"], virtualScroll: [0, "p-virtual-scroll", "virtualScroll"], visibleFixedFilters: [0, "p-visible-fixed-filters", "visibleFixedFilters"] }, features: [i0.ɵɵProvidersFeature([PoPageDynamicService]), i0.ɵɵInputTransformsFeature, i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 26, consts: [[3, "p-advanced-search", "p-change-disclaimers", "p-quick-search", "p-actions", "p-breadcrumb", "p-hide-close-disclaimers", "p-filters", "p-keep-filters", "p-literals", "p-concat-filters", "p-hide-remove-all-disclaimer", "p-quick-search-width", "p-title", "p-visible-fixed-filters", "p-quick-search-value"], [3, "p-show-more", "p-sort-by", "p-change-visible-columns", "p-restore-column-manager", "p-sort", "p-actions", "p-actions-right", "p-selectable", "p-columns", "p-items", "p-height", "p-hide-columns-manager", "p-infinite-scroll", "p-show-more-disabled", "p-text-wrap", "p-draggable", "p-spacing", "p-virtual-scroll"]], template: function PoPageDynamicTableComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1178
|
-
i0.ɵɵelementStart(0, "po-page-dynamic-search", 0);
|
|
1179
|
-
i0.ɵɵlistener("p-advanced-search", function PoPageDynamicTableComponent_Template_po_page_dynamic_search_p_advanced_search_0_listener($event) { return ctx.onAdvancedSearch($event); })("p-change-disclaimers", function PoPageDynamicTableComponent_Template_po_page_dynamic_search_p_change_disclaimers_0_listener($event) { return ctx.onChangeDisclaimers($event); })("p-quick-search", function PoPageDynamicTableComponent_Template_po_page_dynamic_search_p_quick_search_0_listener($event) { return ctx.onQuickSearch($event); });
|
|
1180
|
-
i0.ɵɵelementStart(1, "po-table", 1);
|
|
1181
|
-
i0.ɵɵlistener("p-show-more", function PoPageDynamicTableComponent_Template_po_table_p_show_more_1_listener() { return ctx.showMore(); })("p-sort-by", function PoPageDynamicTableComponent_Template_po_table_p_sort_by_1_listener($event) { return ctx.onSort($event); })("p-change-visible-columns", function PoPageDynamicTableComponent_Template_po_table_p_change_visible_columns_1_listener($event) { return ctx.onChangeVisibleColumns($event); })("p-restore-column-manager", function PoPageDynamicTableComponent_Template_po_table_p_restore_column_manager_1_listener($event) { return ctx.onColumnRestoreManager($event); })("p-sort-by", function PoPageDynamicTableComponent_Template_po_table_p_sort_by_1_listener($event) { return ctx.onSortBy($event); });
|
|
1182
|
-
i0.ɵɵelementEnd()();
|
|
1183
|
-
} if (rf & 2) {
|
|
1184
|
-
i0.ɵɵproperty("p-actions", ctx.pageActions)("p-breadcrumb", ctx.breadcrumb)("p-hide-close-disclaimers", ctx.hideCloseDisclaimers)("p-filters", ctx.filters)("p-keep-filters", ctx.keepFilters)("p-literals", ctx.searchLiterals)("p-concat-filters", ctx.concatFilters)("p-hide-remove-all-disclaimer", ctx.hideRemoveAllDisclaimer)("p-quick-search-width", ctx.quickSearchWidth)("p-title", ctx.title)("p-visible-fixed-filters", ctx.visibleFixedFilters)("p-quick-search-value", ctx.quickSearchValue || "");
|
|
1185
|
-
i0.ɵɵadvance();
|
|
1186
|
-
i0.ɵɵproperty("p-sort", true)("p-actions", ctx.tableActions)("p-actions-right", ctx.actionRight)("p-selectable", ctx.enableSelectionTable)("p-columns", ctx.columns)("p-items", ctx.items)("p-height", ctx.height)("p-hide-columns-manager", ctx.hideColumnsManager)("p-infinite-scroll", ctx.infiniteScroll)("p-show-more-disabled", !ctx.hasNext)("p-text-wrap", ctx.textWrap)("p-draggable", ctx.draggable)("p-spacing", ctx.spacing)("p-virtual-scroll", ctx.virtualScroll);
|
|
1187
|
-
} }, dependencies: [i2.PoTableComponent, i6.PoPageDynamicSearchComponent], encapsulation: 2 });
|
|
1188
|
-
}
|
|
1189
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoPageDynamicTableComponent, [{
|
|
1190
|
-
type: Component,
|
|
1191
|
-
args: [{ selector: 'po-page-dynamic-table', providers: [PoPageDynamicService], template: "<po-page-dynamic-search\n [p-actions]=\"pageActions\"\n [p-breadcrumb]=\"breadcrumb\"\n [p-hide-close-disclaimers]=\"hideCloseDisclaimers\"\n [p-filters]=\"filters\"\n [p-keep-filters]=\"keepFilters\"\n [p-literals]=\"searchLiterals\"\n [p-concat-filters]=\"concatFilters\"\n [p-hide-remove-all-disclaimer]=\"hideRemoveAllDisclaimer\"\n [p-quick-search-width]=\"quickSearchWidth\"\n [p-title]=\"title\"\n [p-visible-fixed-filters]=\"visibleFixedFilters\"\n (p-advanced-search)=\"onAdvancedSearch($event)\"\n (p-change-disclaimers)=\"onChangeDisclaimers($event)\"\n (p-quick-search)=\"onQuickSearch($event)\"\n [p-quick-search-value]=\"quickSearchValue || ''\"\n>\n <po-table\n [p-sort]=\"true\"\n [p-actions]=\"tableActions\"\n [p-actions-right]=\"actionRight\"\n [p-selectable]=\"enableSelectionTable\"\n [p-columns]=\"columns\"\n [p-items]=\"items\"\n [p-height]=\"height\"\n [p-hide-columns-manager]=\"hideColumnsManager\"\n [p-infinite-scroll]=\"infiniteScroll\"\n [p-show-more-disabled]=\"!hasNext\"\n (p-show-more)=\"showMore()\"\n (p-sort-by)=\"onSort($event)\"\n (p-change-visible-columns)=\"onChangeVisibleColumns($event)\"\n (p-restore-column-manager)=\"onColumnRestoreManager($event)\"\n (p-sort-by)=\"onSortBy($event)\"\n [p-text-wrap]=\"textWrap\"\n [p-draggable]=\"draggable\"\n [p-spacing]=\"spacing\"\n [p-virtual-scroll]=\"virtualScroll\"\n >\n </po-table>\n</po-page-dynamic-search>\n" }]
|
|
1192
|
-
}], () => [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.PoDialogService }, { type: i2.PoNotificationService }, { type: i3.PoPageDynamicService }, { type: i4.PoPageCustomizationService }, { type: i5.PoPageDynamicTableActionsService }, { type: i2.PoLanguageService }], { onLoad: [{
|
|
1193
|
-
type: Input,
|
|
1194
|
-
args: ['p-load']
|
|
1195
|
-
}], keepFilters: [{
|
|
1196
|
-
type: Input,
|
|
1197
|
-
args: [{ alias: 'p-keep-filters', transform: convertToBoolean }]
|
|
1198
|
-
}], actionRight: [{
|
|
1199
|
-
type: Input,
|
|
1200
|
-
args: [{ alias: 'p-actions-right', transform: convertToBoolean }]
|
|
1201
|
-
}], concatFilters: [{
|
|
1202
|
-
type: Input,
|
|
1203
|
-
args: [{ alias: 'p-concat-filters', transform: convertToBoolean }]
|
|
1204
|
-
}], hideColumnsManager: [{
|
|
1205
|
-
type: Input,
|
|
1206
|
-
args: [{ alias: 'p-hide-columns-manager', transform: convertToBoolean }]
|
|
1207
|
-
}], hideRemoveAllDisclaimer: [{
|
|
1208
|
-
type: Input,
|
|
1209
|
-
args: [{ alias: 'p-hide-remove-all-disclaimer', transform: convertToBoolean }]
|
|
1210
|
-
}], infiniteScroll: [{
|
|
1211
|
-
type: Input,
|
|
1212
|
-
args: [{ alias: 'p-infinite-scroll', transform: convertToBoolean }]
|
|
1213
|
-
}], actions: [{
|
|
1214
|
-
type: Input,
|
|
1215
|
-
args: ['p-actions']
|
|
1216
|
-
}], pageCustomActions: [{
|
|
1217
|
-
type: Input,
|
|
1218
|
-
args: ['p-page-custom-actions']
|
|
1219
|
-
}], tableCustomActions: [{
|
|
1220
|
-
type: Input,
|
|
1221
|
-
args: ['p-table-custom-actions']
|
|
1222
|
-
}], quickSearchWidth: [{
|
|
1223
|
-
type: Input,
|
|
1224
|
-
args: ['p-quick-search-width']
|
|
1225
|
-
}], height: [{
|
|
1226
|
-
type: Input,
|
|
1227
|
-
args: ['p-height']
|
|
1228
|
-
}], hideCloseDisclaimers: [{
|
|
1229
|
-
type: Input,
|
|
1230
|
-
args: ['p-hide-close-disclaimers']
|
|
1231
|
-
}], quickSearchParam: [{
|
|
1232
|
-
type: Input,
|
|
1233
|
-
args: ['p-quick-search-param']
|
|
1234
|
-
}], quickSearchValue: [{
|
|
1235
|
-
type: Input,
|
|
1236
|
-
args: ['p-quick-search-value']
|
|
1237
|
-
}], searchLiterals: [{
|
|
1238
|
-
type: Input,
|
|
1239
|
-
args: ['p-literals']
|
|
1240
|
-
}], spacing: [{
|
|
1241
|
-
type: Input,
|
|
1242
|
-
args: ['p-spacing']
|
|
1243
|
-
}], textWrap: [{
|
|
1244
|
-
type: Input,
|
|
1245
|
-
args: [{ alias: 'p-text-wrap', transform: convertToBoolean }]
|
|
1246
|
-
}], draggable: [{
|
|
1247
|
-
type: Input,
|
|
1248
|
-
args: ['p-draggable']
|
|
1249
|
-
}], virtualScroll: [{
|
|
1250
|
-
type: Input,
|
|
1251
|
-
args: ['p-virtual-scroll']
|
|
1252
|
-
}], visibleFixedFilters: [{
|
|
1253
|
-
type: Input,
|
|
1254
|
-
args: ['p-visible-fixed-filters']
|
|
1255
|
-
}] }); })();
|
|
1256
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PoPageDynamicTableComponent, { className: "PoPageDynamicTableComponent", filePath: "lib/components/po-page-dynamic-table/po-page-dynamic-table.component.ts", lineNumber: 151 }); })();
|
|
1257
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tcGFnZS1keW5hbWljLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RlbXBsYXRlcy9zcmMvbGliL2NvbXBvbmVudHMvcG8tcGFnZS1keW5hbWljLXRhYmxlL3BvLXBhZ2UtZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZW1wbGF0ZXMvc3JjL2xpYi9jb21wb25lbnRzL3BvLXBhZ2UtZHluYW1pYy10YWJsZS9wby1wYWdlLWR5bmFtaWMtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBR3BFLE9BQU8sRUFBRSxLQUFLLEVBQWMsWUFBWSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyRCxPQUFPLEVBUUwscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixlQUFlLEVBQ2hCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxLQUFLLElBQUksTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUUxRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUM5RixPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGdDQUFnQyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFldEcsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdkYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1B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QUFLO21CQUFDLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtZQWV2RSx1QkFBdUI7a0JBRHRCLEtBQUs7bUJBQUMsRUFBRSxLQUFLLEVBQUUsOEJBQThCLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO1lBZ0JULGNBQWM7a0JBQWpGLEtBQUs7bUJBQUMsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO1lBOEQxQyxPQUFPO2tCQUE5QixLQUFLO21CQUFDLFdBQVc7WUE4QmtCLGlCQUFpQjtrQkFBcEQsS0FBSzttQkFBQyx1QkFBdUI7WUE0Qk8sa0JBQWtCO2tCQUF0RCxLQUFLO21CQUFDLHdCQUF3QjtZQW1CSSxnQkFBZ0I7a0JBQWxELEtBQUs7bUJBQUMsc0JBQXNCO1lBZU4sTUFBTTtrQkFBNUIsS0FBSzttQkFBQyxVQUFVO1lBcUJzQixvQkFBb0I7a0JBQTFELEtBQUs7bUJBQUMsMEJBQTBCO1lBaUJFLGdCQUFnQjtrQkFBbEQsS0FBSzttQkFBQyxzQkFBc0I7WUFnQk0sZ0JBQWdCO2tCQUFsRCxLQUFLO21CQUFDLHNCQUFzQjtZQThDUixjQUFjO2tCQUFsQyxLQUFLO21CQUFDLFlBQVk7WUFhSyxPQUFPO2tCQUE5QixLQUFLO21CQUFDLFdBQVc7WUF5QjRDLFFBQVE7a0JBQXJFLEtBQUs7bUJBQUMsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtZQVVsQyxTQUFTO2tCQUFsQyxLQUFLO21CQUFDLGFBQWE7WUFvQlcsYUFBYTtrQkFBM0MsS0FBSzttQkFBQyxrQkFBa0I7WUEwQlMsbUJBQW1CO2tCQUFwRCxLQUFLO21CQUFDLHlCQUF5Qjs7a0ZBamRyQiwyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgUG9EaWFsb2dDb25maXJtT3B0aW9ucyxcbiAgUG9EaWFsb2dTZXJ2aWNlLFxuICBQb0xhbmd1YWdlU2VydmljZSxcbiAgUG9Ob3RpZmljYXRpb25TZXJ2aWNlLFxuICBQb1BhZ2VBY3Rpb24sXG4gIFBvVGFibGVBY3Rpb24sXG4gIFBvVGFibGVDb2x1bW5Tb3J0LFxuICBQb1RhYmxlQ29sdW1uU29ydFR5cGUsXG4gIFBvVGFibGVDb2x1bW5TcGFjaW5nLFxuICBwb0xvY2FsZURlZmF1bHRcbn0gZnJvbSAnQHBvLXVpL25nLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWxzL3V0aWwnO1xuaW1wb3J0IHsgY29udmVydFRvQm9vbGVhbiB9IGZyb20gJy4uLy4uL3V0aWxzL3V0aWwnO1xuXG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljRGV0YWlsQ29tcG9uZW50IH0gZnJvbSAnLi4vcG8tcGFnZS1keW5hbWljLWRldGFpbC9wby1wYWdlLWR5bmFtaWMtZGV0YWlsLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcG8tcGFnZS1keW5hbWljL3BvLXBhZ2UtZHluYW1pYy5zZXJ2aWNlJztcbmltcG9ydCB7IGlzRXh0ZXJuYWxMaW5rLCBvcGVuRXh0ZXJuYWxMaW5rLCByZW1vdmVEdXBsaWNhdGVJdGVtc1dpdGhBcnJheUtleSB9IGZyb20gJy4uLy4uL3V0aWxzL3V0aWwnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1NlYXJjaExpdGVyYWxzIH0gZnJvbSAnLi4vcG8tcGFnZS1keW5hbWljLXNlYXJjaC9wby1wYWdlLWR5bmFtaWMtc2VhcmNoLWxpdGVyYWxzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1BhZ2VDdXN0b21pemF0aW9uU2VydmljZSB9IGZyb20gJy4vLi4vLi4vc2VydmljZXMvcG8tcGFnZS1jdXN0b21pemF0aW9uL3BvLXBhZ2UtY3VzdG9taXphdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNPcHRpb25zU2NoZW1hIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9wby1wYWdlLWN1c3RvbWl6YXRpb24vcG8tcGFnZS1keW5hbWljLW9wdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLXRhYmxlLWFjdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNUYWJsZUJlZm9yZURldGFpbCB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWR5bmFtaWMtdGFibGUtYmVmb3JlLWRldGFpbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlRHVwbGljYXRlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtZHluYW1pYy10YWJsZS1iZWZvcmUtZHVwbGljYXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljVGFibGVCZWZvcmVFZGl0IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtZHluYW1pYy10YWJsZS1iZWZvcmUtZWRpdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlTmV3IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtZHluYW1pYy10YWJsZS1iZWZvcmUtbmV3LmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljVGFibGVCZWZvcmVSZW1vdmVBbGwgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLXRhYmxlLWJlZm9yZS1yZW1vdmUtYWxsLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljVGFibGVCZWZvcmVSZW1vdmUgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLXRhYmxlLWJlZm9yZS1yZW1vdmUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNUYWJsZUN1c3RvbUFjdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWR5bmFtaWMtdGFibGUtY3VzdG9tLWFjdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tVGFibGVBY3Rpb24gfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLXRhYmxlLWN1c3RvbS10YWJsZS1hY3Rpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNUYWJsZU1ldGFEYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtZHluYW1pYy10YWJsZS1tZXRhZGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1RhYmxlT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWR5bmFtaWMtdGFibGUtb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY0xpc3RCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9wby1wYWdlLWR5bmFtaWMtbGlzdC1iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zU2VydmljZSB9IGZyb20gJy4vcG8tcGFnZS1keW5hbWljLXRhYmxlLWFjdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBwb1BhZ2VEeW5hbWljVGFibGVMaXRlcmFsc0RlZmF1bHQgfSBmcm9tICcuL3BvLXBhZ2UtZHluYW1pYy10YWJsZS1saXRlcmFscyc7XG5cbmNvbnN0IFBBR0VfU0laRV9ERUZBVUxUID0gMTA7XG5cbnR5cGUgVXJsT3JQb0N1c3RvbWl6YXRpb25GdW5jdGlvbiA9IHN0cmluZyB8ICgoKSA9PiBQb1BhZ2VEeW5hbWljVGFibGVPcHRpb25zKTtcblxuLyoqXG4gKiBAZG9jc0V4dGVuZHMgUG9QYWdlRHluYW1pY0xpc3RCYXNlQ29tcG9uZW50XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogTyBgcG8tcGFnZS1keW5hbWljLXRhYmxlYCDDqSB1bWEgcMOhZ2luYSBxdWUgZXhpYmUgdW1hIGxpc3RhIGRlIHJlZ2lzdHJvcyBlbSB1bWEgdGFiZWxhIGJhc2VhZG8gZW0gdW1hIGxpc3RhIGRlIGZpZWxkcyxcbiAqIG8gbWVzbW8gdGFtYsOpbSBzdXBvcnRhIG1ldGFkYWRvcyBjb25mb3JtZSBlc3BlY2lmaWNhZG8gbmEgZG9jdW1lbnRhw6fDo28uXG4gKlxuICogIyMjIFV0aWxpemHDp8OjbyB2aWEgcm90YVxuICpcbiAqIEFvIHV0aWxpemFyIGFzIHJvdGFzIHBhcmEgaW5pY2lhbGl6YXIgbyB0ZW1wbGF0ZSwgbyBgcGFnZS1keW5hbWljLXRhYmxlYCBkaXNwb25pYmlsaXphIHByb3ByaWVkYWRlcyBxdWUgZGV2ZW0gc2VyIGZvcm5lY2lkYXMgbm8gYXJxdWl2byBkZSBjb25maWd1cmHDp8OjbyBkZSByb3RhcyBkYSBhcGxpY2HDp8OjbywgcGFyYVxuICogcG9kZXIgZXNwZWNpZmljYXIgbyBlbmRwb2ludCBkb3MgZGFkb3MgZSBkb3MgbWV0YWRhZG9zIHF1ZSBzZXLDo28gY2FycmVnYWRvcyBuYSBpbmljaWFsaXphw6fDo28uXG4gKlxuICogRXhlbXBsbyBkZSB1dGlsaXphw6fDo286XG4gKlxuICogQXJxdWl2byBkZSBjb25maWd1cmHDp8OjbyBkZSByb3RhcyBkYSBhcGxpY2HDp8OjbzogYGFwcC1yb3V0aW5nLm1vZHVsZS50c2BcbiAqIGBgYFxuICogY29uc3Qgcm91dGVzOiBSb3V0ZXMgPSBbXG4gKiB7XG4gKiAgIHBhdGg6ICdwZW9wbGUnLFxuICogICBjb21wb25lbnQ6IFBvUGFnZUR5bmFtaWNUYWJsZUNvbXBvbmVudCxcbiAqICAgZGF0YToge1xuICogICAgIHNlcnZpY2VBcGk6ICdodHRwOi8vbG9jYWxob3N0OjMwMDAvdjEvcGVvcGxlJywgLy8gZW5kcG9pbnQgZG9zIGRhZG9zXG4gKiAgICAgc2VydmljZU1ldGFkYXRhQXBpOiAnaHR0cDovL2xvY2FsaG9zdDozMDAwL3YxL21ldGFkYXRhJywgLy8gZW5kcG9pbnQgZG9zIG1ldGFkYWRvcyB1dGlsaXphbmRvIG8gbcOpdG9kbyBIVFRQIEdldFxuICogICAgIHNlcnZpY2VMb2FkQXBpOiAnaHR0cDovL2xvY2FsaG9zdDozMDAwL2xvYWQtbWV0YWRhdGEnIC8vIGVuZHBvaW50IGRlIGN1c3RvbWl6YcOnw7VlcyBkb3MgbWV0YWRhZG9zIHV0aWxpemFuZG8gbyBtw6l0b2RvIEhUVFAgUG9zdFxuICogICB9XG4gKiAgfSxcbiAqICB7XG4gKiAgIHBhdGg6ICdob21lJyxcbiAqICAgY29tcG9uZW50OiBIb21lRXhhbXBsZUNvbXBvbmVudFxuICogIH1cbiAqIF07XG4gKlxuICogYGBgXG4gKiBPIGNvbXBvbmVudGUgcHJpbWVpcm8gaXLDoSBjYXJyZWdhciBvIG1ldGFkYWRvIGRhIHJvdGEgZGVmaW5pZGEgbmEgcHJvcHJpZWRhZGUgc2VydmljZU1ldGFkYXRhQXBpXG4gKiBlIGRlcG9pcyBpcsOhIGJ1c2NhciBkYSByb3RhIGRlZmluaWRhIG5hIHByb3ByaWVkYWRlIHNlcnZpY2VMb2FkQXBpLlxuICpcbiAqIEEgcmVxdWlzacOnw6NvIGRvcyBtZXRhZGFkb3Mgw6kgZmVpdGEgbmEgaW5pY2lhbGl6YcOnw6NvIGRvIHRlbXBsYXRlIHBhcmEgYnVzY2FyIG9zIG1ldGFkYWRvcyBkYSBww6FnaW5hIHBhc3NhbmRvIG9cbiAqIHRpcG8gZG8gbWV0YWRhZG8gZXNwZXJhZG8gZSBhIHZlcnPDo28gY2FjaGVhZGEgcGVsbyBicm93c2VyLlxuICpcbiAqID4gQ2FzbyBvIHNlcnZpZG9yIHJldG9ybmFyIHVtIGVycm8gYW8gcmVjdXBlcmFyIG9zIG1ldGFkYWRvcywgc2Vyw6NvIHJlcGFzc2Fkb3Mgb3MgbWV0YWRhZG9zIHNhbHZvcyBlbSBjYWNoZSxcbiAqIHNlIG8gY2FjaGUgbsOjbyBleGlzdGlyIHNlcsOhIGRpc3BhcmFkYSB1bWEgbm90aWZpY2HDp8Ojby5cbiAqXG4gKiBPIGZvcm1hdG8gZXNwZXJhZG8gbmEgcmVzcG9zdGEgZGEgcmVxdWlzacOnw6NvIGVzdMOhIGVzcGVjaWZpY2FkbyBuYSBpbnRlcmZhY2VcbiAqIFtQb1BhZ2VEeW5hbWljVGFibGVNZXRhZGF0YV0oL2RvY3VtZW50YXRpb24vcG8tcGFnZS1keW5hbWljLXRhYmxlI3BvLXBhZ2UtZHluYW1pYy10YWJsZS1tZXRhZGF0YSkuIFBvciBleGVtcGxvOlxuICpcbiAqIGBgYFxuICogIHtcbiAqICAgdmVyc2lvbjogMSxcbiAqICAgdGl0bGU6ICdQZXJzb24gVGFibGUnLFxuICogICBmaWVsZHM6IFtcbiAqICAgICB7IHByb3BlcnR5OiAnaWQnLCBrZXk6IHRydWUsIGRpc2FibGVkOiB0cnVlIH0sXG4gKiAgICAgeyBwcm9wZXJ0eTogJ3N0YXR1cycgfSxcbiAqICAgICB7IHByb3BlcnR5OiAnbmFtZScgfSxcbiAqICAgICB7IHByb3BlcnR5OiAnbmlja25hbWUnIH0sXG4gKiAgICAgeyBwcm9wZXJ0eTogJ2JpcnRoZGF0ZScsIGxhYmVsOiAnQmlydGggZGF0ZScgfSxcbiAqICAgICB7IHByb3BlcnR5OiAnZ2VucmUnIH0sXG4gKiAgICAgeyBwcm9wZXJ0eTogJ2NpdHknIH0sXG4gKiAgICAgeyBwcm9wZXJ0eTogJ2NvdW50cnknIH1cbiAqICAgXSxcbiAqICAga2VlcEZpbHRlcnM6IHRydWVcbiAqIH1cbiAqIGBgYFxuICpcbiAqID4gQ2FzbyBvIGVuZHBvaW50IGRvcyBtZXRhZGFkb3MgbsOjbyBzZWphIGVzcGVjaWZpY2Fkbywgc2Vyw6EgZmVpdG8gdW1hIHJlcXVpc2nDp8OjbyB1dGlsaXphbmRvIG8gYHNlcnZpY2VBcGlgIGRhIHNlZ3VpbnRlIGZvcm1hOlxuICogYGBgXG4gKiBHRVQge2VuZC1wb2ludH0vbWV0YWRhdGE/dHlwZT1saXN0JnZlcnNpb249e3ZlcnNpb259XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIDxleGFtcGxlIG5hbWU9XCJwby1wYWdlLWR5bmFtaWMtdGFibGUtYmFzaWNcIiB0aXRsZT1cIlBPIFBhZ2UgRHluYW1pYyBUYWJsZSBCYXNpY1wiPlxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLWJhc2ljL3NhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtYmFzaWMuY29tcG9uZW50Lmh0bWxcIj4gPC9maWxlPlxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLWJhc2ljL3NhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtYmFzaWMuY29tcG9uZW50LnRzXCI+IDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwicG8tcGFnZS1keW5hbWljLXRhYmxlLXBlb3BsZVwiIHRpdGxlPVwiUE8gUGFnZSBEeW5hbWljIFRhYmxlIC0gUGVvcGxlXCI+XG4gKiAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtcGVvcGxlL3NhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtcGVvcGxlLmNvbXBvbmVudC5odG1sXCI+IDwvZmlsZT5cbiAqICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS1wZW9wbGUvc2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS1wZW9wbGUuY29tcG9uZW50LnRzXCI+IDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwicG8tcGFnZS1keW5hbWljLXRhYmxlLXVzZXJzXCIgdGl0bGU9XCJQTyBQYWdlIER5bmFtaWMgVGFibGUgLSBVc2Vyc1wiPlxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLXVzZXJzL3NhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtdXNlcnMuY29tcG9uZW50Lmh0bWxcIj4gPC9maWxlPlxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLXVzZXJzL3NhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtdXNlcnMuY29tcG9uZW50LnRzXCI+IDwvZmlsZT5cbiAqICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS11c2Vycy9zYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLXVzZXJzLnNlcnZpY2UudHNcIj4gPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqIDxleGFtcGxlIG5hbWU9XCJwby1wYWdlLWR5bmFtaWMtdGFibGUtaG90ZWxzXCIgdGl0bGU9XCJQTyBQYWdlIER5bmFtaWMgVGFibGUgLSBIb3RlbHNcIj5cbiAqICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS1ob3RlbHMvc2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS1ob3RlbHMuY29tcG9uZW50Lmh0bWxcIj4gPC9maWxlPlxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLWhvdGVscy9zYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLWhvdGVscy5jb21wb25lbnQudHNcIj4gPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqIDxleGFtcGxlIG5hbWU9XCJwby1wYWdlLWR5bmFtaWMtdGFibGUtZHJhZy1hbmQtZHJvcFwiIHRpdGxlPVwiUE8gUGFnZSBEeW5hbWljIFRhYmxlIC0gRHJhZyBhbmQgRHJvcFwiPlxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLXRhYmxlLWRyYWctYW5kLWRyb3Avc2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS1kcmFnLWFuZC1kcm9wLmNvbXBvbmVudC5odG1sXCI+IDwvZmlsZT5cbiAqICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLXBhZ2UtZHluYW1pYy10YWJsZS1kcmFnLWFuZC1kcm9wL3NhbXBsZS1wby1wYWdlLWR5bmFtaWMtdGFibGUtZHJhZy1hbmQtZHJvcC5jb21wb25lbnQudHNcIj4gPC9maWxlPlxuICogPC9leGFtcGxlPlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwby1wYWdlLWR5bmFtaWMtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vcG8tcGFnZS1keW5hbWljLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbUG9QYWdlRHluYW1pY1NlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIFBvUGFnZUR5bmFtaWNUYWJsZUNvbXBvbmVudCBleHRlbmRzIFBvUGFnZUR5bmFtaWNMaXN0QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIEZ1bsOnw6NvIG91IHNlcnZpw6dvIHF1ZSBzZXLDoSBleGVjdXRhZG8gbmEgaW5pY2lhbGl6YcOnw6NvIGRvIGNvbXBvbmVudGUuXG4gICAqXG4gICAqIEEgcHJvcHJpZWRhZGUgYWNlaXRhIG9zIHNlZ3VpbnRlcyB0aXBvczpcbiAgICogLSBgc3RyaW5nYDogKkVuZHBvaW50KiB1c2FkbyBwZWxvIGNvbXBvbmVudGUgcGFyYSByZXF1aXNpw6fDo28gdmlhIGBQT1NUYC5cbiAgICogLSBgZnVuY3Rpb25gOiBNw6l0b2RvIHF1ZSBzZXLDoSBleGVjdXRhZG8uXG4gICAqXG4gICAqIE8gcmV0b3JubyBkZXN0YSBmdW7Dp8OjbyBkZXZlIHNlciBkbyB0aXBvIGBQb1BhZ2VEeW5hbWljVGFibGVPcHRpb25zYCxcbiAgICogb25kZSBvIHVzdcOhcmlvIHBvZGVyw6EgY3VzdG9taXphciBub3ZvcyBjYW1wb3MsIGJyZWFkY3J1bWIsIHRpdGxlIGUgYWN0aW9uc1xuICAgKlxuICAgKiBQb3IgZXhlbXBsbzpcbiAgICpcbiAgICogYGBgXG4gICAqIGdldFBhZ2VPcHRpb25zKCk6IFBvUGFnZUR5bmFtaWNUYWJsZU9wdGlvbnMge1xuICAgKiByZXR1cm4ge1xuICAgKiAgIGFjdGlvbnM6XG4gICAqICAgICB7IG5ldzogJ25ldycsIGVkaXQ6ICdlZGl0LzppZCcsIHJlbW92ZTogdHJ1ZSB9LFxuICAgKiAgIGZpZWxkczogW1xuICAgKiAgICAgeyBwcm9wZXJ0eTogJ2lkQ2FyZCcsIGdyaWRDb2x1bW5zOiA2IH1cbiAgICogICBdXG4gICAqIH07XG4gICAqIH1cbiAgICpcbiAgICogYGBgXG4gICAqIFBhcmEgcmVmZXJlbmNpYXIgYSBzdWEgZnVuw6fDo28gdXRpbGl6ZSBhIHByb3ByaWVkYWRlIGBiaW5kYCwgcG9yIGV4ZW1wbG86XG4gICAqIGBgYFxuICAgKiAgW3AtbG9hZF09XCJvbkxvYWRPcHRpb25zLmJpbmQodGhpcylcIlxuICAgKiBgYGBcbiAgICovXG4gIEBJbnB1dCgncC1sb2FkJykgb25Mb2FkOiBzdHJpbmcgfCAoKCkgPT4gUG9QYWdlRHluYW1pY1RhYmxlT3B0aW9ucyk7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogTWFudMOpbSBuYSBtb2RhbCBkZSBgQnVzY2EgQXZhbsOnYWRhYCBvcyB2YWxvcmVzIHByZWVuY2hpZG9zIGRvIMO6bHRpbW8gZmlsdHJvIHJlYWxpemFkbyBwZWxvIHVzdcOhcmlvLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICBASW5wdXQoeyBhbGlhczogJ3Ata2VlcC1maWx0ZXJzJywgdHJhbnNmb3JtOiBjb252ZXJ0VG9Cb29sZWFuIH0pIGtlZXBGaWx0ZXJzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRGVmaW5lIHF1ZSBhIGNvbHVuYSBkZSBhw6fDtWVzIGZpY2Fyw6Egbm8gbGFkbyBkaXJlaXRvIGRhIHRhYmVsYS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgQElucHV0KHsgYWxpYXM6ICdwLWFjdGlvbnMtcmlnaHQnLCB0cmFuc2Zvcm06IGNvbnZlcnRUb0Jvb2xlYW4gfSkgYWN0aW9uUmlnaHQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBQZXJtaXRlIGEgdXRpbGl6YcOnw6NvIGRhIHBlc3F1aXNhIHLDoXBpZGEganVudG8gY29tIGEgcGVzcXVpc2EgYXZhbsOnYWRhLlxuICAgKlxuICAgKiBEZXN0YSBmb3JtYSwgYW8gdGVyIHVtYSBwZXNxdWlzYSBhdmFuw6dhZGEgZXN0YWJlbGVjaWRhIGUgc2VyXG4gICAqIHByZWVuY2hpZG8gYSBwZXNxdWlzYSByw6FwaWRhLCBvIGZpbHRybyBzZXLDoSBjb25jYXRlbmFkbyBhZGljaW9uYW5kbyBhIHBlc3F1aXNhXG4gICAqIHLDoXBpZGEgdGFtYsOpbSBuYSBsaXN0YSBkZSBgZGlzY2xhaW1lcnNgIGEgYXBsaWNhbmRvIHVtYSBub3ZhIGJ1c2NhIGNvbSBhIGNvbmNhdGVuYcOnw6NvLlxuICAgKlxuICAgKiBQb3IgZXhlbXBsbywgY29tIG9zIHNlZ3VpbnRlcyBmaWx0cm9zIGFwbGljYWRvczpcbiAgICogICAtIGZpbHRybyBhdmFuw6dhZG86IGB7IG5hbWU6ICdNaWtlJywgYWdlOiAnMTInIH1gXG4gICAqICAgLSBmaWx0cm8gcsOhcGlkbzogYHsgc2VhcmNoOiAncGFwZXInIH1gXG4gICAqXG4gICAqIEEgcmVxdWlzacOnw6NvIGRvcyBkYWRvcyBuYSBBUEkgZmljYXLDoSBjb20gb3MgcGFyw6JtZXRyb3M6XG4gICAqIGBgYFxuICAgKiBwYWdlPTEmcGFnZVNpemU9MTAmbmFtZT1NaWtlJmFnZT0xMiZzZWFyY2g9cGFwZXJcbiAgICogYGBgXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIEBJbnB1dCh7IGFsaWFzOiAncC1jb25jYXQtZmlsdGVycycsIHRyYW5zZm9ybTogY29udmVydFRvQm9vbGVhbiB9KSBjb25jYXRGaWx0ZXJzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogUGVybWl0ZSBxdWUgbyBnZXJlbmNpYWRvciBkZSBjb2x1bmFzLCByZXNwb25zw6F2ZWwgcGVsYSBkZWZpbmnDp8OjbyBkZSBxdWFpcyBjb2x1bmFzIHNlcsOjbyBleGliaWRhcywgc2VqYSBlc2NvbmRpZG8uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIEBJbnB1dCh7IGFsaWFzOiAncC1oaWRlLWNvbHVtbnMtbWFuYWdlcicsIHRyYW5zZm9ybTogY29udmVydFRvQm9vbGVhbiB9KVxuICBoaWRlQ29sdW1uc01hbmFnZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBPY3VsdGEgbyBib3TDo28gcGFyYSByZW1vdmVyIHRvZG9zIG9zICpkaXNjbGFpbWVycyogZG8gZ3J1cG8uXG4gICAqXG4gICAqID4gUG9yIHBhZHLDo28sIG8gbWVzbW8gw6kgZXhpYmlkbyDDoCBwYXJ0aXIgZGUgZG9pcyBvdSBtYWlzICpkaXNjbGFpbWVycyogY29tIGEgb3DDp8OjbyBgaGlkZUNsb3NlYCBoYWJpbGl0YWRhLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICBASW5wdXQoeyBhbGlhczogJ3AtaGlkZS1yZW1vdmUtYWxsLWRpc2NsYWltZXInLCB0cmFuc2Zvcm06IGNvbnZlcnRUb0Jvb2xlYW4gfSlcbiAgaGlkZVJlbW92ZUFsbERpc2NsYWltZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBTZSB2ZXJkYWRlaXJvLCBhdGl2YSBhIGZ1bmNpb25hbGlkYWRlIGRlIHNjcm9sbCBpbmZpbml0byBwYXJhIGEgdGFiZWxhIGUgbyBib3TDo28gXCJDYXJyZWdhciBNYWlzXCIgZGVpeGFyw6EgZGUgc2VyIGV4aWJpZG8uIEFvIGNoZWdhciBubyBmaW0gZGEgdGFiZWxhXG4gICAqIGV4ZWN1dGFyw6EgYSBmdW7Dp8OjbyBgcC1zaG93LW1vcmVgLlxuICAgKlxuICAgKiAqKlJlZ3JhcyBkZSB1dGlsaXphw6fDo286KipcbiAgICogIC0gTyBzY3JvbGwgaW5maW5pdG8gc8OzIGZ1bmNpb25hIHBhcmEgdGFiZWxhcyBxdWUgdXRpbGl6YW0gYSBwcm9wcmllZGFkZSBgcC1oZWlnaHRgIGUgcXVlIHBvc3N1ZW0gbyBzY3JvbGwgasOhIG5hIGNhcmdhIGluaWNpYWwgZG9zIGRhZG9zLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICBASW5wdXQoeyBhbGlhczogJ3AtaW5maW5pdGUtc2Nyb2xsJywgdHJhbnNmb3JtOiBjb252ZXJ0VG9Cb29sZWFuIH0pIGluZmluaXRlU2Nyb2xsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgaGFzTmV4dCA9IGZhbHNlO1xuICBpdGVtcyA9IFtdO1xuICBsaXRlcmFscztcbiAgcGFnZUFjdGlvbnM6IEFycmF5PFBvUGFnZUFjdGlvbj4gPSBbXTtcbiAgdGFibGVBY3Rpb25zOiBBcnJheTxQb1RhYmxlQWN0aW9uPiA9IFtdO1xuXG4gIHByaXZhdGUgX2FjdGlvbnM6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnMgPSB7fTtcbiAgcHJpdmF0ZSBfcGFnZUN1c3RvbUFjdGlvbnM6IEFycmF5PFBvUGFnZUR5bmFtaWNUYWJsZUN1c3RvbUFjdGlvbj4gPSBbXTtcbiAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXI7XG4gIHByaXZhdGUgX29sZFF1aWNrU2VhcmNoUGFyYW06IHN0cmluZztcbiAgcHJpdmF0ZSBfcXVpY2tTZWFyY2hQYXJhbTogc3RyaW5nID0gJ3NlYXJjaCc7XG4gIHByaXZhdGUgX3F1aWNrU2VhcmNoVmFsdWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcXVpY2tTZWFyY2hXaWR0aDogbnVtYmVyO1xuICBwcml2YXRlIF90YWJsZUN1c3RvbUFjdGlvbnM6IEFycmF5PFBvUGFnZUR5bmFtaWNUYWJsZUN1c3RvbVRhYmxlQWN0aW9uPiA9IFtdO1xuXG4gIHByaXZhdGUgcGFnZTogbnVtYmVyID0gMTtcbiAgcHJpdmF0ZSBjdXJyZW50UGFnZTogbnVtYmVyID0gMTtcbiAgcHJpdmF0ZSBpdGVtU2VsZWN0ZWRBY3Rpb247XG4gIHByaXZhdGUgcGFyYW1zID0ge307XG4gIHByaXZhdGUgc29ydGVkQ29sdW1uOiBQb1RhYmxlQ29sdW1uU29ydDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIGhhc0N1c3RvbUFjdGlvbldpdGhTZWxlY3RhYmxlID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfY3VzdG9tUGFnZUxpc3RBY3Rpb25zOiBBcnJheTxQb1BhZ2VBY3Rpb24+ID0gW107XG4gIHByaXZhdGUgX2N1c3RvbVRhYmxlQWN0aW9uczogQXJyYXk8UG9UYWJsZUFjdGlvbj4gPSBbXTtcbiAgcHJpdmF0ZSBfZGVmYXVsdFBhZ2VBY3Rpb25zOiBBcnJheTxQb1BhZ2VBY3Rpb24+ID0gW107XG4gIHByaXZhdGUgX2RlZmF1bHRUYWJsZUFjdGlvbnM6IEFycmF5PFBvVGFibGVBY3Rpb24+ID0gW107XG4gIHByaXZhdGUgX2hpZGVDbG9zZURpc2NsYWltZXJzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIHByaXZhdGUgX2RyYWdnYWJsZSA9IGZhbHNlO1xuICBwcml2YXRlIF9zcGFjaW5nOiBQb1RhYmxlQ29sdW1uU3BhY2luZyA9IFBvVGFibGVDb2x1bW5TcGFjaW5nLk1lZGl1bTtcbiAgcHJpdmF0ZSBfdmlydHVhbFNjcm9sbD86IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgc2V0IGRlZmF1bHRQYWdlQWN0aW9ucyh2YWx1ZTogQXJyYXk8UG9QYWdlQWN0aW9uPikge1xuICAgIHRoaXMuX2RlZmF1bHRQYWdlQWN0aW9ucyA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlUGFnZUFjdGlvbnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0IGRlZmF1bHRUYWJsZUFjdGlvbnModmFsdWU6IEFycmF5PFBvVGFibGVBY3Rpb24+KSB7XG4gICAgdGhpcy5fZGVmYXVsdFRhYmxlQWN0aW9ucyA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlVGFibGVBY3Rpb25zKCk7XG4gIH1cblxuICBwcml2YXRlIHNldCBjdXN0b21QYWdlTGlzdEFjdGlvbnModmFsdWU6IEFycmF5PFBvUGFnZUFjdGlvbj4pIHtcbiAgICB0aGlzLl9jdXN0b21QYWdlTGlzdEFjdGlvbnMgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZVBhZ2VBY3Rpb25zKCk7XG4gIH1cblxuICBwcml2YXRlIHNldCBjdXN0b21UYWJsZUFjdGlvbnModmFsdWU6IEFycmF5PFBvVGFibGVBY3Rpb24+KSB7XG4gICAgdGhpcy5fY3VzdG9tVGFibGVBY3Rpb25zID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVUYWJsZUFjdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEHDp8O1ZXMgZGEgcMOhZ2luYSBlIGRhIHRhYmVsYS5cbiAgICogPiBDYXNvIHV0aWxpemFyIGEgYcOnw6NvIHBhZHLDo28gZGUgZXhjbHVpciwgYSBtZXNtYSBzZXLDoSBleGliaWRhIHBvciDDumx0aW1vIG5hIHRhYmVsYS5cbiAgICovXG4gIEBJbnB1dCgncC1hY3Rpb25zJykgc2V0IGFjdGlvbnModmFsdWU6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnMpIHtcbiAgICB0aGlzLl9hY3Rpb25zID0gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID4gMCA/IHZhbHVlIDoge307XG5cbiAgICB0aGlzLnNldFBhZ2VBY3Rpb25zKHRoaXMuYWN0aW9ucyk7XG4gICAgdGhpcy5zZXRSZW1vdmVBbGxBY3Rpb24oKTtcbiAgICB0aGlzLnNldFRhYmxlQWN0aW9ucyh0aGlzLmFjdGlvbnMpO1xuICB9XG5cbiAgZ2V0IGFjdGlvbnMoKTogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBMaXN0YSBkZSBhw6fDtWVzIGN1c3RvbWl6YWRhcyBkYSBww6FnaW5hIHF1ZSBzZXLDo28gaW5jb3Jwb3JhZGFzIMOgcyBhw6fDtWVzXG4gICAqIGluZm9ybWFkYXMgYXRyYXbDqXMgZGEgcHJvcHJpZWRhZGUgYHAtYWN0aW9uc2AuXG4gICAqXG4gICAqIEVzc2FzIGHDp8O1ZXMgZmljYW0gbG9jYWxpemFkYXMgbmEgcGFydGUgc3VwZXJpb3IgZGEgcMOhZ2luYSBlbSBib3TDtWVzIGNvbSBhw6fDtWVzLlxuICAgKlxuICAgKiBFeGVtcGxvIGRlIHV0aWxpemHDp8OjbzpcbiAgICogYGBgXG4gICAqIFtcbiAgICogIHsgbGFiZWw6ICdFeHBvcnQnLCBhY3Rpb246IHRoaXMuZXhwb3J0LmJpbmQodGhpcykgfSxcbiAgICogIHsgbGFiZWw6ICdQcmludCcsIGFjdGlvbjogdGhpcy5wcmludC5iaW5kKHRoaXMpIH1cbiAgICogXTtcbiAgICogYGBgXG4gICAqL1xuICBASW5wdXQoJ3AtcGFnZS1jdXN0b20tYWN0aW9ucycpIHNldCBwYWdlQ3VzdG9tQWN0aW9ucyh2YWx1ZTogQXJyYXk8UG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tQWN0aW9uPikge1xuICAgIHRoaXMuX3BhZ2VDdXN0b21BY3Rpb25zID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xuXG4gICAgdGhpcy5jdXN0b21QYWdlTGlzdEFjdGlvbnMgPSB0aGlzLnRyYW5zZm9ybUN1c3RvbUFjdGlvbnNUb1BhZ2VMaXN0QWN0aW9uKHRoaXMucGFnZUN1c3RvbUFjdGlvbnMpO1xuICAgIHRoaXMuaGFzQ3VzdG9tQWN0aW9uV2l0aFNlbGVjdGFibGUgPSB0aGlzLnBhZ2VDdXN0b21BY3Rpb25zLnNvbWUoY3VzdG9tQWN0aW9uID0+IGN1c3RvbUFjdGlvbi5zZWxlY3RhYmxlKTtcbiAgfVxuXG4gIGdldCBwYWdlQ3VzdG9tQWN0aW9ucygpOiBBcnJheTxQb1BhZ2VEeW5hbWljVGFibGVDdXN0b21BY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUN1c3RvbUFjdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBMaXN0YSBkZSBhw6fDtWVzIGN1c3RvbWl6YWRhcyBuYSB0YWJlbGEgZGEgcMOhZ2luYSBxdWUgc2Vyw6NvIGluY29ycG9yYWRhcyDDoHMgYcOnw7Vlc1xuICAgKiBpbmZvcm1hZGFzIGF0cmF2w6lzIGRhIHByb3ByaWVkYWRlIGBwLWFjdGlvbnNgLlxuICAgKlxuICAgKiBFeGVtcGxvIGRlIHV0aWxpemHDp8OjbzpcbiAgICogYGBgXG4gICAqIFtcbiAgICogIHsgbGFiZWw6ICdBcHBseSBkaXNjb3VudCcsIGFjdGlvbjogdGhpcy5hcHBseURpc2NvdW50LmJpbmQodGhpcykgfSxcbiAgICogIHsgbGFiZWw6ICdEZXRhaWxzJywgYWN0aW9uOiB0aGlzLmRldGFpbHMuYmluZCh0aGlzKSB9XG4gICAqIF07XG4gICAqIGBgYFxuICAgKiA+IENhc28gdXRpbGl6YXIgYSBhw6fDo28gcGFkcsOjbyBkZSBleGNsdWlyLCBhIG1lc21hIHNlcsOhIGV4aWJpZGEgcG9yIMO6bHRpbW8gbmEgdGFiZWxhLlxuICAgKi9cbiAgQElucHV0KCdwLXRhYmxlLWN1c3RvbS1hY3Rpb25zJykgc2V0IHRhYmxlQ3VzdG9tQWN0aW9ucyh2YWx1ZTogQXJyYXk8UG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tVGFibGVBY3Rpb24+KSB7XG4gICAgdGhpcy5fdGFibGVDdXN0b21BY3Rpb25zID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xuXG4gICAgdGhpcy5jdXN0b21UYWJsZUFjdGlvbnMgPSB0aGlzLnRyYW5zZm9ybVRhYmxlQ3VzdG9tQWN0aW9uc1RvVGFibGVBY3Rpb25zKHRoaXMudGFibGVDdXN0b21BY3Rpb25zKTtcbiAgfVxuXG4gIGdldCB0YWJsZUN1c3RvbUFjdGlvbnMoKTogQXJyYXk8UG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tVGFibGVBY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVDdXN0b21BY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogTGFyZ3VyYSBkbyBjYW1wbyBkZSBidXNjYSwgdXRpbGl6YW5kbyBvICpHcmlkIFN5c3RlbSosXG4gICAqIGUgbGltaXRhZG8gYW8gbcOheGltbyBkZSA2IGNvbHVuYXMuIE8gdGFtYW5obyBtw61uaW1vIMOpIGNvbnRyb2xhZG9cbiAgICogY29uZm9ybWUgcmVzb2x1w6fDo28gZGUgdGVsYSBwYXJhIG1hbnRlciBhIGNvbnNpc3TDqm5jaWEgZG8gbGF5b3V0LlxuICAgKi9cbiAgQElucHV0KCdwLXF1aWNrLXNlYXJjaC13aWR0aCcpIHNldCBxdWlja1NlYXJjaFdpZHRoKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9xdWlja1NlYXJjaFdpZHRoID0gdXRpbC5jb252ZXJ0VG9JbnQodmFsdWUpO1xuICB9XG5cbiAgZ2V0IHF1aWNrU2VhcmNoV2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcXVpY2tTZWFyY2hXaWR0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIERlZmluZSBhIGFsdHVyYSBkYSB0YWJlbGEgZW0gKnBpeGVscyogZSBmaXhhIG8gY2FiZcOnYWxoby5cbiAgICovXG4gIEBJbnB1dCgncC1oZWlnaHQnKSBzZXQgaGVpZ2h0KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9oZWlnaHQgPSB1dGlsLmNvbnZlcnRUb0ludCh2YWx1ZSk7XG4gIH1cblxuICBnZXQgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIExpc3RhIGRlIGZpbHRyb3MgcXVlIHRlcsOjbyBhIG9ww6fDo28gZGUgZmVjaGFyIG9jdWx0YWRhXG4gICAqIGVtIHNldSByZXNwZWN0aXZvIGRpc2NsYWltZXIuIFV0aWxpemFyIG8gYXRyaWJ1dG8gYHByb3BlcnR5YCBkbyBjYW1wby5cbiAgICpcbiAgICogRXhlbXBsbyBkZSB1dGlsaXphw6fDo286XG4gICAqIGBgYFxuICAgKiBbJ2NpdHknLCduYW1lJ107XG4gICAqIGBgYFxuICAgKi9cbiAgQElucHV0KCdwLWhpZGUtY2xvc2UtZGlzY2xhaW1lcnMnKSBzZXQgaGlkZUNsb3NlRGlzY2xhaW1lcnModmFsdWU6IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLl9oaWRlQ2xvc2VEaXNjbGFpbWVycyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXTtcbiAgfVxuXG4gIGdldCBoaWRlQ2xvc2VEaXNjbGFpbWVycygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5faGlkZUNsb3NlRGlzY2xhaW1lcnM7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBJZGVudGlmaWNhZG9yIGRvIHBhcsOibWV0cm8gZW52aWFkbyBhbyBzZXJ2acOnbyBhbyByZWFsaXphciB1bWEgYnVzY2EgcsOhcGlkYS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ3NlYXJjaCdcbiAgICovXG4gIEBJbnB1dCgncC1xdWljay1zZWFyY2gtcGFyYW0nKSBzZXQgcXVpY2tTZWFyY2hQYXJhbSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcXVpY2tTZWFyY2hQYXJhbSA9IHZhbHVlID8/ICdzZWFyY2gnO1xuICB9XG5cbiAgZ2V0IHF1aWNrU2VhcmNoUGFyYW0oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcXVpY2tTZWFyY2hQYXJhbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIFZhbG9yIHBhZHLDo28gbmEgYnVzY2EgcsOhcGlkYSBhbyBpbmljaWFsaXphciBvIGNvbXBvbmVudGVcbiAgICpcbiAgICovXG4gIEBJbnB1dCgncC1xdWljay1zZWFyY2gtdmFsdWUnKSBzZXQgcXVpY2tTZWFyY2hWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcXVpY2tTZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHF1aWNrU2VhcmNoVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcXVpY2tTZWFyY2hWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIE9iamV0byBjb20gYXMgbGl0ZXJhaXMgdXNhZGFzIG5vIGBwby1wYWdlLWR5bmFtaWMtdGFibGVgLlxuICAgKlxuICAgKiBFeGlzdGVtIGR1YXMgbWFuZWlyYXMgZGUgY3VzdG9taXphciBvIGNvbXBvbmVudGUsIHBhc3NhbmRvIHVtIG9iamV0byBjb20gdG9kYXMgYXMgbGl0ZXJhaXMgZGlzcG9uw612ZWlzOlxuICAgKlxuICAgKiBgYGBcbiAgICogIGNvbnN0IGN1c3RvbUxpdGVyYWxzOiBQb1BhZ2VEeW5hbWljU2VhcmNoTGl0ZXJhbHMgPSB7XG4gICAqICAgIGRpc2NsYWltZXJHcm91cFRpdGxlOiAnRmlsdHJvcyBhcGxpY2Fkb3M6JyxcbiAgICogICAgZmlsdGVyVGl0bGU6ICdGaWx0cm8gYXZhbsOnYWRvJyxcbiAgICogICAgZmlsdGVyQ2FuY2VsTGFiZWw6ICdGZWNoYXInLFxuICAgKiAgICBmaWx0ZXJDb25maXJtTGFiZWw6ICdBcGxpY2FyJyxcbiAgICogICAgcXVpY2tTZWFyY2hMYWJlbDogJ1ZhbG9yIHBlc3F1aXNhZG86JyxcbiAgICogICAgc2VhcmNoUGxhY2Vob2xkZXI6ICdQZXNxdWlzZSBhcXVpJ1xuICAgKiAgfTtcbiAgICogYGBgXG4gICAqXG4gICAqIE91IHBhc3NhbmRvIGFwZW5hcyBhcyBsaXRlcmFpcyBxdWUgZGVzZWphIGN1c3RvbWl6YXI6XG4gICAqXG4gICAqIGBgYFxuICAgKiAgY29uc3QgY3VzdG9tTGl0ZXJhbHM6IFBvUGFnZUR5bmFtaWNTZWFyY2hMaXRlcmFscyA9IHtcbiAgICogICAgZmlsdGVyVGl0bGU6ICdGaWx0cm8gYXZhbsOnYWRvJ1xuICAgKiAgfTtcbiAgICogYGBgXG4gICAqXG4gICAqIEUgcGFyYSBjYXJyZWdhciBhcyBsaXRlcmFpcyBjdXN0b21pemFkYXMsIGJhc3RhIGFwZW5hcyBwYXNzYXIgbyBvYmpldG8gcGFyYSBvIGNvbXBvbmVudGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8cG8tcGFnZS1keW5hbWljLXRhYmxlXG4gICAqICAgW3AtbGl0ZXJhbHNdPVwiY3VzdG9tTGl0ZXJhbHNcIj5cbiAgICogPC9wby1wYWdlLWR5bmFtaWMtdGFibGU+XG4gICAqIGBgYFxuICAgKlxuICAgKiA+IE8gdmFsb3IgcGFkcsOjbyBzZXLDoSB0cmFkdXppZG8gZGUgYWNvcmRvIGNvbSBvIGlkaW9tYSBjb25maWd1cmFkbyBubyBbYFBvSTE4blNlcnZpY2VgXSgvZG9jdW1lbnRhdGlvbi9wby1pMThuKSBvdSAqYnJvd3NlciouXG4gICAqL1xuICBASW5wdXQoJ3AtbGl0ZXJhbHMnKSBzZWFyY2hMaXRlcmFsczogUG9QYWdlRHluYW1pY1NlYXJjaExpdGVyYWxzO1xuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIFJlc3BvbnPDoXZlbCBwb3IgYXBsaWNhciBlc3Bhw6dhbWVudG8gbmFzIGNvbHVuYXMuXG4gICAqXG4gICAqIERldmUgcmVjZWJlciB1bSBkb3MgdmFsb3JlcyBkbyBlbnVtIGBQb1RhYmxlQ29sdW1uU3BhY2luZ2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBtZWRpdW1gXG4gICAqL1xuICBASW5wdXQoJ3Atc3BhY2luZycpIHNldCBzcGFjaW5nKHZhbHVlOiBQb1RhYmxlQ29sdW1uU3BhY2luZykge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3NtYWxsJyB8fCB2YWx1ZSA9PT0gJ21lZGl1bScgfHwgdmFsdWUgPT09ICdsYXJnZScpIHtcbiAgICAgIHRoaXMuX3NwYWNpbmcgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3BhY2luZyA9IFBvVGFibGVDb2x1bW5TcGFjaW5nLk1lZGl1bTtcbiAgICB9XG4gIH1cblxuICBnZXQgc3BhY2luZygpIHtcbiAgICByZXR1cm4gdGhpcy5fc3BhY2luZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEhhYmlsaXRhIG91IGRlc2FiaWxpdGEgYSBxdWVicmEgYXV0b23DoXRpY2EgZGUgdGV4dG8uIFF1YW5kbyBhdGl2YWRhLCBvIHRleHRvIHF1ZSBleGNlZGVcbiAgICogbyBlc3Bhw6dvIGRpc3BvbsOtdmVsIMOpIHRyYW5zZmVyaWRvIHBhcmEgYSBwcsOzeGltYSBsaW5oYSBlbSBwb250b3MgYXByb3ByaWFkb3MgcGFyYSB1bWFcbiAgICogbGVpdHVyYSBjbGFyYS5cbiAgICpcbiAgICogPiBJbmNvbXBhdMOtdmVsIGNvbSBgdmlydHVhbC1zY3JvbGxgLCBxdWUgcmVxdWVyIGFsdHVyYSBmaXhhIG5hcyBsaW5oYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIEBJbnB1dCh7IGFsaWFzOiAncC10ZXh0LXdyYXAnLCB0cmFuc2Zvcm06IGNvbnZlcnRUb0Jvb2xlYW4gfSkgdGV4dFdyYXA/OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogSGFiaWxpdGEgbyBtb2RvIGRyYWcgYW5kIGRyb3AgcGFyYSBhcyBjb2x1bmFzIGRhIHRhYmVsYS5cbiAgICpcbiAgICovXG4gIEBJbnB1dCgncC1kcmFnZ2FibGUnKSBzZXQgZHJhZ2dhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZHJhZ2dhYmxlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgZHJhZ2dhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kcmFnZ2FibGU7XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBIYWJpbGl0YSBvIGB2aXJ0dWFsLXNjcm9sbGAgbmEgdGFiZWxhIHBhcmEgbWVsaG9yYXIgYSBwZXJmb3JtYW5jZSBjb20gZ3JhbmRlcyB2b2x1bWVzIGRlIGRhZG9zLlxuICAgKiBSZXF1ZXIgYWx0dXJhIChgcC1oZWlnaHRgKSBwYXJhIGZ1bmNpb25hciBjb3JyZXRhbWVudGUuXG4gICAqXG4gICAqID4gSW5jb21wYXTDrXZlbCBjb20gYHAtdGV4dC13cmFwYCBlIGBtYXN0ZXItZGV0YWlsYCwgcG9pcyBvIGB2aXJ0dWFsLXNjcm9sbGAgZXhpZ2UgYWx0dXJhIGZpeGEgbmFzIGxpbmhhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICBASW5wdXQoJ3AtdmlydHVhbC1zY3JvbGwnKSBzZXQgdmlydHVhbFNjcm9sbCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3ZpcnR1YWxTY3JvbGwgPSBjb252ZXJ0VG9Cb29sZWFuKHZhbHVlICYmIHRoaXMuaGVpZ2h0ID4gMCk7XG4gIH1cblxuICBnZXQgdmlydHVhbFNjcm9sbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlydHVhbFNjcm9sbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIENvbnRyb2xhIGEgdmlzaWJpbGlkYWRlIGRvcyBmaWx0cm9zIGZpeG9zIG5hIHDDoWdpbmEuXG4gICAqXG4gICAqIC0gUXVhbmRvIGB0cnVlYCAoZGVmYXVsdCksIHRvZG9zIG9zIGZpbHRyb3MsIGluY2x1aW5kbyBvcyBmaXhvcywgc8OjbyBleGliaWRvcywgcGVybWl0aW5kbyBxdWUgbyB1c3XDoXJpbyB2aXN1YWxpemUgb3MgZmlsdHJvcyBhcGxpY2Fkb3MuXG4gICAqIC0gUXVhbmRvIGBmYWxzZWAsIG9zIGZpbHRyb3MgZml4b3Mgc8OjbyBvY3VsdGFkb3MsIG7Do28gc2VuZG8gZXhpYmlkb3MgbmEgaW50ZXJmYWNlLCBtYXMgYWluZGEgc2VuZG8gYXBsaWNhZG9zIGNvbW8gZmlsdHJvcyBuYXMgcmVxdWlzacOnw7Vlcy5cbiAgICpcbiAgICogRXN0YSBwcm9wcmllZGFkZSB0cmFiYWxoYSBlbSBjb25qdW50byBjb20gYSBwcm9wcmllZGFkZSBgZml4ZWRgIGRvcyBmaWx0cm9zIGluZGl2aWR1YWlzLiBGaWx0cm9zIG1hcmNhZG9zIGNvbW8gYGZpeGVkOiB0cnVlYCBuw6NvIHNlcsOjbyBleGliaWRvcyBuYSBpbnRlcmZhY2UgZG8gZmlsdHJvIGF2YW7Dp2FkbyBxdWFuZG8gYHZpc2libGVGaXhlZEZpbHRlcnNgIGZvciBgZmFsc2VgLCBtYXMgY29udGludWFyw6NvIGEgc2VyIGFwbGljYWRvcyBkZSBmb3JtYSB0cmFuc3BhcmVudGUgYW8gdXN1w6FyaW8uIERlc3NhIGZvcm1hLCBwZXJtaXRlLXNlIG1haW9yIGZsZXhpYmlsaWRhZGUgbm8gY29udHJvbGUgZGUgcXVhaXMgZmlsdHJvcyBkZXZlbSBzZXIgdmlzw612ZWlzIGFvIHVzdcOhcmlvIG91IGRldmVtIHNlciBhcGxpY2Fkb3MgcGVybWFuZW50ZW1lbnRlIHNlbSBpbnRlcmZlcsOqbmNpYS5cbiAgICpcbiAgICogKipFeGVtcGxvIGRlIHVzbzoqKlxuICAgKiBgYGBodG1sXG4gICAqIDwhLS0gUGFyYSBvY3VsdGFyIG9zIGZpbHRyb3MgZml4b3MgLS0+XG4gICAqIDxwby1wYWdlLWR5bmFtaWMtdGFibGUgW3AtdmlzaWJsZS1maXhlZC1maWx0ZXJzXT1cImZhbHNlXCI+PC9wby1wYWdlLWR5bmFtaWMtdGFibGU+XG4gICAqIGBgYFxuICAgKi9cbiAgQElucHV0KCdwLXZpc2libGUtZml4ZWQtZmlsdGVycycpIHZpc2libGVGaXhlZEZpbHRlcnM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBwb0RpYWxvZ1NlcnZpY2U6IFBvRGlhbG9nU2VydmljZSxcbiAgICBwcml2YXRlIHBvTm90aWZpY2F0aW9uOiBQb05vdGlmaWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb1BhZ2VEeW5hbWljU2VydmljZTogUG9QYWdlRHluYW1pY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb1BhZ2VDdXN0b21pemF0aW9uU2VydmljZTogUG9QYWdlQ3VzdG9taXphdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zU2VydmljZTogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1NlcnZpY2UsXG4gICAgbGFuZ3VhZ2VTZXJ2aWNlOiBQb0xhbmd1YWdlU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZVNlcnZpY2UuZ2V0U2hvcnRMYW5ndWFnZSgpO1xuXG4gICAgdGhpcy5saXRlcmFscyA9IHtcbiAgICAgIC4uLnBvUGFnZUR5bmFtaWNUYWJsZUxpdGVyYWxzRGVmYXVsdFtwb0xvY2FsZURlZmF1bHRdLFxuICAgICAgLi4ucG9QYWdlRHluYW1pY1RhYmxlTGl0ZXJhbHNEZWZhdWx0W2xhbmd1YWdlXVxuICAgIH07XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWREYXRhRnJvbUFQSSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBvbkFkdmFuY2VkU2VhcmNoKGZpbHRlcikge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5sb2FkRGF0YSh7IHBhZ2U6IDEsIC4uLmZpbHRlciB9KS5zdWJzY3JpYmUoKSk7XG4gICAgdGhpcy5wYXJhbXMgPSBmaWx0ZXI7XG5cbiAgICBpZiAodGhpcy5rZWVwRmlsdGVycykge1xuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbmdlRGlzY2xhaW1lcnMoZGlzY2xhaW1lcnMpIHtcbiAgICBjb25zdCBmaWx0ZXIgPSB7fTtcblxuICAgIGRpc2NsYWltZXJzLmZvckVhY2goZGlzY2xhaW1lciA9PiB7XG4gICAgICBmaWx0ZXJbZGlzY2xhaW1lci5wcm9wZXJ0eV0gPSBkaXNjbGFpbWVyLnZhbHVlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbkFkdmFuY2VkU2VhcmNoKGZpbHRlcik7XG4gIH1cblxuICBvblF1aWNrU2VhcmNoKHRlcm1UeXBlZEluUXVpY2tTZWFyY2gpIHtcbiAgICBjb25zdCBxdWlja1NlYXJjaFBhcmFtID0gdGVybVR5cGVkSW5RdWlja1NlYXJjaCA/IHsgW3RoaXMucXVpY2tTZWFyY2hQYXJhbV06IHRlcm1UeXBlZEluUXVpY2tTZWFyY2ggfSA6IHt9O1xuICAgIHRoaXMucGFyYW1zID0gdGhpcy5jb25jYXRGaWx0ZXJzID8geyAuLi50aGlzLnBhcmFtcywgLi4ucXVpY2tTZWFyY2hQYXJhbSB9IDogeyAuLi5xdWlja1NlYXJjaFBhcmFtIH07XG5cbiAgICBpZiAodGhpcy5fb2xkUXVpY2tTZWFyY2hQYXJhbSBpbiB0aGlzLnBhcmFtcyAmJiB0aGlzLl9vbGRRdWlja1NlYXJjaFBhcmFtICE9PSB0aGlzLnF1aWNrU2VhcmNoUGFyYW0pIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnBhcmFtc1t0aGlzLl9vbGRRdWlja1NlYXJjaFBhcmFtXTtcbiAgICB9XG5cbiAgICB0aGlzLl9vbGRRdWlja1NlYXJjaFBhcmFtID0gdGhpcy5xdWlja1NlYXJjaFBhcmFtO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5sb2FkRGF0YSh0ZXJtVHlwZWRJblF1aWNrU2VhcmNoID8geyBwYWdlOiAxLCAuLi50aGlzLnBhcmFtcyB9IDogdW5kZWZpbmVkKS5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICBvblNvcnQoc29ydGVkQ29sdW1uOiBQb1RhYmxlQ29sdW1uU29ydCkge1xuICAgIGlmICh0aGlzLmhlaWdodCkge1xuICAgICAgY29uc3Qgb3JkZXIgPSBzb3J0ZWRDb2x1bW4udHlwZSA9PT0gJ2FzY2VuZGluZycgPyB0cnVlIDogZmFsc2U7XG4gICAgICB1dGlsLnNvcnRBcnJheU9mT2JqZWN0cyh0aGlzLml0ZW1zLCBzb3J0ZWRDb2x1bW4uY29sdW1uLnByb3BlcnR5LCBvcmRlcik7XG4gICAgfVxuICAgIHRoaXMuc29ydGVkQ29sdW1uID0gc29ydGVkQ29sdW1uO1xuICB9XG5cbiAgb25DaGFuZ2VWaXNpYmxlQ29sdW1ucyh2YWx1ZSkge1xuICAgIHRoaXMuY2hhbmdlVmlzaWJsZUNvbHVtbnMuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbkNvbHVtblJlc3RvcmVNYW5hZ2VyKHZhbHVlOiBBcnJheTxTdHJpbmc+KSB7XG4gICAgdGhpcy5jb2x1bW5SZXN0b3JlTWFuYWdlci5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uU29ydEJ5KHNvcnRlZENvbHVtbjogUG9UYWJsZUNvbHVtblNvcnQpIHtcbiAgICB0aGlzLnNvcnRCeS5lbWl0KHNvcnRlZENvbHVtbik7XG4gIH1cblxuICBzaG93TW9yZSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMubG9hZERhdGEoeyBwYWdlOiArK3RoaXMucGFnZSwgLi4udGhpcy5wYXJhbXMgfSkuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgZ2V0IGVuYWJsZVNlbGVjdGlvblRhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLmhhc0FjdGlvblJlbW92ZUFsbCB8fCB0aGlzLmhhc0N1c3RvbUFjdGlvbldpdGhTZWxlY3RhYmxlO1xuICB9XG5cbiAgZ2V0IGhhc0FjdGlvblJlbW92ZUFsbCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmFjdGlvbnMucmVtb3ZlQWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bsOnw6NvIHF1ZSByZWFsaXphIGEgYXR1YWxpemHDp8OjbyBkb3MgZGFkb3MgZGEgdGFiZWxhLlxuICAgKlxuICAgKiBQYXJhIHV0aWxpesOhLWxhIMOpIG5lY2Vzc8OhcmlvIGNhcHR1cmFyIGEgaW5zdMOibmNpYSBkbyBgcGFnZSBkeW5hbWljIHRhYmxlYCwgY29tbyBwb3IgZXhlbXBsbzpcbiAgICpcbiAgICogYGBgIGh0bWxcbiAgICogPHBvLXBhZ2UtZHluYW1pYy10YWJsZSAjZHluYW1pY1RhYmxlIFtwLXNlcnZpY2UtYXBpXT1cInNlcnZpY2VBcGlcIj48L3BvLXBhZ2UtZHluYW1pYy10YWJsZT5cbiAgICogYGBgXG4gICAqXG4gICAqIGBgYCBqYXZhc2NyaXB0XG4gICAqIGltcG9ydCB7IFBvUGFnZUR5bmFtaWNUYWJsZUNvbXBvbmVudCwgUG9EeW5hbWljRm9ybUZpZWxkIH0gZnJvbSAnQHBvLXVpL25nLWNvbXBvbmVudHMnO1xuICAgKlxuICAgKiAuLi5cbiAgICpcbiAgICogQFZpZXdDaGlsZCgnZHluYW1pY1RhYmxlJywgeyBzdGF0aWM6IHRydWUgfSkgZHluYW1pY1RhYmxlOiBQb1BhZ2VEeW5hbWljVGFibGVDb21wb25lbnQ7XG4gICAqXG4gICAqIHBhZ2VDdXN0b21BY3Rpb25zOiBBcnJheTxQb1BhZ2VEeW5hbWljVGFibGVDdXN0b21BY3Rpb24+ID0gW1xuICAgKiB7XG4gICAqICAgbGFiZWw6ICdVcGRhdGUnLFxuICAgKiAgIGFjdGlvbjogdGhpcy51cGRhdGVUYWJsZS5iaW5kKHRoaXMpLFxuICAgKiAgIGljb246ICdwaC1hcnJvd3MtY2xvY2t3aXNlJ1xuICAgKiB9XVxuICAgKlxuICAgKiB1cGRhdGVUYWJsZSgpIHtcbiAgICogICB0aGlzLmR5bmFtaWNUYWJsZS51cGRhdGVEYXRhVGFibGUoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHt7cGFnZTogbnVtYmVyLCBrZXk6IHZhbHVlIH19IGZpbHRlciBQcm9wcmllZGFkZSBwYXJhIGVudmlvIGRlIHVtIGZpbHRybyBjdXN0b21pemFkby5cbiAgICogRXhlbXBsbyBkZSBlbnZpbzpcbiAgICpcbiAgICpgYGBcbiAgICogdGhpcy5keW5hbWljVGFibGUudXBkYXRlRGF0YVRhYmxlKHtwYWdlOiAzLCBzZWFyY2g6ICdCcmFzaWwnfSk7XG4gICAqIGBgYFxuICAgKiBDYXNvIG7Do28gc2VqYSBwYXNzYWRvIHVtIGZpbHRybyBjdXN0b21pemFkbyBwYXJhIG8gbcOpdG9kbyBgdXBkYXRlRGF0YVRhYmxlYCBhIHRhYmVsYSBzZXLDoSBhdHVhbGl6YWRhIGNvbmZvcm1lIGEgcMOhZ2luYSBkbyB1bHRpbW8gaXRlbSBtb2RpZmljYWRvLlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZURhdGFUYWJsZShmaWx0ZXI/OiBhbnkpIHtcbiAgICBjb25zdCBpbmRleEl0ZW1TZWxlY3RlZCA9IHRoaXMuaXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbSA9PT0gdGhpcy5pdGVtU2VsZWN0ZWRBY3Rpb24pO1xuICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSBNYXRoLmZsb29yKGluZGV4SXRlbVNlbGVjdGVkIC8gUEFHRV9TSVpFX0RFRkFVTFQpO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlTnVtYmVyIDwgMCA/IHRoaXMuY3VycmVudFBhZ2UgOiBwYWdlTnVtYmVyICsgMTtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB9XG5cbiAgICBpZiAoZmlsdGVyKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMubG9hZERhdGEoZmlsdGVyKS5zdWJzY3JpYmUoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5sb2FkRGF0YSh7IHBhZ2U6IHRoaXMuY3VycmVudFBhZ2UsIC4uLnRoaXMucGFyYW1zIH0pLnN1YnNjcmliZSgpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbmZpcm1SZW1vdmUoXG4gICAgYWN0aW9uUmVtb3ZlOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydyZW1vdmUnXSxcbiAgICBhY3Rpb25CZWZvcmVSZW1vdmU6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ2JlZm9yZVJlbW92ZSddLFxuICAgIGl0ZW1cbiAgKSB7XG4gICAgY29uc3QgY29uZmlybU9wdGlvbnM6IFBvRGlhbG9nQ29uZmlybU9wdGlvbnMgPSB7XG4gICAgICB0aXRsZTogdGhpcy5saXRlcmFscy5jb25maXJtUmVtb3ZlVGl0bGUsXG4gICAgICBtZXNzYWdlOiB0aGlzLmxpdGVyYWxzLmNvbmZpcm1SZW1vdmVNZXNzYWdlLFxuICAgICAgY29uZmlybTogdGhpcy5yZW1vdmUuYmluZCh0aGlzLCBpdGVtLCBhY3Rpb25SZW1vdmUsIGFjdGlvbkJlZm9yZVJlbW92ZSlcbiAgICB9O1xuXG4gICAgdGhpcy5wb0RpYWxvZ1NlcnZpY2UuY29uZmlybShjb25maXJtT3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpcm1SZW1vdmVBbGwoXG4gICAgYWN0aW9uUmVtb3ZlQWxsOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydyZW1vdmUnXSxcbiAgICBhY3Rpb25CZWZvcmVSZW1vdmVBbGw6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ2JlZm9yZVJlbW92ZSddXG4gICkge1xuICAgIGNvbnN0IGNvbmZpcm1PcHRpb25zOiBQb0RpYWxvZ0NvbmZpcm1PcHRpb25zID0ge1xuICAgICAgdGl0bGU6IHRoaXMubGl0ZXJhbHMuY29uZmlybVJlbW92ZUFsbFRpdGxlLFxuICAgICAgbWVzc2FnZTogdGhpcy5saXRlcmFscy5jb25maXJtUmVtb3ZlQWxsTWVzc2FnZSxcbiAgICAgIGNvbmZpcm06IHRoaXMucmVtb3ZlQWxsLmJpbmQodGhpcywgYWN0aW9uUmVtb3ZlQWxsLCBhY3Rpb25CZWZvcmVSZW1vdmVBbGwpXG4gICAgfTtcblxuICAgIHRoaXMucG9EaWFsb2dTZXJ2aWNlLmNvbmZpcm0oY29uZmlybU9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRVbmlxdWVLZXkoaXRlbSkge1xuICAgIGNvbnN0IGtleXMgPSB1dGlsLm1hcE9iamVjdEJ5UHJvcGVydGllcyhpdGVtLCB0aGlzLmtleXMpO1xuXG4gICAgcmV0dXJuIHV0aWwudmFsdWVzRnJvbU9iamVjdChrZXlzKS5qb2luKCd8Jyk7XG4gIH1cblxuICBwcml2YXRlIGdldE9yZGVyUGFyYW0oc29ydGVkQ29sdW1uOiBQb1RhYmxlQ29sdW1uU29ydCA9IHsgdHlwZTogdW5kZWZpbmVkIH0pIHtcbiAgICBjb25zdCB7IGNvbHVtbiwgdHlwZSB9ID0gc29ydGVkQ29sdW1uO1xuXG4gICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gUG9UYWJsZUNvbHVtblNvcnRUeXBlLkRlc2NlbmRpbmcpIHtcbiAgICAgIHJldHVybiB7IG9yZGVyOiBgLSR7Y29sdW1uLnByb3BlcnR5fWAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBvcmRlcjogYCR7Y29sdW1uLnByb3BlcnR5fWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZERhdGEocGFyYW1zOiB7IHBhZ2U/OiBudW1iZXI7IHNlYXJjaD86IHN0cmluZyB9ID0ge30pIHtcbiAgICBpZiAoIXRoaXMuc2VydmljZUFwaSkge1xuICAgICAgdGhpcy5wb05vdGlmaWNhdGlvbi5lcnJvcih0aGlzLmxpdGVyYWxzLmxvYWREYXRhRXJyb3JOb3RpZmljYXRpb24pO1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIGNvbnN0IG9yZGVyUGFyYW0gPSB0aGlzLmdldE9yZGVyUGFyYW0odGhpcy5zb3J0ZWRDb2x1bW4pO1xuICAgIGNvbnN0IGRlZmF1bHRQYXJhbXM6IGFueSA9IHsgcGFnZTogMSwgcGFnZVNpemU6IFBBR0VfU0laRV9ERUZBVUxUIH07XG4gICAgY29uc3QgZnVsbFBhcmFtczogYW55ID0geyAuLi5kZWZhdWx0UGFyYW1zLCAuLi5wYXJhbXMsIC4uLm9yZGVyUGFyYW0gfTtcblxuICAgIHJldHVybiB0aGlzLnBvUGFnZUR5bmFtaWNTZXJ2aWNlLmdldFJlc291cmNlcyhmdWxsUGFyYW1zKS5waXBlKFxuICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgbGV0IG5ld0FycmF5O1xuICAgICAgICBpZiAoZnVsbFBhcmFtcy5wYWdlID09PSAxKSB7XG4gICAgICAgICAgbmV3QXJyYXkgPSByZW1vdmVEdXBsaWNhdGVJdGVtc1dpdGhBcnJheUtleShyZXNwb25zZS5pdGVtcywgcmVzcG9uc2UuaXRlbXMsIHRoaXMua2V5cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3QXJyYXkgPSByZW1vdmVEdXBsaWNhdGVJdGVtc1dpdGhBcnJheUtleSh0aGlzLml0ZW1zLCByZXNwb25zZS5pdGVtcywgdGhpcy5rZXlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLml0ZW1zID0gbmV3QXJyYXkgPyBbLi4ubmV3QXJyYXldIDogdGhpcy5pdGVtcztcbiAgICAgICAgdGhpcy5wYWdlID0gZnVsbFBhcmFtcy5wYWdlO1xuICAgICAgICB0aGlzLmhhc05leHQgPSByZXNwb25zZS5oYXNOZXh0O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNZXRhZGF0YShcbiAgICBzZXJ2aWNlQXBpRnJvbVJvdXRlOiBzdHJpbmcsXG4gICAgb25Mb2FkOiBVcmxPclBvQ3VzdG9taXphdGlvbkZ1bmN0aW9uXG4gICk6IE9ic2VydmFibGU8UG9QYWdlRHluYW1pY1RhYmxlTWV0YURhdGE+IHtcbiAgICBpZiAoc2VydmljZUFwaUZyb21Sb3V0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucG9QYWdlRHluYW1pY1NlcnZpY2UuZ2V0TWV0YWRhdGE8UG9QYWdlRHluYW1pY1RhYmxlTWV0YURhdGE+KCkucGlwZShcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICB0aGlzLmF1dG9Sb3V0ZXIgPSByZXNwb25zZS5hdXRvUm91dGVyIHx8IHRoaXMuYXV0b1JvdXRlcjtcbiAgICAgICAgICB0aGlzLmFjdGlvbnMgPSByZXNwb25zZS5hY3Rpb25zIHx8IHRoaXMuYWN0aW9ucztcbiAgICAgICAgICB0aGlzLmJyZWFkY3J1bWIgPSByZXNwb25zZS5icmVhZGNydW1iIHx8IHRoaXMuYnJlYWRjcnVtYjtcbiAgICAgICAgICB0aGlzLmZpZWxkcyA9IHJlc3BvbnNlLmZpZWxkcyB8fCB0aGlzLmZpZWxkcztcbiAgICAgICAgICB0aGlzLnRpdGxlID0gcmVzcG9uc2UudGl0bGUgfHwgdGhpcy50aXRsZTtcbiAgICAgICAgICB0aGlzLnBhZ2VDdXN0b21BY3Rpb25zID0gcmVzcG9uc2UucGFnZUN1c3RvbUFjdGlvbnMgfHwgdGhpcy5wYWdlQ3VzdG9tQWN0aW9ucztcbiAgICAgICAgICB0aGlzLnRhYmxlQ3VzdG9tQWN0aW9ucyA9IHJlc3BvbnNlLnRhYmxlQ3VzdG9tQWN0aW9ucyB8fCB0aGlzLnRhYmxlQ3VzdG9tQWN0aW9ucztcbiAgICAgICAgICB0aGlzLmtlZXBGaWx0ZXJzID0gcmVzcG9uc2Uua2VlcEZpbHRlcnMgfHwgdGhpcy5rZWVwRmlsdGVycztcbiAgICAgICAgICB0aGlzLmNvbmNhdEZpbHRlcnMgPSByZXNwb25zZS5jb25jYXRGaWx0ZXJzIHx8IHRoaXMuY29uY2F0RmlsdGVycztcbiAgICAgICAgICB0aGlzLmhpZGVSZW1vdmVBbGxEaXNjbGFpbWVyID0gcmVzcG9uc2UuaGlkZVJlbW92ZUFsbERpc2NsYWltZXIgfHwgdGhpcy5oaWRlUmVtb3ZlQWxsRGlzY2xhaW1lcjtcbiAgICAgICAgICB0aGlzLmhpZGVDbG9zZURpc2NsYWltZXJzID0gcmVzcG9uc2UuaGlkZUNsb3NlRGlzY2xhaW1lcnMgfHwgdGhpcy5oaWRlQ2xvc2VEaXNjbGFpbWVycztcbiAgICAgICAgICB0aGlzLnF1aWNrU2VhcmNoV2lkdGggPSByZXNwb25zZS5xdWlja1NlYXJjaFdpZHRoIHx8IHRoaXMucXVpY2tTZWFyY2hXaWR0aDtcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmxvYWRPcHRpb25zT25Jbml0aWFsaXplKG9uTG9hZCkpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxvYWRPcHRpb25zT25Jbml0aWFsaXplKG9uTG9hZCk7XG4gIH1cblxuICAvLyBAdG9kbyBWYWxpZGFyIHJvdGFzIG5hIG3Do28gcG9pcyBzZSBleGlzdGlyIHVtYSByb3RhICcqKicgbyBjYXRjaCBkbyBuYXZpZ2F0aW9uIG7Do28gZnVuY2lvbmEuXG4gIHByaXZhdGUgbmF2aWdhdGVUbyhcbiAgICByb3V0ZTogeyBwYXRoOiBzdHJpbmc7IGNvbXBvbmVudD87IHVybD86IHN0cmluZzsgcGFyYW1zPzogYW55IH0sXG4gICAgZm9yY2VTdG9wQXV0b1JvdXRlcjogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIGlmIChpc0V4dGVybmFsTGluayhyb3V0ZS5wYXRoKSkge1xuICAgICAgcmV0dXJuIG9wZW5FeHRlcm5hbExpbmsocm91dGUucGF0aCk7XG4gICAgfVxuXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3JvdXRlLnVybCB8fCByb3V0ZS5wYXRoXSwgeyBxdWVyeVBhcmFtczogcm91dGUucGFyYW1zIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgIGlmIChmb3JjZVN0b3BBdXRvUm91dGVyIHx8ICF0aGlzLmF1dG9Sb3V0ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJvdXRlci5jb25maWcudW5zaGlmdCg8Um91dGU+e1xuICAgICAgICBwYXRoOiByb3V0ZS5wYXRoLFxuICAgICAgICBjb21wb25lbnQ6IHJvdXRlLmNvbXBvbmVudCxcbiAgICAgICAgZGF0YTogeyBzZXJ2aWNlQXBpOiB0aGlzLnNlcnZpY2VBcGksIGF1dG9Sb3V0ZXI6IHRydWUgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubmF2aWdhdGVUbyhyb3V0ZSwgdHJ1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbmNhdGVuYXRlZFVybChjb25jYXRLZXlzOiBib29sZWFuLCB1cmw6IHN0cmluZywgc2VsZWN0ZWRJdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCBrZXlzID0gdGhpcy5rZXlzLm1hcChrZXkgPT4gZW5jb2RlVVJJQ29tcG9uZW50KHNlbGVjdGVkSXRlbVtrZXldKSkuam9pbigpO1xuICAgIHJldHVybiBjb25jYXRLZXlzID8gYCR7dXJsfS8ke2tleXN9YCA6IHVybDtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkRldGFpbChhY3Rpb246IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ2RldGFpbCddLCBpdGVtKSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmZvcm1hdFVuaXF1ZUtleShpdGVtKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5wb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zU2VydmljZVxuICAgICAgICAuYmVmb3JlRGV0YWlsKHRoaXMuYWN0aW9ucy5iZWZvcmVEZXRhaWwsIGlkLCBpdGVtKVxuICAgICAgICAuc3Vic2NyaWJlKChiZWZvcmVEZXRhaWxSZXN1bHQ6IFBvUGFnZUR5bmFtaWNUYWJsZUJlZm9yZURldGFpbCkgPT5cbiAgICAgICAgICB0aGlzLmV4ZWN1dGVEZXRhaWwoYWN0aW9uLCBiZWZvcmVEZXRhaWxSZXN1bHQsIGlkLCBpdGVtKVxuICAgICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZURldGFpbChcbiAgICBhY3Rpb246IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ2RldGFpbCddLFxuICAgIGJlZm9yZURldGFpbFJlc3VsdD86IFBvUGFnZUR5bmFtaWNUYWJsZUJlZm9yZU5ldyxcbiAgICBpZD86IHN0cmluZyxcbiAgICBpdGVtPzogYW55XG4gICkge1xuICAgIGNvbnN0IGJlZm9yZSA9IGJlZm9yZURldGFpbFJlc3VsdCA/PyB7fTtcbiAgICBjb25zdCBhbGxvd0FjdGlvbiA9IHR5cGVvZiBiZWZvcmUuYWxsb3dBY3Rpb24gPT09ICdib29sZWFuJyA/IGJlZm9yZS5hbGxvd0FjdGlvbiA6IHRydWU7XG4gICAgY29uc3QgeyBuZXdVcmwgfSA9IGJlZm9yZTtcblxuICAgIGlmIChhbGxvd0FjdGlvbiAmJiBhY3Rpb24pIHtcbiAgICAgIGlmIChuZXdVcmwpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMuZ2V0UGF0aEZyb21OZXdVcmwobmV3VXJsLCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRlVG8oeyBwYXRoIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5yZXNvbHZlVXJsKGl0ZW0sIGFjdGlvbik7XG4gICAgICAgIHRoaXMubmF2aWdhdGVUbyh7IHBhdGg6IGFjdGlvbiwgdXJsLCBjb21wb25lbnQ6IFBvUGFnZUR5bmFtaWNEZXRhaWxDb21wb25lbnQgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3Rpb24oaWQsIGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGF0aEZyb21OZXdVcmwobmV3VXJsOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChuZXdVcmwuaW5jbHVkZXMoJzppZCcpKSB7XG4gICAgICByZXR1cm4gbmV3VXJsLnJlcGxhY2UoLzppZC9nLCBpZCk7XG4gICAgfVxuICAgIHJldHVybiBuZXdVcmw7XG4gIH1cblxuICBwcml2YXRlIG9wZW5EdXBsaWNhdGUoYWN0aW9uRHVwbGljYXRlOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydkdXBsaWNhdGUnXSwgaXRlbTogYW55KSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmZvcm1hdFVuaXF1ZUtleShpdGVtKTtcbiAgICBjb25zdCBkdXBsaWNhdGVzID0gdXRpbC5yZW1vdmVLZXlzUHJvcGVydGllcyh0aGlzLmtleXMsIHV0aWwubWFwT2JqZWN0QnlQcm9wZXJ0aWVzKGl0ZW0sIHRoaXMuZHVwbGljYXRlcykpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMucG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1NlcnZpY2VcbiAgICAgICAgLmJlZm9yZUR1cGxpY2F0ZSh0aGlzLmFjdGlvbnMuYmVmb3JlRHVwbGljYXRlLCBpZCwgZHVwbGljYXRlcylcbiAgICAgICAgLnN1YnNjcmliZSgoYmVmb3JlRHVwbGljYXRlUmVzdWx0OiBQb1BhZ2VEeW5hbWljVGFibGVCZWZvcmVEdXBsaWNhdGUpID0+XG4gICAgICAgICAgdGhpcy5leGVjdXRlRHVwbGljYXRlKGFjdGlvbkR1cGxpY2F0ZSwgYmVmb3JlRHVwbGljYXRlUmVzdWx0LCBkdXBsaWNhdGVzKVxuICAgICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZUR1cGxpY2F0ZShcbiAgICBhY3Rpb25EdXBsaWNhdGU6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ2R1cGxpY2F0ZSddLFxuICAgIGJlZm9yZUR1cGxpY2F0ZVJlc3VsdDogUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlRHVwbGljYXRlLFxuICAgIGR1cGxpY2F0ZXM6IGFueVxuICApIHtcbiAgICBjb25zdCBiZWZvcmUgPSBiZWZvcmVEdXBsaWNhdGVSZXN1bHQgPz8ge307XG4gICAgY29uc3QgYWxsb3dBY3Rpb24gPSB0eXBlb2YgYmVmb3JlLmFsbG93QWN0aW9uID09PSAnYm9vbGVhbicgPyBiZWZvcmUuYWxsb3dBY3Rpb24gOiB0cnVlO1xuICAgIGNvbnN0IGJlZm9yZUR1cGxpY2F0ZVJlc291cmNlID0gYmVmb3JlLnJlc291cmNlO1xuICAgIGNvbnN0IG5ld0FjdGlvbiA9IGJlZm9yZS5uZXdVcmwgPz8gYWN0aW9uRHVwbGljYXRlO1xuXG4gICAgaWYgKGFsbG93QWN0aW9uICYmIGFjdGlvbkR1cGxpY2F0ZSkge1xuICAgICAgaWYgKHR5cGVvZiBiZWZvcmVEdXBsaWNhdGVSZXNvdXJjZSA9PT0gJ29iamVjdCcgJiYgYmVmb3JlRHVwbGljYXRlUmVzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgZHVwbGljYXRlcyA9IHV0aWwucmVtb3ZlS2V5c1Byb3BlcnRpZXModGhpcy5rZXlzLCBiZWZvcmVEdXBsaWNhdGVSZXNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgbmV3QWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvKHsgcGF0aDogbmV3QWN0aW9uLCBwYXJhbXM6IHsgZHVwbGljYXRlOiBKU09OLnN0cmluZ2lmeShkdXBsaWNhdGVzKSB9IH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3QWN0aW9uKGR1cGxpY2F0ZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb3BlbkVkaXQoYWN0aW9uRWRpdDogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1snZWRpdCddLCBpdGVtKSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmZvcm1hdFVuaXF1ZUtleShpdGVtKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNTZXJ2aWNlXG4gICAgICAgIC5iZWZvcmVFZGl0KHRoaXMuYWN0aW9ucy5iZWZvcmVFZGl0LCBpZCwgaXRlbSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKChiZWZvcmVFZGl0UmVzdWx0OiBQb1BhZ2VEeW5hbWljVGFibGVCZWZvcmVFZGl0KSA9PlxuICAgICAgICAgICAgdGhpcy5leGVjdXRlRWRpdEFjdGlvbihhY3Rpb25FZGl0LCBiZWZvcmVFZGl0UmVzdWx0LCBpdGVtLCBpZClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZUVkaXRBY3Rpb24oXG4gICAgYWN0aW9uOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydlZGl0J10sXG4gICAgYmVmb3JlRWRpdFJlc3VsdDogUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlRWRpdCxcbiAgICBpdGVtOiBhbnksXG4gICAgaWQ6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBuZXdFZGl0QWN0aW9uID0gYmVmb3JlRWRpdFJlc3VsdD8ubmV3VXJsID8/IGFjdGlvbjtcbiAgICBjb25zdCBhbGxvd0FjdGlvbiA9IGJlZm9yZUVkaXRSZXN1bHQ/LmFsbG93QWN0aW9uID8/IHRydWU7XG5cbiAgICBpZiAoIWFsbG93QWN0aW9uKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdFZGl0QWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5vcGVuRWRpdFVybChuZXdFZGl0QWN0aW9uLCBpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdXBkYXRlZEl0ZW0gPSBuZXdFZGl0QWN0aW9uKGlkLCBpdGVtKTtcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlZEl0ZW0gPT09ICdvYmplY3QnICYmIHVwZGF0ZWRJdGVtICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMubW9kaWZ5VUlUYWJsZUl0ZW0oaXRlbSwgdXRpbC5yZW1vdmVLZXlzUHJvcGVydGllcyh0aGlzLmtleXMsIHVwZGF0ZWRJdGVtKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEVNUFRZO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRWRpdFVybChwYXRoOiBzdHJpbmcsIGl0ZW0pIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJlc29sdmVVcmwoaXRlbSwgcGF0aCk7XG5cbiAgICB0aGlzLm5hdmlnYXRlVG8oeyBwYXRoLCB1cmwgfSk7XG4gIH1cblxuICBwcml2YXRlIG1vZGlmeVVJVGFibGVJdGVtKGN1cnJlbnRJdGVtLCBuZXdJdGVtVmFsdWUpIHtcbiAgICBjb25zdCB0YWJsZUl0ZW0gPSB0aGlzLml0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0gPT09IGN1cnJlbnRJdGVtKTtcbiAgICB0aGlzLml0ZW1zW3RhYmxlSXRlbV0gPSB7IC4uLmN1cnJlbnRJdGVtLCAuLi5uZXdJdGVtVmFsdWUgfTtcbiAgfVxuXG4gIHByaXZhdGUgb3Blbk5ldyhhY3Rpb25OZXc6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ25ldyddKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMucG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1NlcnZpY2VcbiAgICAgICAgLmJlZm9yZU5ldyh0aGlzLmFjdGlvbnMuYmVmb3JlTmV3KVxuICAgICAgICAuc3Vic2NyaWJlKChiZWZvcmVOZXdSZXN1bHQ6IFBvUGFnZUR5bmFtaWNUYWJsZUJlZm9yZU5ldykgPT4gdGhpcy5leGVjdXRlTmV3KGFjdGlvbk5ldywgYmVmb3JlTmV3UmVzdWx0KSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlTmV3KGFjdGlvbk5ldzogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1snbmV3J10sIGJlZm9yZU5ld1Jlc3VsdD86IFBvUGFnZUR5bmFtaWNUYWJsZUJlZm9yZU5ldykge1xuICAgIGNvbnN0IGJlZm9yZSA9IGJlZm9yZU5ld1Jlc3VsdCA/PyB7fTtcbiAgICBjb25zdCBhbGxvd0FjdGlvbiA9IHR5cGVvZiBiZWZvcmUuYWxsb3dBY3Rpb24gPT09ICdib29sZWFuJyA/IGJlZm9yZS5hbGxvd0FjdGlvbiA6IHRydWU7XG4gICAgY29uc3QgeyBuZXdVcmwgfSA9IGJlZm9yZTtcblxuICAgIGlmIChhbGxvd0FjdGlvbiAmJiBhY3Rpb25OZXcpIHtcbiAgICAgIGlmIChuZXdVcmwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGVUbyh7IHBhdGg6IG5ld1VybCB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBhY3Rpb25OZXcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRlVG8oeyBwYXRoOiBhY3Rpb25OZXcgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY3Rpb25OZXcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FzbyBleGlzdGEgbWFpcyBkZSB1bSBpZGVudGlmaWNhZG9yLCBzZXLDoSBjb25jYXRlbmFkbyBjb20gJ3wnLlxuICAgKlxuICAgKiBFeDogeyBpZDogMSwgY29tcGFueTogJ3BvJyB9XG4gICAqXG4gICAqIFBhcmEgbyBlbmRwb2ludCAvcmVzb3VyY2VzLzppZCBzZXLDoSBleGVjdXRhZGEgYSB1cmwgL3Jlc291cmNlcy8xfHBvXG4gICAqL1xuICBwcml2YXRlIHJlbW92ZShcbiAgICBpdGVtLFxuICAgIGFjdGlvblJlbW92ZTogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1sncmVtb3ZlJ10sXG4gICAgYWN0aW9uQmVmb3JlUmVtb3ZlOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydiZWZvcmVSZW1vdmUnXVxuICApIHtcbiAgICBjb25zdCB1bmlxdWVLZXkgPSB0aGlzLmZvcm1hdFVuaXF1ZUtleShpdGVtKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNTZXJ2aWNlXG4gICAgICAgIC5iZWZvcmVSZW1vdmUoYWN0aW9uQmVmb3JlUmVtb3ZlLCB1bmlxdWVLZXksIGl0ZW0pXG4gICAgICAgIC5waXBlKHN3aXRjaE1hcChiZWZvcmVSZW1vdmUgPT4gdGhpcy5kZWxldGVBY3Rpb24oaXRlbSwgYWN0aW9uUmVtb3ZlLCBiZWZvcmVSZW1vdmUpKSlcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVsZXRlQWN0aW9uKFxuICAgIGl0ZW0sXG4gICAgYWN0aW9uUmVtb3ZlOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zWydyZW1vdmUnXSxcbiAgICBiZWZvcmVSZW1vdmU6IFBvUGFnZUR5bmFtaWNUYWJsZUJlZm9yZVJlbW92ZVxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHsgYWxsb3dBY3Rpb24sIG5ld1VybCB9ID0gYmVmb3JlUmVtb3ZlIHx8IHt9O1xuICAgIGNvbnN0IGFsbG93ID0gYWxsb3dBY3Rpb24gPz8gdHJ1ZTtcblxuICAgIGlmIChhbGxvdykge1xuICAgICAgbGV0IHVuaXF1ZUtleSA9IHRoaXMuZm9ybWF0VW5pcXVlS2V5KGl0ZW0pO1xuICAgICAgY29uc3QgcmVzb3VyY2VUb1JlbW92ZUtleSA9IHRoaXMucmV0dXJuUmVzb3VyY2VzS2V5cyhbaXRlbV0pO1xuXG4gICAgICBpZiAodHlwZW9mIGFjdGlvblJlbW92ZSA9PT0gJ2Jvb2xlYW4nIHx8IG5ld1VybCkge1xuICAgICAgICB1bmlxdWVLZXkgPSBuZXdVcmwgPyB1bmRlZmluZWQgOiB1bmlxdWVLZXk7XG4gICAgICAgIHJldHVybiB0aGlzLnBvUGFnZUR5bmFtaWNTZXJ2aWNlXG4gICAgICAgICAgLmRlbGV0ZVJlc291cmNlKHVuaXF1ZUtleSwgbmV3VXJsKVxuICAgICAgICAgIC5waXBlKG1hcCgoKSA9PiB0aGlzLnJlbW92ZUZyb21VSShyZXNvdXJjZVRvUmVtb3ZlS2V5LCB0aGlzLmxpdGVyYWxzLnJlbW92ZVN1Y2Nlc3NOb3RpZmljYXRpb24pKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvZihhY3Rpb25SZW1vdmUodW5pcXVlS2V5LCBpdGVtKSkucGlwZShcbiAgICAgICAgdGFwKHJlbW92ZSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVtb3ZlSXRlbSA9IHJlbW92ZSA/PyBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUZyb21VSShyZXNvdXJjZVRvUmVtb3ZlS2V5LCB0aGlzLmxpdGVyYWxzLnJlbW92ZVN1Y2Nlc3NOb3RpZmljYXRpb24sIHJlbW92ZUl0ZW0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2Yoe30pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVGcm9tVUkoaXRlbXM6IEFycmF5PGFueT4sIG1lc3NhZ2U6IHN0cmluZywgcmVtb3ZlID0gdHJ1ZSkge1xuICAgIGlmIChyZW1vdmUgPT09IHRydWUgJiYgaXRlbXM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5yZW1vdmVMb2NhbEl0ZW1zKGl0ZW1zKTtcbiAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24uc3VjY2VzcyhtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUFsbChcbiAgICBhY3Rpb25SZW1vdmVBbGw6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ3JlbW92ZUFsbCddLFxuICAgIGFjdGlvbkJlZm9yZVJlbW92ZUFsbDogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1snYmVmb3JlUmVtb3ZlQWxsJ11cbiAgKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxSZXNvdXJjZXNLZXlzID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zS2V5cygpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNTZXJ2aWNlXG4gICAgICAgIC5iZWZvcmVSZW1vdmVBbGwoYWN0aW9uQmVmb3JlUmVtb3ZlQWxsLCBvcmlnaW5hbFJlc291cmNlc0tleXMpXG4gICAgICAgIC5waXBlKHN3aXRjaE1hcChiZWZvcmVSZW1vdmUgPT4gdGhpcy5kZWxldGVBbGxBY3Rpb24oYWN0aW9uUmVtb3ZlQWxsLCBiZWZvcmVSZW1vdmUsIG9yaWdpbmFsUmVzb3VyY2VzS2V5cykpKVxuICAgICAgICAuc3Vic2NyaWJlKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZEl0ZW1zS2V5cygpIHtcbiAgICBjb25zdCByZXNvdXJjZXMgPSB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uJHNlbGVjdGVkKTtcblxuICAgIGlmIChyZXNvdXJjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJldHVyblJlc291cmNlc0tleXMocmVzb3VyY2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmV0dXJuUmVzb3VyY2VzS2V5cyhyZXNvdXJjZXMpIHtcbiAgICByZXR1cm4gdXRpbC5tYXBBcnJheUJ5UHJvcGVydGllcyhyZXNvdXJjZXMsIHRoaXMua2V5cyk7XG4gIH1cblxuICBwcml2YXRlIGRlbGV0ZUFsbEFjdGlvbihcbiAgICBhY3Rpb25SZW1vdmVBbGw6IFBvUGFnZUR5bmFtaWNUYWJsZUFjdGlvbnNbJ3JlbW92ZUFsbCddLFxuICAgIGJlZm9yZVJlbW92ZUFsbDogUG9QYWdlRHluYW1pY1RhYmxlQmVmb3JlUmVtb3ZlQWxsLFxuICAgIG9yaWdpbmFsUmVzb3VyY2VzOiBBcnJheTxhbnk+XG4gICkge1xuICAgIGNvbnN0IHsgYWxsb3dBY3Rpb24sIG5ld1VybCwgcmVzb3VyY2VzIH0gPSBiZWZvcmVSZW1vdmVBbGwgPz8ge307XG4gICAgY29uc3QgYWxsb3cgPSBhbGxvd0FjdGlvbiA/PyB0cnVlO1xuICAgIGNvbnN0IHJlc291cmNlc3RvRGVsZXRlID0gcmVzb3VyY2VzID8/IG9yaWdpbmFsUmVzb3VyY2VzO1xuXG4gICAgaWYgKGFsbG93ICYmIEFycmF5LmlzQXJyYXkocmVzb3VyY2VzdG9EZWxldGUpKSB7XG4gICAgICBpZiAodHlwZW9mIGFjdGlvblJlbW92ZUFsbCA9PT0gJ2Jvb2xlYW4nIHx8IG5ld1VybCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb1BhZ2VEeW5hbWljU2VydmljZS5kZWxldGVSZXNvdXJjZXMocmVzb3VyY2VzdG9EZWxldGUsIG5ld1VybCkucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVGcm9tVUkocmVzb3VyY2VzdG9EZWxldGUsIHRoaXMubGl0ZXJhbHMucmVtb3ZlQWxsU3VjY2Vzc05vdGlmaWNhdGlvbik7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvZihhY3Rpb25SZW1vdmVBbGwocmVzb3VyY2VzdG9EZWxldGUpKS5waXBlKFxuICAgICAgICB0YXAocmVtb3ZlSXRlbXMgPT4gdGhpcy5yZW1vdmVGcm9tVUkocmVtb3ZlSXRlbXMsIHRoaXMubGl0ZXJhbHMucmVtb3ZlU3VjY2Vzc05vdGlmaWNhdGlvbikpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBvZih7fSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUxvY2FsSXRlbXMoaXRlbXNLZXlzVG9SZW1vdmUgPSBbXSkge1xuICAgIGlmIChpdGVtc0tleXNUb1JlbW92ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgY29uc3QgaXRlbUtleSA9IHRoaXMuZm9ybWF0VW5pcXVlS2V5KGl0ZW0pO1xuICAgICAgICByZXR1cm4gIWl0ZW1zS2V5c1RvUmVtb3ZlLmZpbmQoaXRlbUtleVRvUmVtb3ZlID0+IHV0aWwudmFsdWVzRnJvbU9iamVjdChpdGVtS2V5VG9SZW1vdmUpLmpvaW4oJ3wnKSA9PT0gaXRlbUtleSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVVcmwoaXRlbTogYW55LCBwYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCB1bmlxdWVLZXkgPSB0aGlzLmZvcm1hdFVuaXF1ZUtleShpdGVtKTtcblxuICAgIHJldHVybiBwYXRoLnJlcGxhY2UoLzppZC9nLCB1bmlxdWVLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQYWdlQWN0aW9ucyhhY3Rpb25zOiBQb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zKSB7XG4gICAgaWYgKGFjdGlvbnM/Lm5ldykge1xuICAgICAgdGhpcy5kZWZhdWx0UGFnZUFjdGlvbnMgPSBbeyBsYWJlbDogdGhpcy5saXRlcmFscy5wYWdlQWN0aW9uLCBhY3Rpb246IHRoaXMub3Blbk5ldy5iaW5kKHRoaXMsIGFjdGlvbnMubmV3KSB9XTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybUN1c3RvbUFjdGlvbnNUb1BhZ2VMaXN0QWN0aW9uKFxuICAgIGN1c3RvbUFjdGlvbnM6IEFycmF5PFBvUGFnZUR5bmFtaWNUYWJsZUN1c3RvbUFjdGlvbj5cbiAgKTogQXJyYXk8UG9QYWdlQWN0aW9uPiB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gY3VzdG9tQWN0aW9ucy5tYXAoY3VzdG9tQWN0aW9uID0+ICh7XG4gICAgICBsYWJlbDogY3VzdG9tQWN0aW9uLmxhYmVsLFxuICAgICAgYWN0aW9uOiB0aGlzLmNhbGxQYWdlQ3VzdG9tQWN0aW9uLmJpbmQodGhpcywgY3VzdG9tQWN0aW9uKSxcbiAgICAgIGRpc2FibGVkOiB0aGlzLmlzRGlzYWJsZVBhZ2VDdXN0b21BY3Rpb24uYmluZCh0aGlzLCBjdXN0b21BY3Rpb24pLFxuICAgICAgLi4uKGN1c3RvbUFjdGlvbi5pY29uICYmIHsgaWNvbjogY3VzdG9tQWN0aW9uLmljb24gfSksXG4gICAgICB2aXNpYmxlOiBjdXN0b21BY3Rpb24udmlzaWJsZVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNmb3JtVGFibGVDdXN0b21BY3Rpb25zVG9UYWJsZUFjdGlvbnMoXG4gICAgdGFibGVDdXN0b21BY3Rpb25zOiBBcnJheTxQb1BhZ2VEeW5hbWljVGFibGVDdXN0b21UYWJsZUFjdGlvbj5cbiAgKTogQXJyYXk8UG9UYWJsZUFjdGlvbj4ge1xuICAgIHJldHVybiB0YWJsZUN1c3RvbUFjdGlvbnMubWFwKHRhYmxlQ3VzdG9tQWN0aW9uID0+ICh7XG4gICAgICBsYWJlbDogdGFibGVDdXN0b21BY3Rpb24ubGFiZWwsXG4gICAgICBpY29uOiB0YWJsZUN1c3RvbUFjdGlvbi5pY29uLFxuICAgICAgYWN0aW9uOiB0aGlzLmNhbGxUYWJsZUN1c3RvbUFjdGlvbi5iaW5kKHRoaXMsIHRhYmxlQ3VzdG9tQWN0aW9uKSxcbiAgICAgIGRpc2FibGVkOiB0YWJsZUN1c3RvbUFjdGlvbi5kaXNhYmxlZCxcbiAgICAgIHZpc2libGU6IHRhYmxlQ3VzdG9tQWN0aW9uLnZpc2libGVcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGlzRGlzYWJsZVBhZ2VDdXN0b21BY3Rpb24oY3VzdG9tQWN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGN1c3RvbUFjdGlvbi5zZWxlY3RhYmxlICYmICF0aGlzLmdldFNlbGVjdGVkSXRlbXNLZXlzKCk7XG4gIH1cblxuICBwcml2YXRlIGNhbGxQYWdlQ3VzdG9tQWN0aW9uKGN1c3RvbUFjdGlvbjogUG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tQWN0aW9uKSB7XG4gICAgaWYgKGN1c3RvbUFjdGlvbi5hY3Rpb24pIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBjdXN0b21BY3Rpb24uc2VsZWN0YWJsZSA/IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtc0tleXMoKSA6IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3Qgc2VuZEN1c3RvbUFjdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucG9QYWdlRHluYW1pY1RhYmxlQWN0aW9uc1NlcnZpY2VcbiAgICAgICAgLmN1c3RvbUFjdGlvbihjdXN0b21BY3Rpb24uYWN0aW9uLCBzZWxlY3RlZEl0ZW1zKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoc2VuZEN1c3RvbUFjdGlvblN1YnNjcmlwdGlvbik7XG4gICAgfSBlbHNlIGlmIChjdXN0b21BY3Rpb24udXJsKSB7XG4gICAgICB0aGlzLm5hdmlnYXRlVG8oeyBwYXRoOiBjdXN0b21BY3Rpb24udXJsIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FsbFRhYmxlQ3VzdG9tQWN0aW9uKGN1c3RvbUFjdGlvbjogUG9QYWdlRHluYW1pY1RhYmxlQ3VzdG9tVGFibGVBY3Rpb24sIHNlbGVjdGVkSXRlbSkge1xuICAgIHRoaXMuaXRlbVNlbGVjdGVkQWN0aW9uID0gc2VsZWN0ZWRJdGVtO1xuICAgIGlmIChjdXN0b21BY3Rpb24uYWN0aW9uKSB7XG4gICAgICBjb25zdCBzZW5kQ3VzdG9tQWN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5wb1BhZ2VEeW5hbWljVGFibGVBY3Rpb25zU2VydmljZVxuICAgICAgICAuY3VzdG9tQWN0aW9uKGN1c3RvbUFjdGlvbi5hY3Rpb24sIHNlbGVjdGVkSXRlbSlcbiAgICAgICAgLnN1YnNjcmliZSh1cGRhdGVkSXRlbSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB1cGRhdGVkSXRlbSA9PT0gJ29iamVjdCcgJiYgdXBkYXRlZEl0ZW0gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubW9kaWZ5VUlUYWJsZUl0ZW0oc2VsZWN0ZWRJdGVtLCB1dGlsLnJlbW92ZUtleXNQcm9wZXJ0aWVzKHRoaXMua2V5cywgdXBkYXRlZEl0ZW0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHNlbmRDdXN0b21BY3Rpb25TdWJzY3JpcHRpb24pO1xuICAgIH0gZWxzZSBpZiAoY3VzdG9tQWN0aW9uLnVybCkge1xuICAgICAgaWYgKGlzRXh0ZXJuYWxMaW5rKGN1c3RvbUFjdGlvbi51cmwpKSB7XG4gICAgICAgIG9wZW5FeHRlcm5hbExpbmsodGhpcy5jcmVhdGVDb25jYXRlbmF0ZWRVcmwoY3VzdG9tQWN0aW9uLmNvbmNhdEtleXMsIGN1c3RvbUFjdGlvbi51cmwsIHNlbGVjdGVkSXRlbSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvKHtcbiAgICAgICAgICBwYXRoOiB0aGlzLmNyZWF0ZUNvbmNhdGVuYXRlZFVybChjdXN0b21BY3Rpb24uY29uY2F0S2V5cywgY3VzdG9tQWN0aW9uLnVybCwgc2VsZWN0ZWRJdGVtKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFJlbW92ZUFsbEFjdGlvbigpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLl9hY3Rpb25zO1xuICAgIGlmICh0aGlzLnNob3dSZW1vdmUoYWN0aW9uLnJlbW92ZUFsbCkpIHtcbiAgICAgIHRoaXMuZGVmYXVsdFBhZ2VBY3Rpb25zID0gW1xuICAgICAgICAuLi50aGlzLl9kZWZhdWx0UGFnZUFjdGlvbnMsXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogdGhpcy5saXRlcmFscy5wYWdlQWN0aW9uUmVtb3ZlQWxsLFxuICAgICAgICAgIGFjdGlvbjogdGhpcy5jb25maXJtUmVtb3ZlQWxsLmJpbmQodGhpcywgYWN0aW9uLnJlbW92ZUFsbCwgYWN0aW9uLmJlZm9yZVJlbW92ZUFsbCksXG4gICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZVJlbW92ZUFsbC5iaW5kKHRoaXMpLFxuICAgICAgICAgIHR5cGU6ICdkYW5nZXInXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlUmVtb3ZlQWxsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5nZXRTZWxlY3RlZEl0ZW1zS2V5cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUYWJsZUFjdGlvbnMoYWN0aW9uczogUG9QYWdlRHluYW1pY1RhYmxlQWN0aW9ucykge1xuICAgIGlmIChhY3Rpb25zKSB7XG4gICAgICBjb25zdCB2aXNpYmxlUmVtb3ZlID0gdGhpcy5zaG93UmVtb3ZlKGFjdGlvbnMucmVtb3ZlKTtcbiAgICAgIHRoaXMuZGVmYXVsdFRhYmxlQWN0aW9ucyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogdGhpcy5vcGVuRGV0YWlsLmJpbmQodGhpcywgYWN0aW9ucy5kZXRhaWwpLFxuICAgICAgICAgIGxhYmVsOiB0aGlzLmxpdGVyYWxzLnRhYmxlQWN0aW9uVmlldyxcbiAgICAgICAgICB2aXNpYmxlOiAhIXRoaXMuX2FjdGlvbnMuZGV0YWlsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IHRoaXMub3BlbkVkaXQuYmluZCh0aGlzLCBhY3Rpb25zLmVkaXQpLFxuICAgICAgICAgIGxhYmVsOiB0aGlzLmxpdGVyYWxzLnRhYmxlQWN0aW9uRWRpdCxcbiAgICAgICAgICB2aXNpYmxlOiAhIXRoaXMuX2FjdGlvbnMuZWRpdFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiB0aGlzLm9wZW5EdXBsaWNhdGUuYmluZCh0aGlzLCBhY3Rpb25zLmR1cGxpY2F0ZSksXG4gICAgICAgICAgbGFiZWw6IHRoaXMubGl0ZXJhbHMudGFibGVBY3Rpb25EdXBsaWNhdGUsXG4gICAgICAgICAgdmlzaWJsZTogISF0aGlzLl9hY3Rpb25zLmR1cGxpY2F0ZVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiB0aGlzLmNvbmZpcm1SZW1vdmUuYmluZCh0aGlzLCBhY3Rpb25zLnJlbW92ZSwgYWN0aW9ucy5iZWZvcmVSZW1vdmUpLFxuICAgICAgICAgIGxhYmVsOiB0aGlzLmxpdGVyYWxzLnRhYmxlQWN0aW9uRGVsZXRlLFxuICAgICAgICAgIHNlcGFyYXRvcjogdHJ1ZSxcbiAgICAgICAgICB0eXBlOiAnZGFuZ2VyJyxcbiAgICAgICAgICB2aXNpYmxlOiB2aXNpYmxlUmVtb3ZlXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRGF0YUZyb21BUEkoKSB7XG4gICAgY29uc3QgeyBzZXJ2aWNlQXBpOiBzZXJ2aWNlQXBpRnJvbVJvdXRlLCBzZXJ2aWNlTWV0YWRhdGFBcGksIHNlcnZpY2VMb2FkQXBpIH0gPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LmRhdGE7XG5cbiAgICBjb25zdCBvbkxvYWQgPSBzZXJ2aWNlTG9hZEFwaSB8fCB0aGlzLm9uTG9hZDtcbiAgICB0aGlzLnNlcnZpY2VBcGkgPSBzZXJ2aWNlQXBpRnJvbVJvdXRlIHx8IHRoaXMuc2VydmljZUFwaTtcblxuICAgIHRoaXMucG9QYWdlRHluYW1pY1NlcnZpY2UuY29uZmlnU2VydmljZUFwaSh7IGVuZHBvaW50OiB0aGlzLnNlcnZpY2VBcGksIG1ldGFkYXRhOiBzZXJ2aWNlTWV0YWRhdGFBcGkgfSk7XG5cbiAgICBjb25zdCBtZXRhZGF0YSQgPSB0aGlzLmdldE1ldGFkYXRhKHNlcnZpY2VBcGlGcm9tUm91dGUsIG9uTG9hZCk7XG4gICAgbGV0IGRhdGEkO1xuICAgIGlmICh0aGlzLnF1aWNrU2VhcmNoVmFsdWUpIHtcbiAgICAgIGNvbnN0IHBhcmFtc1F1aWNrU2VhcmNoVmFsdWUgPSB7IFt0aGlzLnF1aWNrU2VhcmNoUGFyYW1dOiB0aGlzLnF1aWNrU2VhcmNoVmFsdWUgfTtcbiAgICAgIGRhdGEkID0gdGhpcy5sb2FkRGF0YShwYXJhbXNRdWlja1NlYXJjaFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YSQgPSB0aGlzLmxvYWREYXRhKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIG1ldGFkYXRhJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5pdGlhbEZpbHRlcnMgPSB0aGlzLmdldEluaXRpYWxWYWx1ZXNGcm9tRmlsdGVyKCk7XG5cbiAgICAgICAgICAgIGlmICghT2JqZWN0LmtleXMoaW5pdGlhbEZpbHRlcnMpLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gZGF0YSQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldEluaXRpYWxWYWx1ZXNGcm9tRmlsdGVyKCkge1xuICAgIGNvbnN0IGluaXRpYWxGaWx0ZXJzID0gdGhpcy5maWx0ZXJzLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIGl0ZW0pID0+IE9iamVjdC5hc3NpZ24ocmVzdWx0LCB7IFtpdGVtLnByb3BlcnR5XTogaXRlbS5pbml0VmFsdWUgfSksXG4gICAgICB7fVxuICAgICk7XG5cbiAgICBPYmplY3Qua2V5cyhpbml0aWFsRmlsdGVycykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKCFpbml0aWFsRmlsdGVyc1trZXldKSB7XG4gICAgICAgIGRlbGV0ZSBpbml0aWFsRmlsdGVyc1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGluaXRpYWxGaWx0ZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkT3B0aW9uc09uSW5pdGlhbGl6ZShvbkxvYWQ6IFVybE9yUG9DdXN0b21pemF0aW9uRnVuY3Rpb24pIHtcbiAgICBpZiAob25Mb2FkKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQb0R5bmFtaWNQYWdlT3B0aW9ucyhvbkxvYWQpLnBpcGUoXG4gICAgICAgIHRhcChyZXNwb25zZVBvT3B0aW9uID0+XG4gICAgICAgICAgdGhpcy5wb1BhZ2VDdXN0b21pemF0aW9uU2VydmljZS5jaGFuZ2VPcmlnaW5hbE9wdGlvbnNUb05ld09wdGlvbnModGhpcywgcmVzcG9uc2VQb09wdGlvbilcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2YobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGdldFBvRHluYW1pY1BhZ2VPcHRpb25zKG9uTG9hZDogVXJsT3JQb0N1c3RvbWl6YXRpb25GdW5jdGlvbik6IE9ic2VydmFibGU8UG9QYWdlRHluYW1pY1RhYmxlT3B0aW9ucz4ge1xuICAgIGNvbnN0IG9yaWdpbmFsT3B0aW9uOiBQb1BhZ2VEeW5hbWljVGFibGVPcHRpb25zID0ge1xuICAgICAgZmllbGRzOiB0aGlzLmZpZWxkcyxcbiAgICAgIGFjdGlvbnM6IHRoaXMuYWN0aW9ucyxcbiAgICAgIGJyZWFkY3J1bWI6IHRoaXMuYnJlYWRjcnVtYixcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAga2VlcEZpbHRlcnM6IHRoaXMua2VlcEZpbHRlcnMsXG4gICAgICBjb25jYXRGaWx0ZXJzOiB0aGlzLmNvbmNhdEZpbHRlcnMsXG4gICAgICBoaWRlUmVtb3ZlQWxsRGlzY2xhaW1lcjogdGhpcy5oaWRlUmVtb3ZlQWxsRGlzY2xhaW1lcixcbiAgICAgIGhpZGVDbG9zZURpc2NsYWltZXJzOiB0aGlzLmhpZGVDbG9zZURpc2NsYWltZXJzLFxuICAgICAgcGFnZUN1c3RvbUFjdGlvbnM6IHRoaXMucGFnZUN1c3RvbUFjdGlvbnMsXG4gICAgICB0YWJsZUN1c3RvbUFjdGlvbnM6IHRoaXMudGFibGVDdXN0b21BY3Rpb25zLFxuICAgICAgcXVpY2tTZWFyY2hXaWR0aDogdGhpcy5xdWlja1NlYXJjaFdpZHRoXG4gICAgfTtcblxuICAgIGNvbnN0IHBhZ2VPcHRpb25TY2hlbWE6IFBvUGFnZUR5bmFtaWNPcHRpb25zU2NoZW1hPFBvUGFnZUR5bmFtaWNUYWJsZU9wdGlvbnM+ID0ge1xuICAgICAgc2NoZW1hOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lUHJvcDogJ2ZpZWxkcycsXG4gICAgICAgICAgbWVyZ2U6IHRydWUsXG4gICAgICAgICAga2V5Rm9yTWVyZ2U6ICdwcm9wZXJ0eSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWVQcm9wOiAnYWN0aW9ucycsXG4gICAgICAgICAgbWVyZ2U6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWVQcm9wOiAnYnJlYWRjcnVtYidcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWVQcm9wOiAndGl0bGUnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lUHJvcDogJ2tlZXBGaWx0ZXJzJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZVByb3A6ICdxdWlja1NlYXJjaFdpZHRoJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZVByb3A6ICdjb25jYXRGaWx0ZXJzJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZVByb3A6ICdoaWRlUmVtb3ZlQWxsRGlzY2xhaW1lcidcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWVQcm9wOiAnaGlkZUNsb3NlRGlzY2xhaW1lcnMnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lUHJvcDogJ3BhZ2VDdXN0b21BY3Rpb25zJyxcbiAgICAgICAgICBtZXJnZTogdHJ1ZSxcbiAgICAgICAgICBrZXlGb3JNZXJnZTogJ2xhYmVsJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZVByb3A6ICd0YWJsZUN1c3RvbUFjdGlvbnMnLFxuICAgICAgICAgIG1lcmdlOiB0cnVlLFxuICAgICAgICAgIGtleUZvck1lcmdlOiAnbGFiZWwnXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucG9QYWdlQ3VzdG9taXphdGlvblNlcnZpY2UuZ2V0Q3VzdG9tT3B0aW9ucyhvbkxvYWQsIG9yaWdpbmFsT3B0aW9uLCBwYWdlT3B0aW9uU2NoZW1hKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd1JlbW92ZTxUPihhY3Rpb25SZW1vdmU6IFQpOiBib29sZWFuIHtcbiAgICBjb25zdCBhY3Rpb24gPSBhY3Rpb25SZW1vdmUgPz8gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiBhY3Rpb24gPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIGFjdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbHRlclZhbHVlKGZpbHRlcikge1xuICAgIHJldHVybiB0aGlzLmZpZWxkcy5tYXAoaXRlbSA9PiB7XG4gICAgICBpZiAoZmlsdGVyLmhhc093blByb3BlcnR5KGl0ZW0ucHJvcGVydHkpKSB7XG4gICAgICAgIGl0ZW0uaW5pdFZhbHVlID0gZmlsdGVyW2l0ZW0ucHJvcGVydHldO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYWdlQWN0aW9ucygpIHtcbiAgICB0aGlzLnBhZ2VBY3Rpb25zID0gWy4uLnRoaXMuX2RlZmF1bHRQYWdlQWN0aW9ucywgLi4udGhpcy5fY3VzdG9tUGFnZUxpc3RBY3Rpb25zXTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGFibGVBY3Rpb25zKCkge1xuICAgIGNvbnN0IGRlZmF1bHRUYWJsZUFjdGlvbnNXaXRob3V0QWN0aW9uRGVsZXRlID0gdGhpcy5fZGVmYXVsdFRhYmxlQWN0aW9ucy5maWx0ZXIoXG4gICAgICB0YWJsZUFjdGlvbiA9PiB0YWJsZUFjdGlvbi5sYWJlbCAhPT0gdGhpcy5saXRlcmFscy50YWJsZUFjdGlvbkRlbGV0ZVxuICAgICk7XG5cbiAgICBjb25zdCB0YWJsZUFjdGlvbkRlbGV0ZSA9IHRoaXMuX2RlZmF1bHRUYWJsZUFjdGlvbnMuZmluZChcbiAgICAgIHRhYmxlQWN0aW9uID0+IHRhYmxlQWN0aW9uLmxhYmVsID09PSB0aGlzLmxpdGVyYWxzLnRhYmxlQWN0aW9uRGVsZXRlXG4gICAgKTtcblxuICAgIGNvbnN0IG5ld1RhYmxlQWN0aW9ucyA9IFsuLi5kZWZhdWx0VGFibGVBY3Rpb25zV2l0aG91dEFjdGlvbkRlbGV0ZSwgLi4udGhpcy5fY3VzdG9tVGFibGVBY3Rpb25zXTtcblxuICAgIGlmICh0YWJsZUFjdGlvbkRlbGV0ZSkge1xuICAgICAgbmV3VGFibGVBY3Rpb25zLnB1c2godGFibGVBY3Rpb25EZWxldGUpO1xuICAgIH1cblxuICAgIHRoaXMudGFibGVBY3Rpb25zID0gbmV3VGFibGVBY3Rpb25zO1xuICB9XG59XG4iLCI8cG8tcGFnZS1keW5hbWljLXNlYXJjaFxuICBbcC1hY3Rpb25zXT1cInBhZ2VBY3Rpb25zXCJcbiAgW3AtYnJlYWRjcnVtYl09XCJicmVhZGNydW1iXCJcbiAgW3AtaGlkZS1jbG9zZS1kaXNjbGFpbWVyc109XCJoaWRlQ2xvc2VEaXNjbGFpbWVyc1wiXG4gIFtwLWZpbHRlcnNdPVwiZmlsdGVyc1wiXG4gIFtwLWtlZXAtZmlsdGVyc109XCJrZWVwRmlsdGVyc1wiXG4gIFtwLWxpdGVyYWxzXT1cInNlYXJjaExpdGVyYWxzXCJcbiAgW3AtY29uY2F0LWZpbHRlcnNdPVwiY29uY2F0RmlsdGVyc1wiXG4gIFtwLWhpZGUtcmVtb3ZlLWFsbC1kaXNjbGFpbWVyXT1cImhpZGVSZW1vdmVBbGxEaXNjbGFpbWVyXCJcbiAgW3AtcXVpY2stc2VhcmNoLXdpZHRoXT1cInF1aWNrU2VhcmNoV2lkdGhcIlxuICBbcC10aXRsZV09XCJ0aXRsZVwiXG4gIFtwLXZpc2libGUtZml4ZWQtZmlsdGVyc109XCJ2aXNpYmxlRml4ZWRGaWx0ZXJzXCJcbiAgKHAtYWR2YW5jZWQtc2VhcmNoKT1cIm9uQWR2YW5jZWRTZWFyY2goJGV2ZW50KVwiXG4gIChwLWNoYW5nZS1kaXNjbGFpbWVycyk9XCJvbkNoYW5nZURpc2NsYWltZXJzKCRldmVudClcIlxuICAocC1xdWljay1zZWFyY2gpPVwib25RdWlja1NlYXJjaCgkZXZlbnQpXCJcbiAgW3AtcXVpY2stc2VhcmNoLXZhbHVlXT1cInF1aWNrU2VhcmNoVmFsdWUgfHwgJydcIlxuPlxuICA8cG8tdGFibGVcbiAgICBbcC1zb3J0XT1cInRydWVcIlxuICAgIFtwLWFjdGlvbnNdPVwidGFibGVBY3Rpb25zXCJcbiAgICBbcC1hY3Rpb25zLXJpZ2h0XT1cImFjdGlvblJpZ2h0XCJcbiAgICBbcC1zZWxlY3RhYmxlXT1cImVuYWJsZVNlbGVjdGlvblRhYmxlXCJcbiAgICBbcC1jb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgIFtwLWl0ZW1zXT1cIml0ZW1zXCJcbiAgICBbcC1oZWlnaHRdPVwiaGVpZ2h0XCJcbiAgICBbcC1oaWRlLWNvbHVtbnMtbWFuYWdlcl09XCJoaWRlQ29sdW1uc01hbmFnZXJcIlxuICAgIFtwLWluZmluaXRlLXNjcm9sbF09XCJpbmZpbml0ZVNjcm9sbFwiXG4gICAgW3Atc2hvdy1tb3JlLWRpc2FibGVkXT1cIiFoYXNOZXh0XCJcbiAgICAocC1zaG93LW1vcmUpPVwic2hvd01vcmUoKVwiXG4gICAgKHAtc29ydC1ieSk9XCJvblNvcnQoJGV2ZW50KVwiXG4gICAgKHAtY2hhbmdlLXZpc2libGUtY29sdW1ucyk9XCJvbkNoYW5nZVZpc2libGVDb2x1bW5zKCRldmVudClcIlxuICAgIChwLXJlc3RvcmUtY29sdW1uLW1hbmFnZXIpPVwib25Db2x1bW5SZXN0b3JlTWFuYWdlcigkZXZlbnQpXCJcbiAgICAocC1zb3J0LWJ5KT1cIm9uU29ydEJ5KCRldmVudClcIlxuICAgIFtwLXRleHQtd3JhcF09XCJ0ZXh0V3JhcFwiXG4gICAgW3AtZHJhZ2dhYmxlXT1cImRyYWdnYWJsZVwiXG4gICAgW3Atc3BhY2luZ109XCJzcGFjaW5nXCJcbiAgICBbcC12aXJ0dWFsLXNjcm9sbF09XCJ2aXJ0dWFsU2Nyb2xsXCJcbiAgPlxuICA8L3BvLXRhYmxlPlxuPC9wby1wYWdlLWR5bmFtaWMtc2VhcmNoPlxuIl19
|