@decaf-ts/for-angular 0.0.9 → 0.0.11

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.
Files changed (28) hide show
  1. package/dist/lib/components/empty-state/empty-state.component.d.ts +3 -3
  2. package/dist/lib/components/fieldset/fieldset.component.d.ts +1 -1
  3. package/dist/lib/components/filter/filter.component.d.ts +2 -2
  4. package/dist/lib/components/layout/layout.component.d.ts +2 -2
  5. package/dist/lib/components/list/list.component.d.ts +3 -3
  6. package/dist/lib/components/list-item/list-item.component.d.ts +3 -3
  7. package/dist/lib/components/model-renderer/model-renderer.component.d.ts +1 -1
  8. package/dist/lib/components/pagination/constants.d.ts +1 -1
  9. package/dist/lib/components/pagination/pagination.component.d.ts +2 -2
  10. package/dist/lib/components/searchbar/searchbar.component.d.ts +2 -2
  11. package/dist/lib/engine/NgxBaseComponent.d.ts +1 -1
  12. package/dist/lib/esm2022/components/component-renderer/component-renderer.component.mjs +3 -3
  13. package/dist/lib/esm2022/components/crud-field/crud-field.component.mjs +2 -2
  14. package/dist/lib/esm2022/components/crud-form/crud-form.component.mjs +2 -2
  15. package/dist/lib/esm2022/components/empty-state/empty-state.component.mjs +5 -5
  16. package/dist/lib/esm2022/components/fieldset/fieldset.component.mjs +4 -4
  17. package/dist/lib/esm2022/components/filter/filter.component.mjs +5 -5
  18. package/dist/lib/esm2022/components/layout/layout.component.mjs +3 -3
  19. package/dist/lib/esm2022/components/list/list.component.mjs +5 -5
  20. package/dist/lib/esm2022/components/list-item/list-item.component.mjs +6 -6
  21. package/dist/lib/esm2022/components/model-renderer/model-renderer.component.mjs +2 -2
  22. package/dist/lib/esm2022/components/pagination/constants.mjs +1 -1
  23. package/dist/lib/esm2022/components/pagination/pagination.component.mjs +4 -4
  24. package/dist/lib/esm2022/components/searchbar/searchbar.component.mjs +5 -5
  25. package/dist/lib/esm2022/engine/NgxBaseComponent.mjs +2 -3
  26. package/dist/lib/fesm2022/decaf-ts-for-angular.mjs +3029 -3036
  27. package/dist/lib/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
  28. package/package.json +4 -2
@@ -1,6 +1,5 @@
1
1
  import { Input, Component, Inject, ViewChild, ElementRef, Output, EventEmitter, } from '@angular/core';
2
- import { getInjectablesRegistry, getLocaleFromClassName, } from 'src/lib/helpers/utils';
3
- import { stringToBoolean } from 'src/lib/helpers/utils';
2
+ import { getInjectablesRegistry, getLocaleFromClassName, stringToBoolean } from '../helpers/utils';
4
3
  import { Model } from '@decaf-ts/decorator-validation';
5
4
  import { InternalError, OperationKeys } from '@decaf-ts/db-decorators';
6
5
  import { BaseComponentProps } from './constants';
@@ -537,4 +536,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
537
536
  }], listenEvent: [{
538
537
  type: Output
539
538
  }] } });
540
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmd4QmFzZUNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL05neEJhc2VDb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLEtBQUssRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFNBQVMsRUFDVCxVQUFVLEVBR1YsTUFBTSxFQUNOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHNCQUFzQixHQUN2QixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUVMLGFBQWEsRUFDYixhQUFhLEVBQ2QsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWxELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFNUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2REc7QUFLSCxNQUFNLE9BQWdCLGdCQUFnQjtJQXNTcEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWlDRztJQUNILHlEQUF5RDtJQUN6RCxZQUF5RCxRQUFnQjtRQUFoQixhQUFRLEdBQVIsUUFBUSxDQUFRO1FBaFF6RTs7Ozs7Ozs7Ozs7V0FXRztRQUVILFVBQUssR0FBNEIsRUFBRSxDQUFDO1FBRXBDOzs7Ozs7Ozs7OztXQVdHO1FBRUgsU0FBSSxHQUE0QixFQUFF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cG9ydCB7XG4gIElucHV0LFxuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEtleVZhbHVlLCBSZW5kZXJlckN1c3RvbUV2ZW50LCBTdHJpbmdPckJvb2xlYW4gfSBmcm9tICdzcmMvbGliL2VuZ2luZS90eXBlcyc7XG5pbXBvcnQge1xuICBnZXRJbmplY3RhYmxlc1JlZ2lzdHJ5LFxuICBnZXRMb2NhbGVGcm9tQ2xhc3NOYW1lLFxufSBmcm9tICdzcmMvbGliL2hlbHBlcnMvdXRpbHMnO1xuaW1wb3J0IHsgc3RyaW5nVG9Cb29sZWFuIH0gZnJvbSAnc3JjL2xpYi9oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSAnQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uJztcbmltcG9ydCB7XG4gIENydWRPcGVyYXRpb25zLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzXG59IGZyb20gJ0BkZWNhZi10cy9kYi1kZWNvcmF0b3JzJztcbmltcG9ydCB7IEJhc2VDb21wb25lbnRQcm9wcyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IE5neFJlbmRlcmluZ0VuZ2luZTIgfSBmcm9tICcuL05neFJlbmRlcmluZ0VuZ2luZTInO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGRlY2FmLXRzL2xvZ2dpbmcnO1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi4vZm9yLWFuZ3VsYXIubW9kdWxlJztcbmltcG9ydCB7IERlY2FmUmVwb3NpdG9yeSB9IGZyb20gJy4uL2NvbXBvbmVudHMvbGlzdC9jb25zdGFudHMnO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gJ0BkZWNhZi10cy9jb3JlJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBjb21wb25lbnQgY2xhc3MgdGhhdCBwcm92aWRlcyBjb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgYWxsIERlY2FmIGNvbXBvbmVudHMuXG4gKiBAc3VtbWFyeSBUaGUgTmd4QmFzZUNvbXBvbmVudCBzZXJ2ZXMgYXMgdGhlIGZvdW5kYXRpb24gZm9yIGFsbCBEZWNhZiBVSSBjb21wb25lbnRzLCBwcm92aWRpbmdcbiAqIHNoYXJlZCBmdW5jdGlvbmFsaXR5IGZvciBsb2NhbGl6YXRpb24sIGVsZW1lbnQgcmVmZXJlbmNlcywgYW5kIHN0eWxpbmcuIFRoaXMgYWJzdHJhY3QgY2xhc3NcbiAqIGltcGxlbWVudHMgY29tbW9uIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgdGhhdCBhcmUgdXNlZCBhY3Jvc3MgdGhlIGNvbXBvbmVudCBsaWJyYXJ5LCBlbnN1cmluZ1xuICogY29uc2lzdGVudCBiZWhhdmlvciBhbmQgcmVkdWNpbmcgY29kZSBkdXBsaWNhdGlvbi4gQ29tcG9uZW50cyB0aGF0IGV4dGVuZCB0aGlzIGNsYXNzIGluaGVyaXRcbiAqIGl0cyBjYXBhYmlsaXRpZXMgZm9yIGhhbmRsaW5nIHRyYW5zbGF0aW9ucywgYWNjZXNzaW5nIERPTSBlbGVtZW50cywgYW5kIGFwcGx5aW5nIGN1c3RvbSBzdHlsaW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCB0aGlzIGNvbXBvbmVudCB3b3JrcyB3aXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5zdGFuY2UgLSBUaGUgY29tcG9uZW50IGluc3RhbmNlIHRva2VuIHVzZWQgZm9yIGlkZW50aWZpY2F0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxlIC0gVGhlIGxvY2FsZSB0byBiZSB1c2VkIGZvciB0cmFuc2xhdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nT3JCb29sZWFufSB0cmFuc2xhdGFibGUgLSBXaGV0aGVyIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHRyYW5zbGF0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgLSBBZGRpdGlvbmFsIENTUyBjbGFzc2VzIHRvIGFwcGx5IHRvIHRoZSBjb21wb25lbnRcbiAqIEBwYXJhbSB7XCJpb3NcIiB8IFwibWRcIiB8IHVuZGVmaW5lZH0gbW9kZSAtIENvbXBvbmVudCBwbGF0Zm9ybSBzdHlsZVxuICpcbiAqIEBjb21wb25lbnQgTmd4QmFzZUNvbXBvbmVudFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2FwcC1teS1jb21wb25lbnQnLFxuICogICB0ZW1wbGF0ZVVybDogJy4vbXktY29tcG9uZW50LmNvbXBvbmVudC5odG1sJyxcbiAqICAgc3R5bGVVcmxzOiBbJy4vbXktY29tcG9uZW50LmNvbXBvbmVudC5zY3NzJ11cbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBOZ3hCYXNlQ29tcG9uZW50IHtcbiAqICAgY29uc3RydWN0b3IoQEluamVjdCgnaW5zdGFuY2VUb2tlbicpIGluc3RhbmNlOiBzdHJpbmcpIHtcbiAqICAgICBzdXBlcihpbnN0YW5jZSk7XG4gKiAgIH1cbiAqXG4gKiAgIG5nT25Jbml0KCkge1xuICogICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICogICAgIC8vIENvbXBvbmVudC1zcGVjaWZpYyBpbml0aWFsaXphdGlvblxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwIGFzIEFwcGxpY2F0aW9uXG4gKiAgIHBhcnRpY2lwYW50IENvbXAgYXMgQ29tcG9uZW50XG4gKiAgIHBhcnRpY2lwYW50IEJhc2UgYXMgTmd4QmFzZUNvbXBvbmVudFxuICogICBwYXJ0aWNpcGFudCBFbmdpbmUgYXMgTmd4UmVuZGVyaW5nRW5naW5lMlxuICpcbiAqICAgQXBwLT4+Q29tcDogQ3JlYXRlIGNvbXBvbmVudFxuICogICBDb21wLT4+QmFzZTogc3VwZXIoaW5zdGFuY2UpXG4gKiAgIEJhc2UtPj5CYXNlOiBTZXQgY29tcG9uZW50TmFtZSAmIGNvbXBvbmVudExvY2FsZVxuICpcbiAqICAgQXBwLT4+Q29tcDogU2V0IEBJbnB1dCBwcm9wZXJ0aWVzXG4gKiAgIENvbXAtPj5CYXNlOiBuZ09uQ2hhbmdlcyhjaGFuZ2VzKVxuICpcbiAqICAgYWx0IG1vZGVsIGNoYW5nZWRcbiAqICAgICBCYXNlLT4+QmFzZTogZ2V0TW9kZWwobW9kZWwpXG4gKiAgICAgQmFzZS0+PkVuZ2luZTogZ2V0RGVjb3JhdG9ycyhtb2RlbCwge30pXG4gKiAgICAgRW5naW5lLS0+PkJhc2U6IFJldHVybiBkZWNvcmF0b3IgbWV0YWRhdGFcbiAqICAgICBCYXNlLT4+QmFzZTogQ29uZmlndXJlIG1hcHBlciBhbmQgaXRlbVxuICogICAgIEJhc2UtPj5CYXNlOiBnZXRMb2NhbGUodHJhbnNsYXRhYmxlKVxuICogICBlbHNlIGxvY2FsZS90cmFuc2xhdGFibGUgY2hhbmdlZFxuICogICAgIEJhc2UtPj5CYXNlOiBnZXRMb2NhbGUodHJhbnNsYXRhYmxlKVxuICogICBlbmRcbiAqXG4gKiAgIEFwcC0+PkNvbXA6IG5nT25Jbml0KClcbiAqICAgQ29tcC0+PkJhc2U6IGluaXRpYWxpemUoKVxuICogICBCYXNlLT4+QmFzZTogU2V0IGluaXRpYWxpemVkIGZsYWdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlOiAnJyxcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTmd4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNlIHRvIHRoZSBjb21wb25lbnQncyBlbGVtZW50LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBuYXRpdmUgRE9NIGVsZW1lbnQgb2YgdGhlIGNvbXBvbmVudCB0aHJvdWdoIEFuZ3VsYXInc1xuICAgKiBWaWV3Q2hpbGQgZGVjb3JhdG9yLiBUaGlzIHJlZmVyZW5jZSBjYW4gYmUgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBET00gZWxlbWVudCBkaXJlY3RseSxcbiAgICogYXBwbHkgY3VzdG9tIHN0eWxlcywgb3IgYWNjZXNzIG5hdGl2ZSBlbGVtZW50IHByb3BlcnRpZXMgYW5kIG1ldGhvZHMuIFRoZSBlbGVtZW50IGlzXG4gICAqIGlkZW50aWZpZWQgYnkgdGhlICdjb21wb25lbnQnIHRlbXBsYXRlIHJlZmVyZW5jZSB2YXJpYWJsZS5cbiAgICpcbiAgICogQHR5cGUge0VsZW1lbnRSZWZ9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBAVmlld0NoaWxkKCdjb21wb25lbnQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICBjb21wb25lbnQhOiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQsIHdoaWNoIGlzIHR5cGljYWxseSBkZXJpdmVkIGZyb20gdGhlIGNsYXNzIG5hbWUuXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBpbnRlcm5hbGx5IGZvciB2YXJpb3VzIHB1cnBvc2VzIHN1Y2ggYXMgbG9nZ2luZywgZGVyaXZpbmcgdGhlIGRlZmF1bHRcbiAgICogbG9jYWxlLCBhbmQgcG90ZW50aWFsbHkgZm9yIGNvbXBvbmVudCBpZGVudGlmaWNhdGlvbiBpbiBkZWJ1Z2dpbmcgb3IgZXJyb3IgcmVwb3J0aW5nLlxuICAgKlxuICAgKiBUaGUgYGNvbXBvbmVudE5hbWVgIGlzIHNldCBkdXJpbmcgdGhlIGNvbXBvbmVudCdzIGluaXRpYWxpemF0aW9uIHByb2Nlc3MgYW5kIHNob3VsZCBub3RcbiAgICogYmUgbW9kaWZpZWQgZXh0ZXJuYWxseS4gSXQncyBtYXJrZWQgYXMgcHJvdGVjdGVkIHRvIGFsbG93IGFjY2VzcyBpbiBkZXJpdmVkIGNsYXNzZXMgd2hpbGVcbiAgICogcHJldmVudGluZyBkaXJlY3QgYWNjZXNzIGZyb20gb3V0c2lkZSB0aGUgY29tcG9uZW50IGhpZXJhcmNoeS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQHByb3RlY3RlZFxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJbnNpZGUgYSBkZXJpdmVkIGNvbXBvbmVudCBjbGFzc1xuICAgKiBjb25zb2xlLmxvZyh0aGlzLmNvbXBvbmVudE5hbWUpOyAvLyBPdXRwdXRzOiBcIk15Q3VzdG9tQ29tcG9uZW50XCJcbiAgICovXG4gIGNvbXBvbmVudE5hbWUhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlbmRlcmVyLlxuICAgKiBAc3VtbWFyeSBBIHVuaXF1ZSBpZGVudGlmaWVyIHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBjb21wb25lbnQncyByZW5kZXJlciBpbnN0YW5jZS5cbiAgICogVGhpcyBjYW4gYmUgdXNlZCBmb3IgdGFyZ2V0aW5nIHNwZWNpZmljIHJlbmRlcmVyIGluc3RhbmNlcyB3aGVuIG11bHRpcGxlIGNvbXBvbmVudHNcbiAgICogYXJlIHByZXNlbnQgb24gdGhlIHNhbWUgcGFnZS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHJlbmRlcmVySWQhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IG1vZGVsIGZvciBkYXRhIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFRoZSBkYXRhIG1vZGVsIHJlcG9zaXRvcnkgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHVzZSBmb3IgQ1JVRCBvcGVyYXRpb25zLlxuICAgKiBUaGlzIHByb3ZpZGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YSBsYXllciBmb3IgcmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIGRhdGEuXG4gICAqXG4gICAqIEB0eXBlIHtNb2RlbHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbW9kZWwhOiAgTW9kZWwgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcmVwb3NpdG9yeSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgZGF0YSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhIGxheWVyIGZvciByZXRyaWV2aW5nIGFuZCBtYW5pcHVsYXRpbmcgZGF0YS5cbiAgICogVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgYERlY2FmUmVwb3NpdG9yeWAgY2xhc3MgZnJvbSB0aGUgYEBkZWNhZi10cy9jb3JlYCBwYWNrYWdlLFxuICAgKiB3aGljaCBpcyBpbml0aWFsaXplZCBpbiB0aGUgYHJlcG9zaXRvcnlgIGdldHRlciBtZXRob2QuXG4gICAqXG4gICAqIFRoZSByZXBvc2l0b3J5IGlzIHVzZWQgdG8gcGVyZm9ybSBDUlVEIChDcmVhdGUsIFJlYWQsIFVwZGF0ZSwgRGVsZXRlKSBvcGVyYXRpb25zIG9uIHRoZVxuICAgKiBkYXRhIG1vZGVsLCBzdWNoIGFzIGZldGNoaW5nIGRhdGEsIGNyZWF0aW5nIG5ldyBpdGVtcywgdXBkYXRpbmcgZXhpc3RpbmcgaXRlbXMsIGFuZCBkZWxldGluZ1xuICAgKiBpdGVtcy4gSXQgYWxzbyBwcm92aWRlcyBtZXRob2RzIGZvciBxdWVyeWluZyBhbmQgZmlsdGVyaW5nIGRhdGEgYmFzZWQgb24gc3BlY2lmaWMgY3JpdGVyaWEuXG4gICAqXG4gICAqIEB0eXBlIHtEZWNhZlJlcG9zaXRvcnk8TW9kZWw+fVxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIF9yZXBvc2l0b3J5PzogRGVjYWZSZXBvc2l0b3J5PE1vZGVsPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIER5bmFtaWMgcHJvcGVydGllcyBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICogQHN1bW1hcnkgQ29udGFpbnMga2V5LXZhbHVlIHBhaXJzIG9mIGR5bmFtaWMgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnRcbiAgICogYXQgcnVudGltZS4gVGhpcyBmbGV4aWJsZSBjb25maWd1cmF0aW9uIG9iamVjdCBhbGxvd3MgZm9yIGR5bmFtaWMgcHJvcGVydHkgYXNzaWdubWVudCB3aXRob3V0XG4gICAqIHJlcXVpcmluZyBleHBsaWNpdCBpbnB1dCBiaW5kaW5ncyBmb3IgZXZlcnkgcG9zc2libGUgY29uZmlndXJhdGlvbiBvcHRpb24uIFByb3BlcnRpZXMgZnJvbVxuICAgKiB0aGlzIG9iamVjdCBhcmUgcGFyc2VkIGFuZCBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdGhyb3VnaCB0aGUgcGFyc2VQcm9wcyBtZXRob2QsXG4gICAqIGVuYWJsaW5nIGN1c3RvbWl6YWJsZSBjb21wb25lbnQgYmVoYXZpb3IgYmFzZWQgb24gZXh0ZXJuYWwgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fVxuICAgKiBAZGVmYXVsdCB7fVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIGZvciBsaXN0IGl0ZW0gcmVuZGVyaW5nXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgaG93IGxpc3QgaXRlbXMgc2hvdWxkIGJlIHJlbmRlcmVkIGluIHRoZSBjb21wb25lbnQuXG4gICAqIFRoaXMgcHJvcGVydHkgaG9sZHMgYSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IHNwZWNpZmllcyB0aGUgdGFnIG5hbWVcbiAgICogYW5kIG90aGVyIHByb3BlcnRpZXMgbmVlZGVkIHRvIHJlbmRlciBsaXN0IGl0ZW1zIGNvcnJlY3RseS4gVGhlIHRhZyBwcm9wZXJ0eVxuICAgKiBpZGVudGlmaWVzIHdoaWNoIGNvbXBvbmVudCBzaG91bGQgYmUgdXNlZCB0byByZW5kZXIgZWFjaCBpdGVtIGluIGEgbGlzdC5cbiAgICogQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGNhbiBiZSBpbmNsdWRlZCB0byBjdXN0b21pemUgdGhlIHJlbmRlcmluZyBiZWhhdmlvci5cbiAgICpcbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fVxuICAgKiBAZGVmYXVsdCB7dGFnOiBcIlwifVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgaXRlbTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IHRhZzogJycgfTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByaW1hcnkga2V5IGZpZWxkIG5hbWUgZm9yIHRoZSBtb2RlbC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoaWNoIGZpZWxkIGluIHRoZSBtb2RlbCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgcHJpbWFyeSBrZXkuXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGlkZW50aWZ5aW5nIHVuaXF1ZSByZWNvcmRzIGluIG9wZXJhdGlvbnMgbGlrZSB1cGRhdGUgYW5kIGRlbGV0ZS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ2lkJ1xuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgcGs6IHN0cmluZyA9ICdpZCc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCYXNlIHJvdXRlIGZvciBuYXZpZ2F0aW9uIHJlbGF0ZWQgdG8gdGhpcyBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGJhc2Ugcm91dGUgcGF0aCB1c2VkIGZvciBuYXZpZ2F0aW9uIGFjdGlvbnMgcmVsYXRlZCB0byB0aGlzIGNvbXBvbmVudC5cbiAgICogVGhpcyBpcyBvZnRlbiB1c2VkIGFzIGEgcHJlZml4IGZvciBjb25zdHJ1Y3RpbmcgbmF2aWdhdGlvbiBVUkxzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgcm91dGUhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBdmFpbGFibGUgQ1JVRCBvcGVyYXRpb25zIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyB3aGljaCBDUlVEIG9wZXJhdGlvbnMgKENyZWF0ZSwgUmVhZCwgVXBkYXRlLCBEZWxldGUpIGFyZSBhdmFpbGFibGVcbiAgICogZm9yIHRoaXMgY29tcG9uZW50LiBUaGlzIGFmZmVjdHMgd2hpY2ggb3BlcmF0aW9ucyBjYW4gYmUgcGVyZm9ybWVkIG9uIHRoZSBkYXRhLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbT3BlcmF0aW9uS2V5cy5SRUFEXVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3BlcmF0aW9uczogQ3J1ZE9wZXJhdGlvbnNbXSA9IFtPcGVyYXRpb25LZXlzLlJFQURdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHJlY29yZC5cbiAgICogQHN1bW1hcnkgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgcmVjb3JkIGJlaW5nIGRpc3BsYXllZCBvciBtYW5pcHVsYXRlZC5cbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBwcmltYXJ5IGtleSBmb3Igb3BlcmF0aW9ucyBvbiBzcGVjaWZpYyByZWNvcmRzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdWlkITogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmllbGQgbWFwcGluZyBjb25maWd1cmF0aW9uLlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGhvdyBmaWVsZHMgZnJvbSB0aGUgZGF0YSBtb2RlbCBzaG91bGQgYmUgbWFwcGVkIHRvIHByb3BlcnRpZXMgdXNlZCBieSB0aGUgY29tcG9uZW50LlxuICAgKiBUaGlzIGFsbG93cyBmb3IgZmxleGlibGUgZGF0YSBiaW5kaW5nIGJldHdlZW4gdGhlIG1vZGVsIGFuZCB0aGUgY29tcG9uZW50J3MgZGlzcGxheSBsb2dpYy5cbiAgICpcbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBtYXBwZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBsb2NhbGUgdG8gYmUgdXNlZCBmb3IgdHJhbnNsYXRpb25zLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGxvY2FsZSBpZGVudGlmaWVyIHRvIHVzZSB3aGVuIHRyYW5zbGF0aW5nIGNvbXBvbmVudCB0ZXh0LlxuICAgKiBUaGlzIGNhbiBiZSBzZXQgZXhwbGljaXRseSB2aWEgaW5wdXQgcHJvcGVydHkgdG8gb3ZlcnJpZGUgdGhlIGF1dG9tYXRpY2FsbHkgZGVyaXZlZFxuICAgKiBsb2NhbGUgZnJvbSB0aGUgY29tcG9uZW50IG5hbWUuIFRoZSBsb2NhbGUgaXMgdHlwaWNhbGx5IGEgbGFuZ3VhZ2UgY29kZSAoZS5nLiwgJ2VuJywgJ2ZyJylcbiAgICogb3IgYSBsYW5ndWFnZS1yZWdpb24gY29kZSAoZS5nLiwgJ2VuLVVTJywgJ2ZyLUNBJykgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHRyYW5zbGF0aW9uXG4gICAqIHNldCB0byB1c2UgZm9yIHRoZSBjb21wb25lbnQncyB0ZXh0IGNvbnRlbnQuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBsb2NhbGUhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuXG4gICAqIEBzdW1tYXJ5IENvbnRyb2xzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCdzIHRleHQgY29udGVudCBzaG91bGQgYmUgcHJvY2Vzc2VkIGZvciB0cmFuc2xhdGlvbi5cbiAgICogV2hlbiB0cnVlLCB0aGUgY29tcG9uZW50IHdpbGwgYXR0ZW1wdCB0byB0cmFuc2xhdGUgdGV4dCB1c2luZyB0aGUgc3BlY2lmaWVkIGxvY2FsZS5cbiAgICogV2hlbiBmYWxzZSwgdGV4dCBpcyBkaXNwbGF5ZWQgYXMtaXMgd2l0aG91dCB0cmFuc2xhdGlvbi4gVGhpcyBwcm9wZXJ0eSBhY2NlcHRzIGVpdGhlclxuICAgKiBhIGJvb2xlYW4gdmFsdWUgb3IgYSBzdHJpbmcgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIGEgYm9vbGVhbiAoZS5nLiwgJ3RydWUnLCAnZmFsc2UnLCAnMScsICcwJykuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB0cmFuc2xhdGFibGU6IFN0cmluZ09yQm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRpdGlvbmFsIENTUyBjbGFzcyBuYW1lcyB0byBhcHBseSB0byB0aGUgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBBbGxvd3MgY3VzdG9tIENTUyBjbGFzc2VzIHRvIGJlIGFkZGVkIHRvIHRoZSBjb21wb25lbnQncyByb290IGVsZW1lbnQuXG4gICAqIFRoZXNlIGNsYXNzZXMgYXJlIGFwcGVuZGVkIHRvIGFueSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBjbGFzc2VzIGJhc2VkIG9uIG90aGVyXG4gICAqIGNvbXBvbmVudCBwcm9wZXJ0aWVzLiBNdWx0aXBsZSBjbGFzc2VzIGNhbiBiZSBwcm92aWRlZCBhcyBhIHNwYWNlLXNlcGFyYXRlZCBzdHJpbmcuXG4gICAqIFRoaXMgcHJvdmlkZXMgYSB3YXkgdG8gY3VzdG9taXplIHRoZSBjb21wb25lbnQncyBhcHBlYXJhbmNlIGJleW9uZCB0aGUgYnVpbHQtaW4gc3R5bGluZyBvcHRpb25zLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCBcIlwiXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBjbGFzc05hbWU6IHN0cmluZyA9ICcnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IHBsYXRmb3JtIHN0eWxlLlxuICAgKiBAc3VtbWFyeSBDb250cm9scyB0aGUgdmlzdWFsIGFwcGVhcmFuY2Ugb2YgdGhlIGNvbXBvbmVudCBiYXNlZCBvbiBwbGF0Zm9ybSBkZXNpZ24gZ3VpZGVsaW5lcy5cbiAgICogVGhlICdpb3MnIG1vZGUgZm9sbG93cyBpT1MgZGVzaWduIHBhdHRlcm5zLCB3aGlsZSAnbWQnIChNYXRlcmlhbCBEZXNpZ24pIGZvbGxvd3MgQW5kcm9pZC9Hb29nbGVcbiAgICogZGVzaWduIHBhdHRlcm5zLiBUaGlzIHByb3BlcnR5IGFmZmVjdHMgdmFyaW91cyB2aXN1YWwgYXNwZWN0cyBzdWNoIGFzIGFuaW1hdGlvbnMsIGZvcm0gZWxlbWVudHMsXG4gICAqIGFuZCBpY29ucy4gU2V0dGluZyB0aGlzIHByb3BlcnR5IGFsbG93cyBjb21wb25lbnRzIHRvIG1haW50YWluIHBsYXRmb3JtLXNwZWNpZmljIHN0eWxpbmdcbiAgICogZm9yIGEgbW9yZSBuYXRpdmUgbG9vayBhbmQgZmVlbC5cbiAgICpcbiAgICogQHR5cGUgeyhcImlvc1wiIHwgXCJtZFwiIHwgdW5kZWZpbmVkKX1cbiAgICogQGRlZmF1bHQgXCJtZFwiXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBtb2RlOiAnaW9zJyB8ICdtZCcgfCB1bmRlZmluZWQgPSAnbWQnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxvY2FsZSBkZXJpdmVkIGZyb20gdGhlIGNvbXBvbmVudCdzIGNsYXNzIG5hbWUuXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgYXV0b21hdGljYWxseSBkZXJpdmVkIGxvY2FsZSBiYXNlZCBvbiB0aGUgY29tcG9uZW50J3MgY2xhc3MgbmFtZS5cbiAgICogVGhpcyBpcyBkZXRlcm1pbmVkIGR1cmluZyBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24gYW5kIHNlcnZlcyBhcyBhIGZhbGxiYWNrIHdoZW4gbm9cbiAgICogZXhwbGljaXQgbG9jYWxlIGlzIHByb3ZpZGVkIHZpYSB0aGUgbG9jYWxlIGlucHV0IHByb3BlcnR5LiBUaGUgZGVyaXZhdGlvbiBpcyBoYW5kbGVkXG4gICAqIGJ5IHRoZSBnZXRMb2NhbGVGcm9tQ2xhc3NOYW1lIHV0aWxpdHkgZnVuY3Rpb24sIHdoaWNoIGV4dHJhY3RzIGEgbG9jYWxlIGlkZW50aWZpZXJcbiAgICogZnJvbSB0aGUgY29tcG9uZW50J3MgY2xhc3MgbmFtZS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIGNvbXBvbmVudExvY2FsZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgY2hpbGQgY29tcG9uZW50cyBzaG91bGQgYmUgcmVuZGVyZWRcbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBjaGlsZCBjb21wb25lbnRzIHNob3VsZCBiZSByZW5kZXJlZCBieSB0aGUgY29tcG9uZW50LlxuICAgKiBUaGlzIGNhbiBiZSBzZXQgdG8gYSBib29sZWFuIHZhbHVlIG9yIGEgc3RyaW5nIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhIGJvb2xlYW4uXG4gICAqIFdoZW4gdHJ1ZSwgY2hpbGQgY29tcG9uZW50cyBkZWZpbmVkIGluIHRoZSBtb2RlbCB3aWxsIGJlIHJlbmRlcmVkLiBXaGVuIGZhbHNlLFxuICAgKiBjaGlsZCBjb21wb25lbnRzIHdpbGwgYmUgc2tpcHBlZC4gVGhpcyBwcm92aWRlcyBjb250cm9sIG92ZXIgdGhlIHJlbmRlcmluZyBkZXB0aC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IFN0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgcmVuZGVyQ2hpbGQ6IHN0cmluZyB8IFN0cmluZ09yQm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGbGFnIGluZGljYXRpbmcgaWYgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBpbml0aWFsaXplZFxuICAgKiBAc3VtbWFyeSBUcmFja3Mgd2hldGhlciB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWQgaXRzIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuXG4gICAqIFRoaXMgZmxhZyBpcyB1c2VkIHRvIHByZXZlbnQgZHVwbGljYXRlIGluaXRpYWxpemF0aW9uIGFuZCB0byBkZXRlcm1pbmUgaWZcbiAgICogY2VydGFpbiBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvbiBjYW4gYmUgcGVyZm9ybWVkLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciBjdXN0b20gcmVuZGVyZXIgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBFbWl0cyBjdXN0b20gZXZlbnRzIHRoYXQgb2NjdXIgd2l0aGluIGNoaWxkIGNvbXBvbmVudHMgb3IgdGhlIGxheW91dCBpdHNlbGYuXG4gICAqIFRoaXMgYWxsb3dzIHBhcmVudCBjb21wb25lbnRzIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdXNlciBpbnRlcmFjdGlvbnMgb3JcbiAgICogc3RhdGUgY2hhbmdlcyB3aXRoaW4gdGhlIGdyaWQgbGF5b3V0LiBFdmVudHMgYXJlIHBhc3NlZCB1cCB0aGUgY29tcG9uZW50IGhpZXJhcmNoeVxuICAgKiB0byBlbmFibGUgY29vcmRpbmF0ZWQgYmVoYXZpb3IgYWNyb3NzIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHR5cGUge0V2ZW50RW1pdHRlcjxSZW5kZXJlckN1c3RvbUV2ZW50Pn1cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKVxuICBsaXN0ZW5FdmVudDogRXZlbnRFbWl0dGVyPFJlbmRlcmVyQ3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZW5kZXJlckN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNlIHRvIHRoZSByZW5kZXJpbmcgZW5naW5lIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgTmd4UmVuZGVyaW5nRW5naW5lMiBzaW5nbGV0b24gaW5zdGFuY2UsXG4gICAqIHdoaWNoIGhhbmRsZXMgdGhlIHJlbmRlcmluZyBvZiBjb21wb25lbnRzIGJhc2VkIG9uIG1vZGVsIGRlZmluaXRpb25zLlxuICAgKiBUaGlzIGVuZ2luZSBpcyB1c2VkIHRvIGV4dHJhY3QgZGVjb3JhdG9yIG1ldGFkYXRhIGFuZCByZW5kZXIgY2hpbGQgY29tcG9uZW50cy5cbiAgICpcbiAgICogQHR5cGUge05neFJlbmRlcmluZ0VuZ2luZTJ9XG4gICAqL1xuICByZW5kZXJpbmdFbmdpbmU6IE5neFJlbmRlcmluZ0VuZ2luZTIgPVxuICAgIE5neFJlbmRlcmluZ0VuZ2luZTIuZ2V0KCkgYXMgdW5rbm93biBhcyBOZ3hSZW5kZXJpbmdFbmdpbmUyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBsb2dnaW5nIGNhcGFiaWxpdGllcyBmb3IgdGhlIGNvbXBvbmVudCwgYWxsb3dpbmcgZm9yIGNvbnNpc3RlbnRcbiAgICogYW5kIHN0cnVjdHVyZWQgbG9nZ2luZyBvZiBpbmZvcm1hdGlvbiwgd2FybmluZ3MsIGFuZCBlcnJvcnMuIFRoaXMgbG9nZ2VyIGlzIGluaXRpYWxpemVkXG4gICAqIGluIHRoZSBuZ09uSW5pdCBtZXRob2QgdXNpbmcgdGhlIGdldExvZ2dlciBmdW5jdGlvbiBmcm9tIHRoZSBGb3JBbmd1bGFyTW9kdWxlLlxuICAgKlxuICAgKiBUaGUgbG9nZ2VyIGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgY29tcG9uZW50IHRvIHJlY29yZCBpbXBvcnRhbnQgZXZlbnRzLCBkZWJ1ZyBpbmZvcm1hdGlvbixcbiAgICogYW5kIHBvdGVudGlhbCBpc3N1ZXMuIEl0IGhlbHBzIGluIG1vbml0b3JpbmcgdGhlIGNvbXBvbmVudCdzIGJlaGF2aW9yLCB0cmFja2luZyB0aGUgZmxvd1xuICAgKiBvZiBvcGVyYXRpb25zLCBhbmQgZmFjaWxpdGF0aW5nIGVhc2llciBkZWJ1Z2dpbmcgYW5kIG1haW50ZW5hbmNlLlxuICAgKlxuICAgKiBAdHlwZSB7TG9nZ2VyfVxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgbG9nZ2VyITogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBOZ3hCYXNlQ29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgYmFzZSBjb21wb25lbnQgd2l0aCB0aGUgcHJvdmlkZWQgaW5zdGFuY2UgdG9rZW4uXG4gICAqIFRoaXMgY29uc3RydWN0b3Igc2V0cyB1cCB0aGUgZnVuZGFtZW50YWwgcHJvcGVydGllcyByZXF1aXJlZCBieSBhbGwgRGVjYWYgY29tcG9uZW50cyxcbiAgICogaW5jbHVkaW5nIHRoZSBjb21wb25lbnQgbmFtZSwgbG9jYWxlIHNldHRpbmdzLCBhbmQgbG9nZ2luZyBjYXBhYmlsaXRpZXMuIFRoZSBpbnN0YW5jZVxuICAgKiB0b2tlbiBpcyB1c2VkIGZvciBjb21wb25lbnQgaWRlbnRpZmljYXRpb24gYW5kIGxvY2FsZSBkZXJpdmF0aW9uLlxuICAgKlxuICAgKiBUaGUgY29uc3RydWN0b3IgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBzdGVwczpcbiAgICogMS4gU2V0cyB0aGUgY29tcG9uZW50TmFtZSBmcm9tIHRoZSBwcm92aWRlZCBpbnN0YW5jZSB0b2tlblxuICAgKiAyLiBEZXJpdmVzIHRoZSBjb21wb25lbnRMb2NhbGUgZnJvbSB0aGUgY2xhc3MgbmFtZSB1c2luZyB1dGlsaXR5IGZ1bmN0aW9uc1xuICAgKiAzLiBJbml0aWFsaXplcyB0aGUgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YW5jZSAtIFRoZSBjb21wb25lbnQgaW5zdGFuY2UgdG9rZW4gdXNlZCBmb3IgaWRlbnRpZmljYXRpb25cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBbmd1bGFyXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBCIGFzIE5neEJhc2VDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFV0aWxzXG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBMb2dnZXJcbiAgICpcbiAgICogICBBLT4+QzogbmV3IENvbXBvbmVudChpbnN0YW5jZSlcbiAgICogICBDLT4+Qjogc3VwZXIoaW5zdGFuY2UpXG4gICAqICAgQi0+PkI6IFNldCBjb21wb25lbnROYW1lID0gaW5zdGFuY2VcbiAgICogICBCLT4+VTogZ2V0TG9jYWxlRnJvbUNsYXNzTmFtZShpbnN0YW5jZSlcbiAgICogICBVLS0+PkI6IFJldHVybiBkZXJpdmVkIGxvY2FsZVxuICAgKiAgIEItPj5COiBTZXQgY29tcG9uZW50TG9jYWxlXG4gICAqICAgQi0+Pkw6IGdldExvZ2dlcih0aGlzKVxuICAgKiAgIEwtLT4+QjogUmV0dXJuIGxvZ2dlciBpbnN0YW5jZVxuICAgKiAgIEItPj5COiBTZXQgbG9nZ2VyXG4gICAqXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L3ByZWZlci1pbmplY3RcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKEBJbmplY3QoJ2luc3RhbmNlVG9rZW4nKSBwcm90ZWN0ZWQgaW5zdGFuY2U6IHN0cmluZykge1xuICAgIHRoaXMuY29tcG9uZW50TmFtZSA9IGluc3RhbmNlO1xuICAgIHRoaXMuY29tcG9uZW50TG9jYWxlID0gZ2V0TG9jYWxlRnJvbUNsYXNzTmFtZShpbnN0YW5jZSk7XG4gICAgdGhpcy5sb2dnZXIgPSBnZXRMb2dnZXIodGhpcyk7XG4gICAgdGhpcy5nZXRMb2NhbGUodGhpcy50cmFuc2xhdGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXR0ZXIgZm9yIHRoZSByZXBvc2l0b3J5IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGEgbGF5ZXIgZm9yIHJldHJpZXZpbmcgYW5kIG1hbmlwdWxhdGluZyBkYXRhLlxuICAgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0aGUgYF9yZXBvc2l0b3J5YCBwcm9wZXJ0eSBpZiBpdCBpcyBub3QgYWxyZWFkeSBzZXQsIGVuc3VyaW5nXG4gICAqIHRoYXQgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIHJlcG9zaXRvcnkgaXMgdXNlZCB0aHJvdWdob3V0IHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIFRoZSByZXBvc2l0b3J5IGlzIHVzZWQgdG8gcGVyZm9ybSBDUlVEIG9wZXJhdGlvbnMgb24gdGhlIGRhdGEgbW9kZWwsIHN1Y2ggYXMgZmV0Y2hpbmcgZGF0YSxcbiAgICogY3JlYXRpbmcgbmV3IGl0ZW1zLCB1cGRhdGluZyBleGlzdGluZyBpdGVtcywgYW5kIGRlbGV0aW5nIGl0ZW1zLiBJdCBhbHNvIHByb3ZpZGVzIG1ldGhvZHNcbiAgICogZm9yIHF1ZXJ5aW5nIGFuZCBmaWx0ZXJpbmcgZGF0YSBiYXNlZCBvbiBzcGVjaWZpYyBjcml0ZXJpYS5cbiAgICpcbiAgICogQHJldHVybnMge0RlY2FmUmVwb3NpdG9yeTxNb2RlbD59IFRoZSBpbml0aWFsaXplZCByZXBvc2l0b3J5IGluc3RhbmNlLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCByZXBvc2l0b3J5KCk6IERlY2FmUmVwb3NpdG9yeTxNb2RlbD4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuX3JlcG9zaXRvcnkpIHtcbiAgICAgICAgY29uc3QgbW9kZWxOYW1lICA9ICh0aGlzLm1vZGVsIGFzIE1vZGVsKS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KG1vZGVsTmFtZSk7XG4gICAgICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAnQ2Fubm90IGZpbmQgbW9kZWwuIHdhcyBpdCByZWdpc3RlcmVkIHdpdGggQG1vZGVsPycsXG4gICAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fcmVwb3NpdG9yeSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoY29uc3RydWN0b3IpO1xuICAgICAgICB0aGlzLm1vZGVsID0gbmV3IGNvbnN0cnVjdG9yKCkgYXMgTW9kZWw7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAoZXJyb3IgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IGVycm9yIGFzIHN0cmluZ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlcG9zaXRvcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbmQgYXBwbGllcyBwcm9wZXJ0aWVzIGZyb20gdGhlIHByb3BzIG9iamVjdCB0byB0aGUgY29tcG9uZW50IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwcm92aWRlZCBpbnN0YW5jZSBvYmplY3RcbiAgICogYW5kIGFwcGxpZXMgYW55IG1hdGNoaW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgY29tcG9uZW50J3MgcHJvcHMgY29uZmlndXJhdGlvbiB0byB0aGVcbiAgICogY29tcG9uZW50IGluc3RhbmNlLiBUaGlzIGFsbG93cyBmb3IgZHluYW1pYyBwcm9wZXJ0eSBhc3NpZ25tZW50IGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAgICogc3RvcmVkIGluIHRoZSBwcm9wcyBvYmplY3QsIGVuYWJsaW5nIGZsZXhpYmxlIGNvbXBvbmVudCBjdXN0b21pemF0aW9uIHdpdGhvdXQgcmVxdWlyaW5nXG4gICAqIGV4cGxpY2l0IHByb3BlcnR5IGJpbmRpbmcgZm9yIGV2ZXJ5IHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gb3B0aW9uLlxuICAgKlxuICAgKiBUaGUgbWV0aG9kIHBlcmZvcm1zIGEgc2FmZSBwcm9wZXJ0eSBhc3NpZ25tZW50IGJ5IGNoZWNraW5nIGlmIGVhY2gga2V5IGZyb20gdGhlIGluc3RhbmNlXG4gICAqIGV4aXN0cyBpbiB0aGUgcHJvcHMgb2JqZWN0IGJlZm9yZSBhcHBseWluZyBpdC4gVGhpcyBwcmV2ZW50cyBhY2NpZGVudGFsIHByb3BlcnR5XG4gICAqIG92ZXJ3cml0aW5nIGFuZCBlbnN1cmVzIG9ubHkgaW50ZW5kZWQgcHJvcGVydGllcyBhcmUgbW9kaWZpZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5VmFsdWV9IGluc3RhbmNlIC0gVGhlIGNvbXBvbmVudCBpbnN0YW5jZSBvYmplY3QgdG8gcHJvY2Vzc1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIENvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEIgYXMgTmd4QmFzZUNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IFAgYXMgUHJvcHMgT2JqZWN0XG4gICAqXG4gICAqICAgQy0+PkI6IHBhcnNlUHJvcHMoaW5zdGFuY2UpXG4gICAqICAgQi0+PkI6IEdldCBPYmplY3Qua2V5cyhpbnN0YW5jZSlcbiAgICogICBsb29wIEZvciBlYWNoIGtleSBpbiBpbnN0YW5jZVxuICAgKiAgICAgQi0+PlA6IENoZWNrIGlmIGtleSBleGlzdHMgaW4gdGhpcy5wcm9wc1xuICAgKiAgICAgYWx0IEtleSBleGlzdHMgaW4gcHJvcHNcbiAgICogICAgICAgQi0+PkI6IFNldCB0aGlzW2tleV0gPSB0aGlzLnByb3BzW2tleV1cbiAgICogICAgIGVsc2UgS2V5IG5vdCBpbiBwcm9wc1xuICAgKiAgICAgICBOb3RlIG92ZXIgQjogU2tpcCB0aGlzIGtleVxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZVByb3BzKGluc3RhbmNlOiBLZXlWYWx1ZSk6IHZvaWQge1xuICAgIE9iamVjdC5rZXlzKGluc3RhbmNlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmKE9iamVjdC5rZXlzKHRoaXMucHJvcHMpLmluY2x1ZGVzKGtleSkpXG4gICAgICAgICh0aGlzIGFzIEtleVZhbHVlKVtrZXldID0gdGhpcy5wcm9wc1trZXldO1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgY2hhbmdlcyB0byBjb21wb25lbnQgaW5wdXRzXG4gICAqIEBzdW1tYXJ5IFRoaXMgQW5ndWxhciBsaWZlY3ljbGUgaG9vayBpcyBjYWxsZWQgd2hlbiBpbnB1dCBwcm9wZXJ0aWVzIGNoYW5nZS5cbiAgICogSXQgcmVzcG9uZHMgdG8gY2hhbmdlcyBpbiB0aGUgbW9kZWwsIGxvY2FsZSwgb3IgdHJhbnNsYXRhYmxlIHByb3BlcnRpZXMgYnlcbiAgICogdXBkYXRpbmcgdGhlIGNvbXBvbmVudCdzIGludGVybmFsIHN0YXRlIGFjY29yZGluZ2x5LiBXaGVuIHRoZSBtb2RlbCBjaGFuZ2VzLFxuICAgKiBpdCBjYWxscyBnZXRNb2RlbCB0byBwcm9jZXNzIHRoZSBuZXcgbW9kZWwgYW5kIGdldExvY2FsZSB0byB1cGRhdGUgdGhlIGxvY2FsZS5cbiAgICogV2hlbiBsb2NhbGUgb3IgdHJhbnNsYXRhYmxlIHByb3BlcnRpZXMgY2hhbmdlLCBpdCBjYWxscyBnZXRMb2NhbGUgdG8gdXBkYXRlXG4gICAqIHRoZSB0cmFuc2xhdGlvbiBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIHtTaW1wbGVDaGFuZ2VzfSBjaGFuZ2VzIC0gT2JqZWN0IGNvbnRhaW5pbmcgY2hhbmdlZCBwcm9wZXJ0aWVzXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbQmFzZUNvbXBvbmVudFByb3BzLk1PREVMXSkge1xuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUgfSA9IGNoYW5nZXNbQmFzZUNvbXBvbmVudFByb3BzLk1PREVMXTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUpIHRoaXMuZ2V0TW9kZWwoY3VycmVudFZhbHVlKTtcbiAgICAgIHRoaXMuZ2V0TG9jYWxlKHRoaXMudHJhbnNsYXRhYmxlKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuSU5JVElBTElaRURdIHx8XG4gICAgICBjaGFuZ2VzW0Jhc2VDb21wb25lbnRQcm9wcy5MT0NBTEVdIHx8XG4gICAgICBjaGFuZ2VzW0Jhc2VDb21wb25lbnRQcm9wcy5UUkFOU0xBVEFCTEVdXG4gICAgKVxuICAgICAgdGhpcy5nZXRMb2NhbGUodGhpcy50cmFuc2xhdGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUgc3RyaW5nIGJhc2VkIG9uIHRoZSB0cmFuc2xhdGFibGUgZmxhZyBhbmQgYXZhaWxhYmxlIGxvY2FsZXMuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hpY2ggbG9jYWxlIHN0cmluZyB0byB1c2UgZm9yIHRyYW5zbGF0aW9uIGJhc2VkIG9uIHRoZSB0cmFuc2xhdGFibGUgZmxhZ1xuICAgKiBhbmQgYXZhaWxhYmxlIGxvY2FsZSBzZXR0aW5ncy4gVGhpcyBtZXRob2QgZmlyc3QgY29udmVydHMgdGhlIHRyYW5zbGF0YWJsZSBwYXJhbWV0ZXIgdG8gYSBib29sZWFuXG4gICAqIHVzaW5nIHRoZSBzdHJpbmdUb0Jvb2xlYW4gdXRpbGl0eSBmdW5jdGlvbi4gSWYgdHJhbnNsYXRhYmxlIGlzIGZhbHNlLCBpdCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZyxcbiAgICogaW5kaWNhdGluZyBubyB0cmFuc2xhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLiBJZiB0cmFuc2xhdGFibGUgaXMgdHJ1ZSwgaXQgY2hlY2tzIGZvciBhbiBleHBsaWNpdGx5XG4gICAqIHByb3ZpZGVkIGxvY2FsZSB2aWEgdGhlIGxvY2FsZSBwcm9wZXJ0eS4gSWYgbm8gZXhwbGljaXQgbG9jYWxlIGlzIGF2YWlsYWJsZSwgaXQgZmFsbHMgYmFjayB0byB0aGVcbiAgICogY29tcG9uZW50TG9jYWxlIGRlcml2ZWQgZnJvbSB0aGUgY29tcG9uZW50J3MgY2xhc3MgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmdPckJvb2xlYW59IHRyYW5zbGF0YWJsZSAtIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgdHJhbnNsYXRlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBsb2NhbGUgc3RyaW5nIHRvIHVzZSBmb3IgdHJhbnNsYXRpb24sIG9yIGVtcHR5IHN0cmluZyBpZiBub3QgdHJhbnNsYXRhYmxlXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgTiBhcyBOZ3hCYXNlQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgUyBhcyBTdHJpbmdVdGlsc1xuICAgKlxuICAgKiAgIEMtPj5OOiBnZXRMb2NhbGUodHJhbnNsYXRhYmxlKVxuICAgKiAgIE4tPj5TOiBzdHJpbmdUb0Jvb2xlYW4odHJhbnNsYXRhYmxlKVxuICAgKiAgIFMtLT4+TjogUmV0dXJuIGJvb2xlYW4gdmFsdWVcbiAgICogICBOLT4+TjogU3RvcmUgaW4gdGhpcy50cmFuc2xhdGFibGVcbiAgICogICBhbHQgdHJhbnNsYXRhYmxlIGlzIGZhbHNlXG4gICAqICAgICBOLS0+PkM6IFJldHVybiBlbXB0eSBzdHJpbmdcbiAgICogICBlbHNlIHRyYW5zbGF0YWJsZSBpcyB0cnVlXG4gICAqICAgICBhbHQgdGhpcy5sb2NhbGUgaXMgZGVmaW5lZFxuICAgKiAgICAgICBOLS0+PkM6IFJldHVybiB0aGlzLmxvY2FsZVxuICAgKiAgICAgZWxzZSB0aGlzLmxvY2FsZSBpcyBub3QgZGVmaW5lZFxuICAgKiAgICAgICBOLS0+PkM6IFJldHVybiB0aGlzLmNvbXBvbmVudExvY2FsZVxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqL1xuICBnZXRMb2NhbGUodHJhbnNsYXRhYmxlOiBTdHJpbmdPckJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHRoaXMudHJhbnNsYXRhYmxlID0gc3RyaW5nVG9Cb29sZWFuKHRyYW5zbGF0YWJsZSk7XG4gICAgaWYgKCF0aGlzLnRyYW5zbGF0YWJsZSlcbiAgICAgIHJldHVybiAnJztcbiAgICBpZiAoIXRoaXMubG9jYWxlKVxuICAgICAgdGhpcy5sb2NhbGUgPSB0aGlzLmNvbXBvbmVudExvY2FsZTtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHJvdXRlIGZvciB0aGUgY29tcG9uZW50XG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgcm91dGUgcGF0aCBmb3IgdGhlIGNvbXBvbmVudCwgZ2VuZXJhdGluZyBvbmUgYmFzZWQgb24gdGhlIG1vZGVsXG4gICAqIGlmIG5vIHJvdXRlIGlzIGV4cGxpY2l0bHkgc2V0LiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgYSByb3V0ZSBpcyBhbHJlYWR5IGRlZmluZWQsIGFuZCBpZiBub3QsXG4gICAqIGl0IGNyZWF0ZXMgYSBkZWZhdWx0IHJvdXRlIGJhc2VkIG9uIHRoZSBtb2RlbCdzIGNvbnN0cnVjdG9yIG5hbWUuIFRoZSBnZW5lcmF0ZWQgcm91dGUgZm9sbG93c1xuICAgKiB0aGUgcGF0dGVybiAnL21vZGVsL3tNb2RlbE5hbWV9Jy4gVGhpcyBpcyB1c2VmdWwgZm9yIGF1dG9tYXRpYyByb3V0aW5nIGluIENSVUQgb3BlcmF0aW9ucy5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgcm91dGUgcGF0aCBmb3IgdGhlIGNvbXBvbmVudCwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vIHJvdXRlIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgZ2V0Um91dGUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucm91dGUgJiYgdGhpcy5tb2RlbCBpbnN0YW5jZW9mIE1vZGVsKVxuICAgICAgdGhpcy5yb3V0ZSA9IGAvbW9kZWwvJHt0aGlzLm1vZGVsPy5jb25zdHJ1Y3Rvci5uYW1lfWA7XG4gICAgcmV0dXJuIHRoaXMucm91dGUgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIGFuZCBzZXRzIHRoZSBjb21wb25lbnQncyBtb2RlbFxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgdGhlIHByb3ZpZGVkIG1vZGVsIHBhcmFtZXRlciwgd2hpY2ggY2FuIGJlIGVpdGhlciBhIE1vZGVsIGluc3RhbmNlXG4gICAqIG9yIGEgc3RyaW5nIGlkZW50aWZpZXIuIElmIGEgc3RyaW5nIGlzIHByb3ZpZGVkLCBpdCBhdHRlbXB0cyB0byByZXNvbHZlIHRoZSBhY3R1YWwgbW9kZWxcbiAgICogZnJvbSB0aGUgaW5qZWN0YWJsZXMgcmVnaXN0cnkuIEFmdGVyIHJlc29sdmluZyB0aGUgbW9kZWwsIGl0IGNhbGxzIHNldE1vZGVsRGVmaW5pdGlvbnNcbiAgICogdG8gY29uZmlndXJlIHRoZSBjb21wb25lbnQgYmFzZWQgb24gdGhlIG1vZGVsJ3MgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgTW9kZWx9IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGlkZW50aWZpZXIgc3RyaW5nXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBnZXRNb2RlbChtb2RlbDogc3RyaW5nIHwgTW9kZWwpOiB2b2lkIHtcbiAgICBpZiAoIShtb2RlbCBpbnN0YW5jZW9mIE1vZGVsKSlcbiAgICAgIHRoaXMubW9kZWwgPSBnZXRJbmplY3RhYmxlc1JlZ2lzdHJ5KCkuZ2V0KG1vZGVsKSBhcyBNb2RlbDtcbiAgICB0aGlzLnNldE1vZGVsRGVmaW5pdGlvbnModGhpcy5tb2RlbCBhcyBNb2RlbCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyZXMgY29tcG9uZW50IHByb3BlcnRpZXMgYmFzZWQgb24gbW9kZWwgbWV0YWRhdGFcbiAgICogQHN1bW1hcnkgRXh0cmFjdHMgYW5kIGFwcGxpZXMgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBtb2RlbCdzIGRlY29yYXRvcnMgdG8gc2V0IHVwXG4gICAqIHRoZSBjb21wb25lbnQuIFRoaXMgbWV0aG9kIHVzZXMgdGhlIHJlbmRlcmluZyBlbmdpbmUgdG8gcmV0cmlldmUgZGVjb3JhdG9yIG1ldGFkYXRhXG4gICAqIGZyb20gdGhlIG1vZGVsLCB0aGVuIGNvbmZpZ3VyZXMgdGhlIGNvbXBvbmVudCdzIG1hcHBlciBhbmQgaXRlbSBwcm9wZXJ0aWVzIGFjY29yZGluZ2x5LlxuICAgKiBJdCBlbnN1cmVzIHRoZSByb3V0ZSBpcyBwcm9wZXJseSBzZXQgYW5kIG1lcmdlcyB2YXJpb3VzIHByb3BlcnRpZXMgZnJvbSB0aGUgbW9kZWwnc1xuICAgKiBtZXRhZGF0YSBpbnRvIHRoZSBjb21wb25lbnQncyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge01vZGVsfSBtb2RlbCAtIFRoZSBtb2RlbCB0byBleHRyYWN0IGNvbmZpZ3VyYXRpb24gZnJvbVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc2V0TW9kZWxEZWZpbml0aW9ucyhtb2RlbDogTW9kZWwpOiB2b2lkIHtcbiAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBNb2RlbCkge1xuICAgICAgdGhpcy5nZXRSb3V0ZSgpO1xuICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLnJlbmRlcmluZ0VuZ2luZS5nZXREZWNvcmF0b3JzKHRoaXMubW9kZWwgYXMgTW9kZWwsIHt9KTtcbiAgICAgIGNvbnN0eyBwcm9wcywgaXRlbSwgY2hpbGRyZW4gfSA9IGZpZWxkO1xuICAgICAgdGhpcy5wcm9wcyA9IE9iamVjdC5hc3NpZ24ocHJvcHMgfHwge30sIHtjaGlsZHJlbjogY2hpbGRyZW4gfHwgW119KTtcbiAgICAgIGlmKGl0ZW0/LnByb3BzPy5bJ21hcHBlciddKVxuICAgICAgICB0aGlzLm1hcHBlciA9IGl0ZW0/LnByb3BzIVsnbWFwcGVyJ10gfHwge307XG4gICAgICB0aGlzLml0ZW0gPSB7XG4gICAgICAgIHRhZzogaXRlbT8udGFnIHx8ICcnLFxuICAgICAgICAuLi5pdGVtPy5wcm9wcyxcbiAgICAgICAgLi4uKHRoaXMubWFwcGVyID8ge21hcHBlcjogdGhpcy5tYXBwZXJ9IDoge30pLFxuICAgICAgICAuLi57IHJvdXRlOiBpdGVtPy5wcm9wcz8uWydyb3V0ZSddIHx8IHRoaXMucm91dGUgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgY29tcG9uZW50XG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIG9mIHRoZSBjb21wb25lbnQuIFRoaXMgbWV0aG9kIGNoZWNrcyBpZlxuICAgKiB0aGUgY29tcG9uZW50IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgdG8gcHJldmVudCBkdXBsaWNhdGUgaW5pdGlhbGl6YXRpb24uXG4gICAqIFdoZW4gY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSwgaXQgc2V0cyB0aGUgaW5pdGlhbGl6ZWQgZmxhZyB0byB0cnVlIGFuZCBsb2dzXG4gICAqIGFuIGluaXRpYWxpemF0aW9uIG1lc3NhZ2Ugd2l0aCB0aGUgY29tcG9uZW50IG5hbWUuIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSBjYWxsZWRcbiAgICogZHVyaW5nIHRoZSBjb21wb25lbnQncyBsaWZlY3ljbGUgc2V0dXAuXG4gICAqL1xuICBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGN1c3RvbSBldmVudHMgZnJvbSBjaGlsZCBjb21wb25lbnRzLlxuICAgKiBAc3VtbWFyeSBSZWNlaXZlcyBldmVudHMgZnJvbSBjaGlsZCByZW5kZXJlciBjb21wb25lbnRzIGFuZCBmb3J3YXJkcyB0aGVtIHRvIHBhcmVudFxuICAgKiBjb21wb25lbnRzIHRocm91Z2ggdGhlIGxpc3RlbkV2ZW50IG91dHB1dC4gVGhpcyBjcmVhdGVzIGFuIGV2ZW50IHByb3BhZ2F0aW9uIGNoYWluXG4gICAqIHRoYXQgYWxsb3dzIGV2ZW50cyB0byBidWJibGUgdXAgdGhyb3VnaCB0aGUgY29tcG9uZW50IGhpZXJhcmNoeSwgZW5hYmxpbmcgY29vcmRpbmF0ZWRcbiAgICogcmVzcG9uc2VzIHRvIHVzZXIgaW50ZXJhY3Rpb25zIGFjcm9zcyB0aGUgbGF5b3V0IHN0cnVjdHVyZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZW5kZXJlckN1c3RvbUV2ZW50fSBldmVudCAtIFRoZSBjdXN0b20gZXZlbnQgZnJvbSBhIGNoaWxkIGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIENoaWxkIENvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTmd4QmFzZUNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IFAgYXMgUGFyZW50IENvbXBvbmVudFxuICAgKlxuICAgKiAgIEMtPj5MOiBFbWl0IFJlbmRlcmVyQ3VzdG9tRXZlbnRcbiAgICogICBMLT4+TDogaGFuZGxlRXZlbnQoZXZlbnQpXG4gICAqICAgTC0+PlA6IGxpc3RlbkV2ZW50LmVtaXQoZXZlbnQpXG4gICAqICAgTm90ZSBvdmVyIFA6IEhhbmRsZSBldmVudCBpbiBwYXJlbnRcbiAgICpcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIGhhbmRsZUV2ZW50KGV2ZW50OiBSZW5kZXJlckN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5saXN0ZW5FdmVudC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHJhY2tzIGl0ZW1zIGluIG5nRm9yIGxvb3BzIGZvciBvcHRpbWFsIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgdHJhY2tpbmcgZnVuY3Rpb24gZm9yIEFuZ3VsYXIncyAqbmdGb3IgZGlyZWN0aXZlIHRvIG9wdGltaXplIHJlbmRlcmluZ1xuICAgKiBwZXJmb3JtYW5jZS4gVGhpcyBtZXRob2QgZ2VuZXJhdGVzIHVuaXF1ZSBpZGVudGlmaWVycyBmb3IgbGlzdCBpdGVtcyBiYXNlZCBvbiB0aGVpciBpbmRleFxuICAgKiBhbmQgY29udGVudCwgYWxsb3dpbmcgQW5ndWxhciB0byBlZmZpY2llbnRseSB0cmFjayBjaGFuZ2VzIGFuZCBtaW5pbWl6ZSBET00gbWFuaXB1bGF0aW9uc1xuICAgKiBkdXJpbmcgbGlzdCB1cGRhdGVzLiBUaGUgdHJhY2tpbmcgZnVuY3Rpb24gaXMgZXNzZW50aWFsIGZvciBtYWludGFpbmluZyBjb21wb25lbnQgc3RhdGVcbiAgICogYW5kIHByZXZlbnRpbmcgdW5uZWNlc3NhcnkgcmUtcmVuZGVyaW5nIG9mIHVuY2hhbmdlZCBpdGVtcy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIHRoZSBsaXN0XG4gICAqIEBwYXJhbSB7S2V5VmFsdWUgfCBzdHJpbmcgfCBudW1iZXJ9IGl0ZW0gLSBUaGUgaXRlbSBkYXRhIHRvIHRyYWNrXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXJ9IEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBpdGVtXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICB0cmFja0l0ZW1GbihpbmRleDogbnVtYmVyLCBpdGVtOiBLZXlWYWx1ZSB8IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB8IG51bWJlciB7XG4gICAgcmV0dXJuIGAke2luZGV4fS0ke2l0ZW19YDtcbiAgfVxufVxuIl19
539
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmd4QmFzZUNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL05neEJhc2VDb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLEtBQUssRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFNBQVMsRUFDVCxVQUFVLEVBR1YsTUFBTSxFQUNOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixlQUFlLEVBQ2hCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZELE9BQU8sRUFFTCxhQUFhLEVBQ2IsYUFBYSxFQUNkLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBRTVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkRHO0FBS0gsTUFBTSxPQUFnQixnQkFBZ0I7SUFzU3BDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQ0c7SUFDSCx5REFBeUQ7SUFDekQsWUFBeUQsUUFBZ0I7UUFBaEIsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQWhRekU7Ozs7Ozs7Ozs7O1dBV0c7UUFFSCxVQUFLLEdBQTRCLEVBQUUsQ0FBQztRQUVwQzs7Ozs7Ozs7Ozs7V0FXRztRQUVILFNBQUksR0FBNEIsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFFNUM7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ICBJbmplY3QsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBLZXlWYWx1ZSwgUmVuZGVyZXJDdXN0b21FdmVudCwgU3RyaW5nT3JCb29sZWFuIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBnZXRJbmplY3RhYmxlc1JlZ2lzdHJ5LFxuICBnZXRMb2NhbGVGcm9tQ2xhc3NOYW1lLFxuICBzdHJpbmdUb0Jvb2xlYW5cbn0gZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5pbXBvcnQge1xuICBDcnVkT3BlcmF0aW9ucyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5c1xufSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50UHJvcHMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBOZ3hSZW5kZXJpbmdFbmdpbmUyIH0gZnJvbSAnLi9OZ3hSZW5kZXJpbmdFbmdpbmUyJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BkZWNhZi10cy9sb2dnaW5nJztcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4uL2Zvci1hbmd1bGFyLm1vZHVsZSc7XG5pbXBvcnQgeyBEZWNhZlJlcG9zaXRvcnkgfSBmcm9tICcuLi9jb21wb25lbnRzL2xpc3QvY29uc3RhbnRzJztcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tICdAZGVjYWYtdHMvY29yZSc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgY29tcG9uZW50IGNsYXNzIHRoYXQgcHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBEZWNhZiBjb21wb25lbnRzLlxuICogQHN1bW1hcnkgVGhlIE5neEJhc2VDb21wb25lbnQgc2VydmVzIGFzIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgRGVjYWYgVUkgY29tcG9uZW50cywgcHJvdmlkaW5nXG4gKiBzaGFyZWQgZnVuY3Rpb25hbGl0eSBmb3IgbG9jYWxpemF0aW9uLCBlbGVtZW50IHJlZmVyZW5jZXMsIGFuZCBzdHlsaW5nLiBUaGlzIGFic3RyYWN0IGNsYXNzXG4gKiBpbXBsZW1lbnRzIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIHRoYXQgYXJlIHVzZWQgYWNyb3NzIHRoZSBjb21wb25lbnQgbGlicmFyeSwgZW5zdXJpbmdcbiAqIGNvbnNpc3RlbnQgYmVoYXZpb3IgYW5kIHJlZHVjaW5nIGNvZGUgZHVwbGljYXRpb24uIENvbXBvbmVudHMgdGhhdCBleHRlbmQgdGhpcyBjbGFzcyBpbmhlcml0XG4gKiBpdHMgY2FwYWJpbGl0aWVzIGZvciBoYW5kbGluZyB0cmFuc2xhdGlvbnMsIGFjY2Vzc2luZyBET00gZWxlbWVudHMsIGFuZCBhcHBseWluZyBjdXN0b20gc3R5bGluZy5cbiAqXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgdGhpcyBjb21wb25lbnQgd29ya3Mgd2l0aFxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RhbmNlIC0gVGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0b2tlbiB1c2VkIGZvciBpZGVudGlmaWNhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZSAtIFRoZSBsb2NhbGUgdG8gYmUgdXNlZCBmb3IgdHJhbnNsYXRpb25zXG4gKiBAcGFyYW0ge1N0cmluZ09yQm9vbGVhbn0gdHJhbnNsYXRhYmxlIC0gV2hldGhlciB0aGUgY29tcG9uZW50IHNob3VsZCBiZSB0cmFuc2xhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gQWRkaXRpb25hbCBDU1MgY2xhc3NlcyB0byBhcHBseSB0byB0aGUgY29tcG9uZW50XG4gKiBAcGFyYW0ge1wiaW9zXCIgfCBcIm1kXCIgfCB1bmRlZmluZWR9IG1vZGUgLSBDb21wb25lbnQgcGxhdGZvcm0gc3R5bGVcbiAqXG4gKiBAY29tcG9uZW50IE5neEJhc2VDb21wb25lbnRcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAtbXktY29tcG9uZW50JyxcbiAqICAgdGVtcGxhdGVVcmw6ICcuL215LWNvbXBvbmVudC5jb21wb25lbnQuaHRtbCcsXG4gKiAgIHN0eWxlVXJsczogWycuL215LWNvbXBvbmVudC5jb21wb25lbnQuc2NzcyddXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudCB7XG4gKiAgIGNvbnN0cnVjdG9yKEBJbmplY3QoJ2luc3RhbmNlVG9rZW4nKSBpbnN0YW5jZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoaW5zdGFuY2UpO1xuICogICB9XG4gKlxuICogICBuZ09uSW5pdCgpIHtcbiAqICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAqICAgICAvLyBDb21wb25lbnQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb25cbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcCBhcyBBcHBsaWNhdGlvblxuICogICBwYXJ0aWNpcGFudCBDb21wIGFzIENvbXBvbmVudFxuICogICBwYXJ0aWNpcGFudCBCYXNlIGFzIE5neEJhc2VDb21wb25lbnRcbiAqICAgcGFydGljaXBhbnQgRW5naW5lIGFzIE5neFJlbmRlcmluZ0VuZ2luZTJcbiAqXG4gKiAgIEFwcC0+PkNvbXA6IENyZWF0ZSBjb21wb25lbnRcbiAqICAgQ29tcC0+PkJhc2U6IHN1cGVyKGluc3RhbmNlKVxuICogICBCYXNlLT4+QmFzZTogU2V0IGNvbXBvbmVudE5hbWUgJiBjb21wb25lbnRMb2NhbGVcbiAqXG4gKiAgIEFwcC0+PkNvbXA6IFNldCBASW5wdXQgcHJvcGVydGllc1xuICogICBDb21wLT4+QmFzZTogbmdPbkNoYW5nZXMoY2hhbmdlcylcbiAqXG4gKiAgIGFsdCBtb2RlbCBjaGFuZ2VkXG4gKiAgICAgQmFzZS0+PkJhc2U6IGdldE1vZGVsKG1vZGVsKVxuICogICAgIEJhc2UtPj5FbmdpbmU6IGdldERlY29yYXRvcnMobW9kZWwsIHt9KVxuICogICAgIEVuZ2luZS0tPj5CYXNlOiBSZXR1cm4gZGVjb3JhdG9yIG1ldGFkYXRhXG4gKiAgICAgQmFzZS0+PkJhc2U6IENvbmZpZ3VyZSBtYXBwZXIgYW5kIGl0ZW1cbiAqICAgICBCYXNlLT4+QmFzZTogZ2V0TG9jYWxlKHRyYW5zbGF0YWJsZSlcbiAqICAgZWxzZSBsb2NhbGUvdHJhbnNsYXRhYmxlIGNoYW5nZWRcbiAqICAgICBCYXNlLT4+QmFzZTogZ2V0TG9jYWxlKHRyYW5zbGF0YWJsZSlcbiAqICAgZW5kXG4gKlxuICogICBBcHAtPj5Db21wOiBuZ09uSW5pdCgpXG4gKiAgIENvbXAtPj5CYXNlOiBpbml0aWFsaXplKClcbiAqICAgQmFzZS0+PkJhc2U6IFNldCBpbml0aWFsaXplZCBmbGFnXG4gKi9cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZTogJycsXG59KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5neEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50J3MgZWxlbWVudC5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB0byB0aGUgbmF0aXZlIERPTSBlbGVtZW50IG9mIHRoZSBjb21wb25lbnQgdGhyb3VnaCBBbmd1bGFyJ3NcbiAgICogVmlld0NoaWxkIGRlY29yYXRvci4gVGhpcyByZWZlcmVuY2UgY2FuIGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgRE9NIGVsZW1lbnQgZGlyZWN0bHksXG4gICAqIGFwcGx5IGN1c3RvbSBzdHlsZXMsIG9yIGFjY2VzcyBuYXRpdmUgZWxlbWVudCBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLiBUaGUgZWxlbWVudCBpc1xuICAgKiBpZGVudGlmaWVkIGJ5IHRoZSAnY29tcG9uZW50JyB0ZW1wbGF0ZSByZWZlcmVuY2UgdmFyaWFibGUuXG4gICAqXG4gICAqIEB0eXBlIHtFbGVtZW50UmVmfVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQFZpZXdDaGlsZCgnY29tcG9uZW50JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgY29tcG9uZW50ITogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50LCB3aGljaCBpcyB0eXBpY2FsbHkgZGVyaXZlZCBmcm9tIHRoZSBjbGFzcyBuYW1lLlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgaW50ZXJuYWxseSBmb3IgdmFyaW91cyBwdXJwb3NlcyBzdWNoIGFzIGxvZ2dpbmcsIGRlcml2aW5nIHRoZSBkZWZhdWx0XG4gICAqIGxvY2FsZSwgYW5kIHBvdGVudGlhbGx5IGZvciBjb21wb25lbnQgaWRlbnRpZmljYXRpb24gaW4gZGVidWdnaW5nIG9yIGVycm9yIHJlcG9ydGluZy5cbiAgICpcbiAgICogVGhlIGBjb21wb25lbnROYW1lYCBpcyBzZXQgZHVyaW5nIHRoZSBjb21wb25lbnQncyBpbml0aWFsaXphdGlvbiBwcm9jZXNzIGFuZCBzaG91bGQgbm90XG4gICAqIGJlIG1vZGlmaWVkIGV4dGVybmFsbHkuIEl0J3MgbWFya2VkIGFzIHByb3RlY3RlZCB0byBhbGxvdyBhY2Nlc3MgaW4gZGVyaXZlZCBjbGFzc2VzIHdoaWxlXG4gICAqIHByZXZlbnRpbmcgZGlyZWN0IGFjY2VzcyBmcm9tIG91dHNpZGUgdGhlIGNvbXBvbmVudCBoaWVyYXJjaHkuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSW5zaWRlIGEgZGVyaXZlZCBjb21wb25lbnQgY2xhc3NcbiAgICogY29uc29sZS5sb2codGhpcy5jb21wb25lbnROYW1lKTsgLy8gT3V0cHV0czogXCJNeUN1c3RvbUNvbXBvbmVudFwiXG4gICAqL1xuICBjb21wb25lbnROYW1lITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZW5kZXJlci5cbiAgICogQHN1bW1hcnkgQSB1bmlxdWUgaWRlbnRpZmllciB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgY29tcG9uZW50J3MgcmVuZGVyZXIgaW5zdGFuY2UuXG4gICAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIHRhcmdldGluZyBzcGVjaWZpYyByZW5kZXJlciBpbnN0YW5jZXMgd2hlbiBtdWx0aXBsZSBjb21wb25lbnRzXG4gICAqIGFyZSBwcmVzZW50IG9uIHRoZSBzYW1lIHBhZ2UuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICByZW5kZXJlcklkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVwb3NpdG9yeSBtb2RlbCBmb3IgZGF0YSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBUaGUgZGF0YSBtb2RlbCByZXBvc2l0b3J5IHRoYXQgdGhpcyBjb21wb25lbnQgd2lsbCB1c2UgZm9yIENSVUQgb3BlcmF0aW9ucy5cbiAgICogVGhpcyBwcm92aWRlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGEgbGF5ZXIgZm9yIHJldHJpZXZpbmcgYW5kIG1hbmlwdWxhdGluZyBkYXRhLlxuICAgKlxuICAgKiBAdHlwZSB7TW9kZWx8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG1vZGVsITogIE1vZGVsIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHJlcG9zaXRvcnkgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIGRhdGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YSBsYXllciBmb3IgcmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIGRhdGEuXG4gICAqIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGBEZWNhZlJlcG9zaXRvcnlgIGNsYXNzIGZyb20gdGhlIGBAZGVjYWYtdHMvY29yZWAgcGFja2FnZSxcbiAgICogd2hpY2ggaXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGByZXBvc2l0b3J5YCBnZXR0ZXIgbWV0aG9kLlxuICAgKlxuICAgKiBUaGUgcmVwb3NpdG9yeSBpcyB1c2VkIHRvIHBlcmZvcm0gQ1JVRCAoQ3JlYXRlLCBSZWFkLCBVcGRhdGUsIERlbGV0ZSkgb3BlcmF0aW9ucyBvbiB0aGVcbiAgICogZGF0YSBtb2RlbCwgc3VjaCBhcyBmZXRjaGluZyBkYXRhLCBjcmVhdGluZyBuZXcgaXRlbXMsIHVwZGF0aW5nIGV4aXN0aW5nIGl0ZW1zLCBhbmQgZGVsZXRpbmdcbiAgICogaXRlbXMuIEl0IGFsc28gcHJvdmlkZXMgbWV0aG9kcyBmb3IgcXVlcnlpbmcgYW5kIGZpbHRlcmluZyBkYXRhIGJhc2VkIG9uIHNwZWNpZmljIGNyaXRlcmlhLlxuICAgKlxuICAgKiBAdHlwZSB7RGVjYWZSZXBvc2l0b3J5PE1vZGVsPn1cbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIHByb3RlY3RlZCBfcmVwb3NpdG9yeT86IERlY2FmUmVwb3NpdG9yeTxNb2RlbD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEeW5hbWljIHByb3BlcnRpZXMgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIGtleS12YWx1ZSBwYWlycyBvZiBkeW5hbWljIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byB0aGUgY29tcG9uZW50XG4gICAqIGF0IHJ1bnRpbWUuIFRoaXMgZmxleGlibGUgY29uZmlndXJhdGlvbiBvYmplY3QgYWxsb3dzIGZvciBkeW5hbWljIHByb3BlcnR5IGFzc2lnbm1lbnQgd2l0aG91dFxuICAgKiByZXF1aXJpbmcgZXhwbGljaXQgaW5wdXQgYmluZGluZ3MgZm9yIGV2ZXJ5IHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBQcm9wZXJ0aWVzIGZyb21cbiAgICogdGhpcyBvYmplY3QgYXJlIHBhcnNlZCBhbmQgYXBwbGllZCB0byB0aGUgY29tcG9uZW50IGluc3RhbmNlIHRocm91Z2ggdGhlIHBhcnNlUHJvcHMgbWV0aG9kLFxuICAgKiBlbmFibGluZyBjdXN0b21pemFibGUgY29tcG9uZW50IGJlaGF2aW9yIGJhc2VkIG9uIGV4dGVybmFsIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn1cbiAgICogQGRlZmF1bHQge31cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBmb3IgbGlzdCBpdGVtIHJlbmRlcmluZ1xuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGhvdyBsaXN0IGl0ZW1zIHNob3VsZCBiZSByZW5kZXJlZCBpbiB0aGUgY29tcG9uZW50LlxuICAgKiBUaGlzIHByb3BlcnR5IGhvbGRzIGEgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBzcGVjaWZpZXMgdGhlIHRhZyBuYW1lXG4gICAqIGFuZCBvdGhlciBwcm9wZXJ0aWVzIG5lZWRlZCB0byByZW5kZXIgbGlzdCBpdGVtcyBjb3JyZWN0bHkuIFRoZSB0YWcgcHJvcGVydHlcbiAgICogaWRlbnRpZmllcyB3aGljaCBjb21wb25lbnQgc2hvdWxkIGJlIHVzZWQgdG8gcmVuZGVyIGVhY2ggaXRlbSBpbiBhIGxpc3QuXG4gICAqIEFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgaW5jbHVkZWQgdG8gY3VzdG9taXplIHRoZSByZW5kZXJpbmcgYmVoYXZpb3IuXG4gICAqXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn1cbiAgICogQGRlZmF1bHQge3RhZzogXCJcIn1cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGl0ZW06IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyB0YWc6ICcnIH07XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IGtleSBmaWVsZCBuYW1lIGZvciB0aGUgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGljaCBmaWVsZCBpbiB0aGUgbW9kZWwgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIHByaW1hcnkga2V5LlxuICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciBpZGVudGlmeWluZyB1bmlxdWUgcmVjb3JkcyBpbiBvcGVyYXRpb25zIGxpa2UgdXBkYXRlIGFuZCBkZWxldGUuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdpZCdcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHBrOiBzdHJpbmcgPSAnaWQnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQmFzZSByb3V0ZSBmb3IgbmF2aWdhdGlvbiByZWxhdGVkIHRvIHRoaXMgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBiYXNlIHJvdXRlIHBhdGggdXNlZCBmb3IgbmF2aWdhdGlvbiBhY3Rpb25zIHJlbGF0ZWQgdG8gdGhpcyBjb21wb25lbnQuXG4gICAqIFRoaXMgaXMgb2Z0ZW4gdXNlZCBhcyBhIHByZWZpeCBmb3IgY29uc3RydWN0aW5nIG5hdmlnYXRpb24gVVJMcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHJvdXRlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXZhaWxhYmxlIENSVUQgb3BlcmF0aW9ucyBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgd2hpY2ggQ1JVRCBvcGVyYXRpb25zIChDcmVhdGUsIFJlYWQsIFVwZGF0ZSwgRGVsZXRlKSBhcmUgYXZhaWxhYmxlXG4gICAqIGZvciB0aGlzIGNvbXBvbmVudC4gVGhpcyBhZmZlY3RzIHdoaWNoIG9wZXJhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgZGF0YS5cbiAgICpcbiAgICogQGRlZmF1bHQgW09wZXJhdGlvbktleXMuUkVBRF1cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG9wZXJhdGlvbnM6IENydWRPcGVyYXRpb25zW10gPSBbT3BlcmF0aW9uS2V5cy5SRUFEXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCByZWNvcmQuXG4gICAqIEBzdW1tYXJ5IEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHJlY29yZCBiZWluZyBkaXNwbGF5ZWQgb3IgbWFuaXB1bGF0ZWQuXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJpbWFyeSBrZXkgZm9yIG9wZXJhdGlvbnMgb24gc3BlY2lmaWMgcmVjb3Jkcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IG51bWJlcn1cbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHVpZCE6IHN0cmluZyB8IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZpZWxkIG1hcHBpbmcgY29uZmlndXJhdGlvbi5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBob3cgZmllbGRzIGZyb20gdGhlIGRhdGEgbW9kZWwgc2hvdWxkIGJlIG1hcHBlZCB0byBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIGNvbXBvbmVudC5cbiAgICogVGhpcyBhbGxvd3MgZm9yIGZsZXhpYmxlIGRhdGEgYmluZGluZyBiZXR3ZWVuIHRoZSBtb2RlbCBhbmQgdGhlIGNvbXBvbmVudCdzIGRpc3BsYXkgbG9naWMuXG4gICAqXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbWFwcGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbG9jYWxlIHRvIGJlIHVzZWQgZm9yIHRyYW5zbGF0aW9ucy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBsb2NhbGUgaWRlbnRpZmllciB0byB1c2Ugd2hlbiB0cmFuc2xhdGluZyBjb21wb25lbnQgdGV4dC5cbiAgICogVGhpcyBjYW4gYmUgc2V0IGV4cGxpY2l0bHkgdmlhIGlucHV0IHByb3BlcnR5IHRvIG92ZXJyaWRlIHRoZSBhdXRvbWF0aWNhbGx5IGRlcml2ZWRcbiAgICogbG9jYWxlIGZyb20gdGhlIGNvbXBvbmVudCBuYW1lLiBUaGUgbG9jYWxlIGlzIHR5cGljYWxseSBhIGxhbmd1YWdlIGNvZGUgKGUuZy4sICdlbicsICdmcicpXG4gICAqIG9yIGEgbGFuZ3VhZ2UtcmVnaW9uIGNvZGUgKGUuZy4sICdlbi1VUycsICdmci1DQScpIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCB0cmFuc2xhdGlvblxuICAgKiBzZXQgdG8gdXNlIGZvciB0aGUgY29tcG9uZW50J3MgdGV4dCBjb250ZW50LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbG9jYWxlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiB0aGUgY29tcG9uZW50IHNob3VsZCBiZSB0cmFuc2xhdGVkLlxuICAgKiBAc3VtbWFyeSBDb250cm9scyB3aGV0aGVyIHRoZSBjb21wb25lbnQncyB0ZXh0IGNvbnRlbnQgc2hvdWxkIGJlIHByb2Nlc3NlZCBmb3IgdHJhbnNsYXRpb24uXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGNvbXBvbmVudCB3aWxsIGF0dGVtcHQgdG8gdHJhbnNsYXRlIHRleHQgdXNpbmcgdGhlIHNwZWNpZmllZCBsb2NhbGUuXG4gICAqIFdoZW4gZmFsc2UsIHRleHQgaXMgZGlzcGxheWVkIGFzLWlzIHdpdGhvdXQgdHJhbnNsYXRpb24uIFRoaXMgcHJvcGVydHkgYWNjZXB0cyBlaXRoZXJcbiAgICogYSBib29sZWFuIHZhbHVlIG9yIGEgc3RyaW5nIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhIGJvb2xlYW4gKGUuZy4sICd0cnVlJywgJ2ZhbHNlJywgJzEnLCAnMCcpLlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdHJhbnNsYXRhYmxlOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRkaXRpb25hbCBDU1MgY2xhc3MgbmFtZXMgdG8gYXBwbHkgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgQWxsb3dzIGN1c3RvbSBDU1MgY2xhc3NlcyB0byBiZSBhZGRlZCB0byB0aGUgY29tcG9uZW50J3Mgcm9vdCBlbGVtZW50LlxuICAgKiBUaGVzZSBjbGFzc2VzIGFyZSBhcHBlbmRlZCB0byBhbnkgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgY2xhc3NlcyBiYXNlZCBvbiBvdGhlclxuICAgKiBjb21wb25lbnQgcHJvcGVydGllcy4gTXVsdGlwbGUgY2xhc3NlcyBjYW4gYmUgcHJvdmlkZWQgYXMgYSBzcGFjZS1zZXBhcmF0ZWQgc3RyaW5nLlxuICAgKiBUaGlzIHByb3ZpZGVzIGEgd2F5IHRvIGN1c3RvbWl6ZSB0aGUgY29tcG9uZW50J3MgYXBwZWFyYW5jZSBiZXlvbmQgdGhlIGJ1aWx0LWluIHN0eWxpbmcgb3B0aW9ucy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgXCJcIlxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgY2xhc3NOYW1lOiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBwbGF0Zm9ybSBzdHlsZS5cbiAgICogQHN1bW1hcnkgQ29udHJvbHMgdGhlIHZpc3VhbCBhcHBlYXJhbmNlIG9mIHRoZSBjb21wb25lbnQgYmFzZWQgb24gcGxhdGZvcm0gZGVzaWduIGd1aWRlbGluZXMuXG4gICAqIFRoZSAnaW9zJyBtb2RlIGZvbGxvd3MgaU9TIGRlc2lnbiBwYXR0ZXJucywgd2hpbGUgJ21kJyAoTWF0ZXJpYWwgRGVzaWduKSBmb2xsb3dzIEFuZHJvaWQvR29vZ2xlXG4gICAqIGRlc2lnbiBwYXR0ZXJucy4gVGhpcyBwcm9wZXJ0eSBhZmZlY3RzIHZhcmlvdXMgdmlzdWFsIGFzcGVjdHMgc3VjaCBhcyBhbmltYXRpb25zLCBmb3JtIGVsZW1lbnRzLFxuICAgKiBhbmQgaWNvbnMuIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBhbGxvd3MgY29tcG9uZW50cyB0byBtYWludGFpbiBwbGF0Zm9ybS1zcGVjaWZpYyBzdHlsaW5nXG4gICAqIGZvciBhIG1vcmUgbmF0aXZlIGxvb2sgYW5kIGZlZWwuXG4gICAqXG4gICAqIEB0eXBlIHsoXCJpb3NcIiB8IFwibWRcIiB8IHVuZGVmaW5lZCl9XG4gICAqIEBkZWZhdWx0IFwibWRcIlxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbW9kZTogJ2lvcycgfCAnbWQnIHwgdW5kZWZpbmVkID0gJ21kJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBsb2NhbGUgZGVyaXZlZCBmcm9tIHRoZSBjb21wb25lbnQncyBjbGFzcyBuYW1lLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGF1dG9tYXRpY2FsbHkgZGVyaXZlZCBsb2NhbGUgYmFzZWQgb24gdGhlIGNvbXBvbmVudCdzIGNsYXNzIG5hbWUuXG4gICAqIFRoaXMgaXMgZGV0ZXJtaW5lZCBkdXJpbmcgY29tcG9uZW50IGluaXRpYWxpemF0aW9uIGFuZCBzZXJ2ZXMgYXMgYSBmYWxsYmFjayB3aGVuIG5vXG4gICAqIGV4cGxpY2l0IGxvY2FsZSBpcyBwcm92aWRlZCB2aWEgdGhlIGxvY2FsZSBpbnB1dCBwcm9wZXJ0eS4gVGhlIGRlcml2YXRpb24gaXMgaGFuZGxlZFxuICAgKiBieSB0aGUgZ2V0TG9jYWxlRnJvbUNsYXNzTmFtZSB1dGlsaXR5IGZ1bmN0aW9uLCB3aGljaCBleHRyYWN0cyBhIGxvY2FsZSBpZGVudGlmaWVyXG4gICAqIGZyb20gdGhlIGNvbXBvbmVudCdzIGNsYXNzIG5hbWUuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBjb21wb25lbnRMb2NhbGUhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIGNoaWxkIGNvbXBvbmVudHMgc2hvdWxkIGJlIHJlbmRlcmVkXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgY2hpbGQgY29tcG9uZW50cyBzaG91bGQgYmUgcmVuZGVyZWQgYnkgdGhlIGNvbXBvbmVudC5cbiAgICogVGhpcyBjYW4gYmUgc2V0IHRvIGEgYm9vbGVhbiB2YWx1ZSBvciBhIHN0cmluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBib29sZWFuLlxuICAgKiBXaGVuIHRydWUsIGNoaWxkIGNvbXBvbmVudHMgZGVmaW5lZCBpbiB0aGUgbW9kZWwgd2lsbCBiZSByZW5kZXJlZC4gV2hlbiBmYWxzZSxcbiAgICogY2hpbGQgY29tcG9uZW50cyB3aWxsIGJlIHNraXBwZWQuIFRoaXMgcHJvdmlkZXMgY29udHJvbCBvdmVyIHRoZSByZW5kZXJpbmcgZGVwdGguXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHJlbmRlckNoaWxkOiBzdHJpbmcgfCBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gaW5pdGlhbGl6ZWRcbiAgICogQHN1bW1hcnkgVHJhY2tzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkIGl0cyBpbml0aWFsaXphdGlvbiBwcm9jZXNzLlxuICAgKiBUaGlzIGZsYWcgaXMgdXNlZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBpbml0aWFsaXphdGlvbiBhbmQgdG8gZGV0ZXJtaW5lIGlmXG4gICAqIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgaW5pdGlhbGl6YXRpb24gY2FuIGJlIHBlcmZvcm1lZC5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBpbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgZW1pdHRlciBmb3IgY3VzdG9tIHJlbmRlcmVyIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgRW1pdHMgY3VzdG9tIGV2ZW50cyB0aGF0IG9jY3VyIHdpdGhpbiBjaGlsZCBjb21wb25lbnRzIG9yIHRoZSBsYXlvdXQgaXRzZWxmLlxuICAgKiBUaGlzIGFsbG93cyBwYXJlbnQgY29tcG9uZW50cyB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHVzZXIgaW50ZXJhY3Rpb25zIG9yXG4gICAqIHN0YXRlIGNoYW5nZXMgd2l0aGluIHRoZSBncmlkIGxheW91dC4gRXZlbnRzIGFyZSBwYXNzZWQgdXAgdGhlIGNvbXBvbmVudCBoaWVyYXJjaHlcbiAgICogdG8gZW5hYmxlIGNvb3JkaW5hdGVkIGJlaGF2aW9yIGFjcm9zcyB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudEVtaXR0ZXI8UmVuZGVyZXJDdXN0b21FdmVudD59XG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBAT3V0cHV0KClcbiAgbGlzdGVuRXZlbnQ6IEV2ZW50RW1pdHRlcjxSZW5kZXJlckN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVuZGVyZXJDdXN0b21FdmVudD4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZmVyZW5jZSB0byB0aGUgcmVuZGVyaW5nIGVuZ2luZSBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIE5neFJlbmRlcmluZ0VuZ2luZTIgc2luZ2xldG9uIGluc3RhbmNlLFxuICAgKiB3aGljaCBoYW5kbGVzIHRoZSByZW5kZXJpbmcgb2YgY29tcG9uZW50cyBiYXNlZCBvbiBtb2RlbCBkZWZpbml0aW9ucy5cbiAgICogVGhpcyBlbmdpbmUgaXMgdXNlZCB0byBleHRyYWN0IGRlY29yYXRvciBtZXRhZGF0YSBhbmQgcmVuZGVyIGNoaWxkIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEB0eXBlIHtOZ3hSZW5kZXJpbmdFbmdpbmUyfVxuICAgKi9cbiAgcmVuZGVyaW5nRW5naW5lOiBOZ3hSZW5kZXJpbmdFbmdpbmUyID1cbiAgICBOZ3hSZW5kZXJpbmdFbmdpbmUyLmdldCgpIGFzIHVua25vd24gYXMgTmd4UmVuZGVyaW5nRW5naW5lMjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgbG9nZ2luZyBjYXBhYmlsaXRpZXMgZm9yIHRoZSBjb21wb25lbnQsIGFsbG93aW5nIGZvciBjb25zaXN0ZW50XG4gICAqIGFuZCBzdHJ1Y3R1cmVkIGxvZ2dpbmcgb2YgaW5mb3JtYXRpb24sIHdhcm5pbmdzLCBhbmQgZXJyb3JzLiBUaGlzIGxvZ2dlciBpcyBpbml0aWFsaXplZFxuICAgKiBpbiB0aGUgbmdPbkluaXQgbWV0aG9kIHVzaW5nIHRoZSBnZXRMb2dnZXIgZnVuY3Rpb24gZnJvbSB0aGUgRm9yQW5ndWxhck1vZHVsZS5cbiAgICpcbiAgICogVGhlIGxvZ2dlciBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGNvbXBvbmVudCB0byByZWNvcmQgaW1wb3J0YW50IGV2ZW50cywgZGVidWcgaW5mb3JtYXRpb24sXG4gICAqIGFuZCBwb3RlbnRpYWwgaXNzdWVzLiBJdCBoZWxwcyBpbiBtb25pdG9yaW5nIHRoZSBjb21wb25lbnQncyBiZWhhdmlvciwgdHJhY2tpbmcgdGhlIGZsb3dcbiAgICogb2Ygb3BlcmF0aW9ucywgYW5kIGZhY2lsaXRhdGluZyBlYXNpZXIgZGVidWdnaW5nIGFuZCBtYWludGVuYW5jZS5cbiAgICpcbiAgICogQHR5cGUge0xvZ2dlcn1cbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIGxvZ2dlciE6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTmd4QmFzZUNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGJhc2UgY29tcG9uZW50IHdpdGggdGhlIHByb3ZpZGVkIGluc3RhbmNlIHRva2VuLlxuICAgKiBUaGlzIGNvbnN0cnVjdG9yIHNldHMgdXAgdGhlIGZ1bmRhbWVudGFsIHByb3BlcnRpZXMgcmVxdWlyZWQgYnkgYWxsIERlY2FmIGNvbXBvbmVudHMsXG4gICAqIGluY2x1ZGluZyB0aGUgY29tcG9uZW50IG5hbWUsIGxvY2FsZSBzZXR0aW5ncywgYW5kIGxvZ2dpbmcgY2FwYWJpbGl0aWVzLiBUaGUgaW5zdGFuY2VcbiAgICogdG9rZW4gaXMgdXNlZCBmb3IgY29tcG9uZW50IGlkZW50aWZpY2F0aW9uIGFuZCBsb2NhbGUgZGVyaXZhdGlvbi5cbiAgICpcbiAgICogVGhlIGNvbnN0cnVjdG9yIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gc3RlcHM6XG4gICAqIDEuIFNldHMgdGhlIGNvbXBvbmVudE5hbWUgZnJvbSB0aGUgcHJvdmlkZWQgaW5zdGFuY2UgdG9rZW5cbiAgICogMi4gRGVyaXZlcyB0aGUgY29tcG9uZW50TG9jYWxlIGZyb20gdGhlIGNsYXNzIG5hbWUgdXNpbmcgdXRpbGl0eSBmdW5jdGlvbnNcbiAgICogMy4gSW5pdGlhbGl6ZXMgdGhlIGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIGNvbXBvbmVudFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5zdGFuY2UgLSBUaGUgY29tcG9uZW50IGluc3RhbmNlIHRva2VuIHVzZWQgZm9yIGlkZW50aWZpY2F0aW9uXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQW5ndWxhclxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgQiBhcyBOZ3hCYXNlQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVdGlsc1xuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTG9nZ2VyXG4gICAqXG4gICAqICAgQS0+PkM6IG5ldyBDb21wb25lbnQoaW5zdGFuY2UpXG4gICAqICAgQy0+PkI6IHN1cGVyKGluc3RhbmNlKVxuICAgKiAgIEItPj5COiBTZXQgY29tcG9uZW50TmFtZSA9IGluc3RhbmNlXG4gICAqICAgQi0+PlU6IGdldExvY2FsZUZyb21DbGFzc05hbWUoaW5zdGFuY2UpXG4gICAqICAgVS0tPj5COiBSZXR1cm4gZGVyaXZlZCBsb2NhbGVcbiAgICogICBCLT4+QjogU2V0IGNvbXBvbmVudExvY2FsZVxuICAgKiAgIEItPj5MOiBnZXRMb2dnZXIodGhpcylcbiAgICogICBMLS0+PkI6IFJldHVybiBsb2dnZXIgaW5zdGFuY2VcbiAgICogICBCLT4+QjogU2V0IGxvZ2dlclxuICAgKlxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9wcmVmZXItaW5qZWN0XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihASW5qZWN0KCdpbnN0YW5jZVRva2VuJykgcHJvdGVjdGVkIGluc3RhbmNlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbXBvbmVudE5hbWUgPSBpbnN0YW5jZTtcbiAgICB0aGlzLmNvbXBvbmVudExvY2FsZSA9IGdldExvY2FsZUZyb21DbGFzc05hbWUoaW5zdGFuY2UpO1xuICAgIHRoaXMubG9nZ2VyID0gZ2V0TG9nZ2VyKHRoaXMpO1xuICAgIHRoaXMuZ2V0TG9jYWxlKHRoaXMudHJhbnNsYXRhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0dGVyIGZvciB0aGUgcmVwb3NpdG9yeSBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhIGxheWVyIGZvciByZXRyaWV2aW5nIGFuZCBtYW5pcHVsYXRpbmcgZGF0YS5cbiAgICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGhlIGBfcmVwb3NpdG9yeWAgcHJvcGVydHkgaWYgaXQgaXMgbm90IGFscmVhZHkgc2V0LCBlbnN1cmluZ1xuICAgKiB0aGF0IGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSByZXBvc2l0b3J5IGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBUaGUgcmVwb3NpdG9yeSBpcyB1c2VkIHRvIHBlcmZvcm0gQ1JVRCBvcGVyYXRpb25zIG9uIHRoZSBkYXRhIG1vZGVsLCBzdWNoIGFzIGZldGNoaW5nIGRhdGEsXG4gICAqIGNyZWF0aW5nIG5ldyBpdGVtcywgdXBkYXRpbmcgZXhpc3RpbmcgaXRlbXMsIGFuZCBkZWxldGluZyBpdGVtcy4gSXQgYWxzbyBwcm92aWRlcyBtZXRob2RzXG4gICAqIGZvciBxdWVyeWluZyBhbmQgZmlsdGVyaW5nIGRhdGEgYmFzZWQgb24gc3BlY2lmaWMgY3JpdGVyaWEuXG4gICAqXG4gICAqIEByZXR1cm5zIHtEZWNhZlJlcG9zaXRvcnk8TW9kZWw+fSBUaGUgaW5pdGlhbGl6ZWQgcmVwb3NpdG9yeSBpbnN0YW5jZS5cbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIE5neEJhc2VDb21wb25lbnRcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcmVwb3NpdG9yeSgpOiBEZWNhZlJlcG9zaXRvcnk8TW9kZWw+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLl9yZXBvc2l0b3J5KSB7XG4gICAgICAgIGNvbnN0IG1vZGVsTmFtZSAgPSAodGhpcy5tb2RlbCBhcyBNb2RlbCkuY29uc3RydWN0b3IubmFtZVxuICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IE1vZGVsLmdldChtb2RlbE5hbWUpO1xuICAgICAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgJ0Nhbm5vdCBmaW5kIG1vZGVsLiB3YXMgaXQgcmVnaXN0ZXJlZCB3aXRoIEBtb2RlbD8nLFxuICAgICAgICAgICk7XG4gICAgICAgIHRoaXMuX3JlcG9zaXRvcnkgPSBSZXBvc2l0b3J5LmZvck1vZGVsKGNvbnN0cnVjdG9yKTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IG5ldyBjb25zdHJ1Y3RvcigpIGFzIE1vZGVsO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgKGVycm9yIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBlcnJvciBhcyBzdHJpbmdcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXBvc2l0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW5kIGFwcGxpZXMgcHJvcGVydGllcyBmcm9tIHRoZSBwcm9wcyBvYmplY3QgdG8gdGhlIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcHJvdmlkZWQgaW5zdGFuY2Ugb2JqZWN0XG4gICAqIGFuZCBhcHBsaWVzIGFueSBtYXRjaGluZyBwcm9wZXJ0aWVzIGZyb20gdGhlIGNvbXBvbmVudCdzIHByb3BzIGNvbmZpZ3VyYXRpb24gdG8gdGhlXG4gICAqIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhpcyBhbGxvd3MgZm9yIGR5bmFtaWMgcHJvcGVydHkgYXNzaWdubWVudCBiYXNlZCBvbiBjb25maWd1cmF0aW9uXG4gICAqIHN0b3JlZCBpbiB0aGUgcHJvcHMgb2JqZWN0LCBlbmFibGluZyBmbGV4aWJsZSBjb21wb25lbnQgY3VzdG9taXphdGlvbiB3aXRob3V0IHJlcXVpcmluZ1xuICAgKiBleHBsaWNpdCBwcm9wZXJ0eSBiaW5kaW5nIGZvciBldmVyeSBwb3NzaWJsZSBjb25maWd1cmF0aW9uIG9wdGlvbi5cbiAgICpcbiAgICogVGhlIG1ldGhvZCBwZXJmb3JtcyBhIHNhZmUgcHJvcGVydHkgYXNzaWdubWVudCBieSBjaGVja2luZyBpZiBlYWNoIGtleSBmcm9tIHRoZSBpbnN0YW5jZVxuICAgKiBleGlzdHMgaW4gdGhlIHByb3BzIG9iamVjdCBiZWZvcmUgYXBwbHlpbmcgaXQuIFRoaXMgcHJldmVudHMgYWNjaWRlbnRhbCBwcm9wZXJ0eVxuICAgKiBvdmVyd3JpdGluZyBhbmQgZW5zdXJlcyBvbmx5IGludGVuZGVkIHByb3BlcnRpZXMgYXJlIG1vZGlmaWVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0tleVZhbHVlfSBpbnN0YW5jZSAtIFRoZSBjb21wb25lbnQgaW5zdGFuY2Ugb2JqZWN0IHRvIHByb2Nlc3NcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBCIGFzIE5neEJhc2VDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBQIGFzIFByb3BzIE9iamVjdFxuICAgKlxuICAgKiAgIEMtPj5COiBwYXJzZVByb3BzKGluc3RhbmNlKVxuICAgKiAgIEItPj5COiBHZXQgT2JqZWN0LmtleXMoaW5zdGFuY2UpXG4gICAqICAgbG9vcCBGb3IgZWFjaCBrZXkgaW4gaW5zdGFuY2VcbiAgICogICAgIEItPj5QOiBDaGVjayBpZiBrZXkgZXhpc3RzIGluIHRoaXMucHJvcHNcbiAgICogICAgIGFsdCBLZXkgZXhpc3RzIGluIHByb3BzXG4gICAqICAgICAgIEItPj5COiBTZXQgdGhpc1trZXldID0gdGhpcy5wcm9wc1trZXldXG4gICAqICAgICBlbHNlIEtleSBub3QgaW4gcHJvcHNcbiAgICogICAgICAgTm90ZSBvdmVyIEI6IFNraXAgdGhpcyBrZXlcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgcGFyc2VQcm9wcyhpbnN0YW5jZTogS2V5VmFsdWUpOiB2b2lkIHtcbiAgICBPYmplY3Qua2V5cyhpbnN0YW5jZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZihPYmplY3Qua2V5cyh0aGlzLnByb3BzKS5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAodGhpcyBhcyBLZXlWYWx1ZSlba2V5XSA9IHRoaXMucHJvcHNba2V5XTtcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGNoYW5nZXMgdG8gY29tcG9uZW50IGlucHV0c1xuICAgKiBAc3VtbWFyeSBUaGlzIEFuZ3VsYXIgbGlmZWN5Y2xlIGhvb2sgaXMgY2FsbGVkIHdoZW4gaW5wdXQgcHJvcGVydGllcyBjaGFuZ2UuXG4gICAqIEl0IHJlc3BvbmRzIHRvIGNoYW5nZXMgaW4gdGhlIG1vZGVsLCBsb2NhbGUsIG9yIHRyYW5zbGF0YWJsZSBwcm9wZXJ0aWVzIGJ5XG4gICAqIHVwZGF0aW5nIHRoZSBjb21wb25lbnQncyBpbnRlcm5hbCBzdGF0ZSBhY2NvcmRpbmdseS4gV2hlbiB0aGUgbW9kZWwgY2hhbmdlcyxcbiAgICogaXQgY2FsbHMgZ2V0TW9kZWwgdG8gcHJvY2VzcyB0aGUgbmV3IG1vZGVsIGFuZCBnZXRMb2NhbGUgdG8gdXBkYXRlIHRoZSBsb2NhbGUuXG4gICAqIFdoZW4gbG9jYWxlIG9yIHRyYW5zbGF0YWJsZSBwcm9wZXJ0aWVzIGNoYW5nZSwgaXQgY2FsbHMgZ2V0TG9jYWxlIHRvIHVwZGF0ZVxuICAgKiB0aGUgdHJhbnNsYXRpb24gc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB7U2ltcGxlQ2hhbmdlc30gY2hhbmdlcyAtIE9iamVjdCBjb250YWluaW5nIGNoYW5nZWQgcHJvcGVydGllc1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzW0Jhc2VDb21wb25lbnRQcm9wcy5NT0RFTF0pIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSBjaGFuZ2VzW0Jhc2VDb21wb25lbnRQcm9wcy5NT0RFTF07XG4gICAgICBpZiAoY3VycmVudFZhbHVlKSB0aGlzLmdldE1vZGVsKGN1cnJlbnRWYWx1ZSk7XG4gICAgICB0aGlzLmdldExvY2FsZSh0aGlzLnRyYW5zbGF0YWJsZSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbQmFzZUNvbXBvbmVudFByb3BzLklOSVRJQUxJWkVEXSB8fFxuICAgICAgY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuTE9DQUxFXSB8fFxuICAgICAgY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuVFJBTlNMQVRBQkxFXVxuICAgIClcbiAgICAgIHRoaXMuZ2V0TG9jYWxlKHRoaXMudHJhbnNsYXRhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYXBwcm9wcmlhdGUgbG9jYWxlIHN0cmluZyBiYXNlZCBvbiB0aGUgdHJhbnNsYXRhYmxlIGZsYWcgYW5kIGF2YWlsYWJsZSBsb2NhbGVzLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoaWNoIGxvY2FsZSBzdHJpbmcgdG8gdXNlIGZvciB0cmFuc2xhdGlvbiBiYXNlZCBvbiB0aGUgdHJhbnNsYXRhYmxlIGZsYWdcbiAgICogYW5kIGF2YWlsYWJsZSBsb2NhbGUgc2V0dGluZ3MuIFRoaXMgbWV0aG9kIGZpcnN0IGNvbnZlcnRzIHRoZSB0cmFuc2xhdGFibGUgcGFyYW1ldGVyIHRvIGEgYm9vbGVhblxuICAgKiB1c2luZyB0aGUgc3RyaW5nVG9Cb29sZWFuIHV0aWxpdHkgZnVuY3Rpb24uIElmIHRyYW5zbGF0YWJsZSBpcyBmYWxzZSwgaXQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcsXG4gICAqIGluZGljYXRpbmcgbm8gdHJhbnNsYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSWYgdHJhbnNsYXRhYmxlIGlzIHRydWUsIGl0IGNoZWNrcyBmb3IgYW4gZXhwbGljaXRseVxuICAgKiBwcm92aWRlZCBsb2NhbGUgdmlhIHRoZSBsb2NhbGUgcHJvcGVydHkuIElmIG5vIGV4cGxpY2l0IGxvY2FsZSBpcyBhdmFpbGFibGUsIGl0IGZhbGxzIGJhY2sgdG8gdGhlXG4gICAqIGNvbXBvbmVudExvY2FsZSBkZXJpdmVkIGZyb20gdGhlIGNvbXBvbmVudCdzIGNsYXNzIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nT3JCb29sZWFufSB0cmFuc2xhdGFibGUgLSBXaGV0aGVyIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHRyYW5zbGF0ZWRcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgbG9jYWxlIHN0cmluZyB0byB1c2UgZm9yIHRyYW5zbGF0aW9uLCBvciBlbXB0eSBzdHJpbmcgaWYgbm90IHRyYW5zbGF0YWJsZVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIENvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IE4gYXMgTmd4QmFzZUNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IFMgYXMgU3RyaW5nVXRpbHNcbiAgICpcbiAgICogICBDLT4+TjogZ2V0TG9jYWxlKHRyYW5zbGF0YWJsZSlcbiAgICogICBOLT4+Uzogc3RyaW5nVG9Cb29sZWFuKHRyYW5zbGF0YWJsZSlcbiAgICogICBTLS0+Pk46IFJldHVybiBib29sZWFuIHZhbHVlXG4gICAqICAgTi0+Pk46IFN0b3JlIGluIHRoaXMudHJhbnNsYXRhYmxlXG4gICAqICAgYWx0IHRyYW5zbGF0YWJsZSBpcyBmYWxzZVxuICAgKiAgICAgTi0tPj5DOiBSZXR1cm4gZW1wdHkgc3RyaW5nXG4gICAqICAgZWxzZSB0cmFuc2xhdGFibGUgaXMgdHJ1ZVxuICAgKiAgICAgYWx0IHRoaXMubG9jYWxlIGlzIGRlZmluZWRcbiAgICogICAgICAgTi0tPj5DOiBSZXR1cm4gdGhpcy5sb2NhbGVcbiAgICogICAgIGVsc2UgdGhpcy5sb2NhbGUgaXMgbm90IGRlZmluZWRcbiAgICogICAgICAgTi0tPj5DOiBSZXR1cm4gdGhpcy5jb21wb25lbnRMb2NhbGVcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgZ2V0TG9jYWxlKHRyYW5zbGF0YWJsZTogU3RyaW5nT3JCb29sZWFuKTogc3RyaW5nIHtcbiAgICB0aGlzLnRyYW5zbGF0YWJsZSA9IHN0cmluZ1RvQm9vbGVhbih0cmFuc2xhdGFibGUpO1xuICAgIGlmICghdGhpcy50cmFuc2xhdGFibGUpXG4gICAgICByZXR1cm4gJyc7XG4gICAgaWYgKCF0aGlzLmxvY2FsZSlcbiAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5jb21wb25lbnRMb2NhbGU7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSByb3V0ZSBmb3IgdGhlIGNvbXBvbmVudFxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHJvdXRlIHBhdGggZm9yIHRoZSBjb21wb25lbnQsIGdlbmVyYXRpbmcgb25lIGJhc2VkIG9uIHRoZSBtb2RlbFxuICAgKiBpZiBubyByb3V0ZSBpcyBleHBsaWNpdGx5IHNldC4gVGhpcyBtZXRob2QgY2hlY2tzIGlmIGEgcm91dGUgaXMgYWxyZWFkeSBkZWZpbmVkLCBhbmQgaWYgbm90LFxuICAgKiBpdCBjcmVhdGVzIGEgZGVmYXVsdCByb3V0ZSBiYXNlZCBvbiB0aGUgbW9kZWwncyBjb25zdHJ1Y3RvciBuYW1lLiBUaGUgZ2VuZXJhdGVkIHJvdXRlIGZvbGxvd3NcbiAgICogdGhlIHBhdHRlcm4gJy9tb2RlbC97TW9kZWxOYW1lfScuIFRoaXMgaXMgdXNlZnVsIGZvciBhdXRvbWF0aWMgcm91dGluZyBpbiBDUlVEIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJvdXRlIHBhdGggZm9yIHRoZSBjb21wb25lbnQsIG9yIGVtcHR5IHN0cmluZyBpZiBubyByb3V0ZSBpcyBhdmFpbGFibGVcbiAgICovXG4gIGdldFJvdXRlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnJvdXRlICYmIHRoaXMubW9kZWwgaW5zdGFuY2VvZiBNb2RlbClcbiAgICAgIHRoaXMucm91dGUgPSBgL21vZGVsLyR7dGhpcy5tb2RlbD8uY29uc3RydWN0b3IubmFtZX1gO1xuICAgIHJldHVybiB0aGlzLnJvdXRlIHx8ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXNvbHZlcyBhbmQgc2V0cyB0aGUgY29tcG9uZW50J3MgbW9kZWxcbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIHRoZSBwcm92aWRlZCBtb2RlbCBwYXJhbWV0ZXIsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBNb2RlbCBpbnN0YW5jZVxuICAgKiBvciBhIHN0cmluZyBpZGVudGlmaWVyLiBJZiBhIHN0cmluZyBpcyBwcm92aWRlZCwgaXQgYXR0ZW1wdHMgdG8gcmVzb2x2ZSB0aGUgYWN0dWFsIG1vZGVsXG4gICAqIGZyb20gdGhlIGluamVjdGFibGVzIHJlZ2lzdHJ5LiBBZnRlciByZXNvbHZpbmcgdGhlIG1vZGVsLCBpdCBjYWxscyBzZXRNb2RlbERlZmluaXRpb25zXG4gICAqIHRvIGNvbmZpZ3VyZSB0aGUgY29tcG9uZW50IGJhc2VkIG9uIHRoZSBtb2RlbCdzIG1ldGFkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IE1vZGVsfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBpZGVudGlmaWVyIHN0cmluZ1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgZ2V0TW9kZWwobW9kZWw6IHN0cmluZyB8IE1vZGVsKTogdm9pZCB7XG4gICAgaWYgKCEobW9kZWwgaW5zdGFuY2VvZiBNb2RlbCkpXG4gICAgICB0aGlzLm1vZGVsID0gZ2V0SW5qZWN0YWJsZXNSZWdpc3RyeSgpLmdldChtb2RlbCkgYXMgTW9kZWw7XG4gICAgdGhpcy5zZXRNb2RlbERlZmluaXRpb25zKHRoaXMubW9kZWwgYXMgTW9kZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmVzIGNvbXBvbmVudCBwcm9wZXJ0aWVzIGJhc2VkIG9uIG1vZGVsIG1ldGFkYXRhXG4gICAqIEBzdW1tYXJ5IEV4dHJhY3RzIGFuZCBhcHBsaWVzIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgbW9kZWwncyBkZWNvcmF0b3JzIHRvIHNldCB1cFxuICAgKiB0aGUgY29tcG9uZW50LiBUaGlzIG1ldGhvZCB1c2VzIHRoZSByZW5kZXJpbmcgZW5naW5lIHRvIHJldHJpZXZlIGRlY29yYXRvciBtZXRhZGF0YVxuICAgKiBmcm9tIHRoZSBtb2RlbCwgdGhlbiBjb25maWd1cmVzIHRoZSBjb21wb25lbnQncyBtYXBwZXIgYW5kIGl0ZW0gcHJvcGVydGllcyBhY2NvcmRpbmdseS5cbiAgICogSXQgZW5zdXJlcyB0aGUgcm91dGUgaXMgcHJvcGVybHkgc2V0IGFuZCBtZXJnZXMgdmFyaW91cyBwcm9wZXJ0aWVzIGZyb20gdGhlIG1vZGVsJ3NcbiAgICogbWV0YWRhdGEgaW50byB0aGUgY29tcG9uZW50J3MgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtNb2RlbH0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gZXh0cmFjdCBjb25maWd1cmF0aW9uIGZyb21cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHNldE1vZGVsRGVmaW5pdGlvbnMobW9kZWw6IE1vZGVsKTogdm9pZCB7XG4gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgTW9kZWwpIHtcbiAgICAgIHRoaXMuZ2V0Um91dGUoKTtcbiAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5yZW5kZXJpbmdFbmdpbmUuZ2V0RGVjb3JhdG9ycyh0aGlzLm1vZGVsIGFzIE1vZGVsLCB7fSk7XG4gICAgICBjb25zdHsgcHJvcHMsIGl0ZW0sIGNoaWxkcmVuIH0gPSBmaWVsZDtcbiAgICAgIHRoaXMucHJvcHMgPSBPYmplY3QuYXNzaWduKHByb3BzIHx8IHt9LCB7Y2hpbGRyZW46IGNoaWxkcmVuIHx8IFtdfSk7XG4gICAgICBpZihpdGVtPy5wcm9wcz8uWydtYXBwZXInXSlcbiAgICAgICAgdGhpcy5tYXBwZXIgPSBpdGVtPy5wcm9wcyFbJ21hcHBlciddIHx8IHt9O1xuICAgICAgdGhpcy5pdGVtID0ge1xuICAgICAgICB0YWc6IGl0ZW0/LnRhZyB8fCAnJyxcbiAgICAgICAgLi4uaXRlbT8ucHJvcHMsXG4gICAgICAgIC4uLih0aGlzLm1hcHBlciA/IHttYXBwZXI6IHRoaXMubWFwcGVyfSA6IHt9KSxcbiAgICAgICAgLi4ueyByb3V0ZTogaXRlbT8ucHJvcHM/Llsncm91dGUnXSB8fCB0aGlzLnJvdXRlIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudFxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBvbmUtdGltZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgY29tcG9uZW50LiBUaGlzIG1ldGhvZCBjaGVja3MgaWZcbiAgICogdGhlIGNvbXBvbmVudCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHRvIHByZXZlbnQgZHVwbGljYXRlIGluaXRpYWxpemF0aW9uLlxuICAgKiBXaGVuIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUsIGl0IHNldHMgdGhlIGluaXRpYWxpemVkIGZsYWcgdG8gdHJ1ZSBhbmQgbG9nc1xuICAgKiBhbiBpbml0aWFsaXphdGlvbiBtZXNzYWdlIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lLiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgY2FsbGVkXG4gICAqIGR1cmluZyB0aGUgY29tcG9uZW50J3MgbGlmZWN5Y2xlIHNldHVwLlxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBjdXN0b20gZXZlbnRzIGZyb20gY2hpbGQgY29tcG9uZW50cy5cbiAgICogQHN1bW1hcnkgUmVjZWl2ZXMgZXZlbnRzIGZyb20gY2hpbGQgcmVuZGVyZXIgY29tcG9uZW50cyBhbmQgZm9yd2FyZHMgdGhlbSB0byBwYXJlbnRcbiAgICogY29tcG9uZW50cyB0aHJvdWdoIHRoZSBsaXN0ZW5FdmVudCBvdXRwdXQuIFRoaXMgY3JlYXRlcyBhbiBldmVudCBwcm9wYWdhdGlvbiBjaGFpblxuICAgKiB0aGF0IGFsbG93cyBldmVudHMgdG8gYnViYmxlIHVwIHRocm91Z2ggdGhlIGNvbXBvbmVudCBoaWVyYXJjaHksIGVuYWJsaW5nIGNvb3JkaW5hdGVkXG4gICAqIHJlc3BvbnNlcyB0byB1c2VyIGludGVyYWN0aW9ucyBhY3Jvc3MgdGhlIGxheW91dCBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVuZGVyZXJDdXN0b21FdmVudH0gZXZlbnQgLSBUaGUgY3VzdG9tIGV2ZW50IGZyb20gYSBjaGlsZCBjb21wb25lbnRcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDaGlsZCBDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIE5neEJhc2VDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBQIGFzIFBhcmVudCBDb21wb25lbnRcbiAgICpcbiAgICogICBDLT4+TDogRW1pdCBSZW5kZXJlckN1c3RvbUV2ZW50XG4gICAqICAgTC0+Pkw6IGhhbmRsZUV2ZW50KGV2ZW50KVxuICAgKiAgIEwtPj5QOiBsaXN0ZW5FdmVudC5lbWl0KGV2ZW50KVxuICAgKiAgIE5vdGUgb3ZlciBQOiBIYW5kbGUgZXZlbnQgaW4gcGFyZW50XG4gICAqXG4gICAqIEBtZW1iZXJPZiBOZ3hCYXNlQ29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVFdmVudChldmVudDogUmVuZGVyZXJDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIHRoaXMubGlzdGVuRXZlbnQuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRyYWNrcyBpdGVtcyBpbiBuZ0ZvciBsb29wcyBmb3Igb3B0aW1hbCBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHRyYWNraW5nIGZ1bmN0aW9uIGZvciBBbmd1bGFyJ3MgKm5nRm9yIGRpcmVjdGl2ZSB0byBvcHRpbWl6ZSByZW5kZXJpbmdcbiAgICogcGVyZm9ybWFuY2UuIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIGxpc3QgaXRlbXMgYmFzZWQgb24gdGhlaXIgaW5kZXhcbiAgICogYW5kIGNvbnRlbnQsIGFsbG93aW5nIEFuZ3VsYXIgdG8gZWZmaWNpZW50bHkgdHJhY2sgY2hhbmdlcyBhbmQgbWluaW1pemUgRE9NIG1hbmlwdWxhdGlvbnNcbiAgICogZHVyaW5nIGxpc3QgdXBkYXRlcy4gVGhlIHRyYWNraW5nIGZ1bmN0aW9uIGlzIGVzc2VudGlhbCBmb3IgbWFpbnRhaW5pbmcgY29tcG9uZW50IHN0YXRlXG4gICAqIGFuZCBwcmV2ZW50aW5nIHVubmVjZXNzYXJ5IHJlLXJlbmRlcmluZyBvZiB1bmNoYW5nZWQgaXRlbXMuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgbGlzdFxuICAgKiBAcGFyYW0ge0tleVZhbHVlIHwgc3RyaW5nIHwgbnVtYmVyfSBpdGVtIC0gVGhlIGl0ZW0gZGF0YSB0byB0cmFja1xuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVtYmVyfSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgaXRlbVxuICAgKiBAbWVtYmVyT2YgTmd4QmFzZUNvbXBvbmVudFxuICAgKi9cbiAgdHJhY2tJdGVtRm4oaW5kZXg6IG51bWJlciwgaXRlbTogS2V5VmFsdWUgfCBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiBgJHtpbmRleH0tJHtpdGVtfWA7XG4gIH1cbn1cbiJdfQ==