@sumaris-net/ngx-components 18.0.0-rc1 → 18.0.1-0.alpha1

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 (123) hide show
  1. package/doc/build.md +13 -11
  2. package/doc/changelog.md +42 -5
  3. package/esm2022/public_api.mjs +4 -2
  4. package/esm2022/src/app/admin/services/filter/person.filter.mjs +10 -3
  5. package/esm2022/src/app/admin/services/person.service.mjs +11 -5
  6. package/esm2022/src/app/admin/users/users.mjs +2 -2
  7. package/esm2022/src/app/core/about/about.modal.mjs +6 -4
  8. package/esm2022/src/app/core/about/about.module.mjs +5 -4
  9. package/esm2022/src/app/core/account/account.page.mjs +5 -6
  10. package/esm2022/src/app/core/account/token.table.mjs +10 -6
  11. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +5 -5
  12. package/esm2022/src/app/core/form/properties/properties.form.mjs +110 -57
  13. package/esm2022/src/app/core/form/properties/properties.utils.mjs +264 -32
  14. package/esm2022/src/app/core/form/properties/property.validator.mjs +36 -4
  15. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +26 -18
  16. package/esm2022/src/app/core/graphql/graphql.service.mjs +1 -1
  17. package/esm2022/src/app/core/home/home.module.mjs +2 -2
  18. package/esm2022/src/app/core/menu/menu.component.mjs +3 -3
  19. package/esm2022/src/app/core/menu/menu.module.mjs +2 -2
  20. package/esm2022/src/app/core/menu/menu.service.mjs +5 -4
  21. package/esm2022/src/app/core/register/register.form.mjs +1 -1
  22. package/esm2022/src/app/core/services/base-entity-service.class.mjs +1 -1
  23. package/esm2022/src/app/core/services/config/core.config.mjs +6 -1
  24. package/esm2022/src/app/core/services/local-settings.service.mjs +17 -8
  25. package/esm2022/src/app/core/services/model/config.model.mjs +1 -1
  26. package/esm2022/src/app/core/services/model/entity.model.mjs +2 -2
  27. package/esm2022/src/app/core/services/model/settings.model.mjs +1 -1
  28. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +1 -1
  29. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +1 -1
  30. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +4 -24
  31. package/esm2022/src/app/core/settings/settings.page.mjs +51 -16
  32. package/esm2022/src/app/core/table/column/row-field.component.mjs +1 -1
  33. package/esm2022/src/app/core/table/testing/table.testing.mjs +1 -1
  34. package/esm2022/src/app/core/table/testing/table2.testing.mjs +1 -1
  35. package/esm2022/src/app/shared/debug/debug.component.mjs +10 -6
  36. package/esm2022/src/app/shared/form/field.component.mjs +39 -31
  37. package/esm2022/src/app/shared/form/field.model.mjs +59 -2
  38. package/esm2022/src/app/shared/functions.mjs +6 -3
  39. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +1 -1
  40. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +51 -17
  41. package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +2 -2
  42. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +1 -1
  43. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +1 -1
  44. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +11 -4
  45. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +2 -2
  46. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +18 -8
  47. package/esm2022/src/app/shared/material/chips/chips.module.mjs +2 -2
  48. package/esm2022/src/app/shared/material/chips/material.chips.mjs +4 -3
  49. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +33 -10
  50. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +1 -1
  51. package/esm2022/src/app/shared/pipes/display-with.pipe.mjs +23 -0
  52. package/esm2022/src/app/shared/pipes/pipes.module.mjs +7 -3
  53. package/esm2022/src/app/shared/pipes/property.pipes.mjs +30 -31
  54. package/esm2022/src/app/shared/platforms.mjs +12 -4
  55. package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +71 -0
  56. package/esm2022/src/app/shared/rx-state/rx-state.module.mjs +19 -0
  57. package/esm2022/src/app/shared/services/entity-service.class.mjs +1 -1
  58. package/esm2022/src/app/shared/services.mjs +34 -18
  59. package/esm2022/src/app/shared/shared.module.mjs +2 -2
  60. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +2 -2
  61. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +2 -2
  62. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +2 -2
  63. package/esm2022/src/app/shared/types.mjs +1 -1
  64. package/esm2022/src/app/social/user-event/user-event.module.mjs +2 -2
  65. package/esm2022/src/environments/environment.mjs +3 -6
  66. package/fesm2022/sumaris-net.ngx-components.mjs +1429 -805
  67. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  68. package/package.json +5 -2
  69. package/public_api.d.ts +3 -1
  70. package/src/app/admin/services/filter/person.filter.d.ts +1 -0
  71. package/src/app/admin/services/person.service.d.ts +8 -6
  72. package/src/app/core/about/about.modal.d.ts +1 -1
  73. package/src/app/core/about/about.module.d.ts +2 -1
  74. package/src/app/core/account/token.table.d.ts +1 -1
  75. package/src/app/core/form/properties/properties.form.d.ts +28 -11
  76. package/src/app/core/form/properties/properties.utils.d.ts +41 -13
  77. package/src/app/core/form/properties/property.validator.d.ts +8 -0
  78. package/src/app/core/form/properties/testing/properties-form.test.d.ts +6 -3
  79. package/src/app/core/graphql/graphql.service.d.ts +2 -2
  80. package/src/app/core/home/home.module.d.ts +1 -1
  81. package/src/app/core/menu/menu.module.d.ts +1 -1
  82. package/src/app/core/services/base-entity-service.class.d.ts +1 -1
  83. package/src/app/core/services/config/core.config.d.ts +1 -0
  84. package/src/app/core/services/local-settings.service.d.ts +3 -1
  85. package/src/app/core/services/model/config.model.d.ts +2 -2
  86. package/src/app/core/services/model/entity.model.d.ts +2 -2
  87. package/src/app/core/services/model/settings.model.d.ts +2 -2
  88. package/src/app/core/services/storage/entities-storage.service.d.ts +4 -4
  89. package/src/app/core/services/storage/entity-store.class.d.ts +4 -4
  90. package/src/app/core/services/validator/local-settings.validator.d.ts +3 -7
  91. package/src/app/core/settings/settings.page.d.ts +4 -1
  92. package/src/app/shared/debug/debug.component.d.ts +2 -1
  93. package/src/app/shared/form/field.component.d.ts +14 -5
  94. package/src/app/shared/form/field.model.d.ts +44 -1
  95. package/src/app/shared/functions.d.ts +1 -0
  96. package/src/app/shared/hotkeys/hotkeys.service.d.ts +10 -3
  97. package/src/app/shared/image/gallery/image-gallery.module.d.ts +1 -1
  98. package/src/app/shared/inputs.d.ts +1 -1
  99. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +2 -2
  100. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +4 -1
  101. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +1 -1
  102. package/src/app/shared/material/chips/chips.module.d.ts +1 -1
  103. package/src/app/shared/material/chips/material.chips.d.ts +1 -0
  104. package/src/app/shared/material/latlong/material.latlong.d.ts +3 -0
  105. package/src/app/shared/pipes/display-with.pipe.d.ts +8 -0
  106. package/src/app/shared/pipes/pipes.module.d.ts +5 -4
  107. package/src/app/shared/pipes/property.pipes.d.ts +3 -9
  108. package/src/app/shared/platforms.d.ts +3 -0
  109. package/src/app/shared/rx-state/rx-state.decorators.d.ts +7 -0
  110. package/src/app/shared/services/entity-service.class.d.ts +2 -0
  111. package/src/app/shared/services.d.ts +8 -1
  112. package/src/app/shared/shared.module.d.ts +1 -1
  113. package/src/app/shared/storage/storage-explorer.module.d.ts +1 -1
  114. package/src/app/shared/toolbar/toolbar.module.d.ts +1 -1
  115. package/src/app/shared/types.d.ts +11 -6
  116. package/src/app/social/user-event/user-event.module.d.ts +1 -1
  117. package/src/assets/i18n/en-US.json +14 -2
  118. package/src/assets/i18n/en.json +13 -1
  119. package/src/assets/i18n/fr.json +11 -1
  120. package/src/assets/manifest.json +1 -1
  121. package/src/theme/_ngx-components.scss +2 -4
  122. package/esm2022/src/app/shared/rx-state.module.mjs +0 -19
  123. /package/src/app/shared/{rx-state.module.d.ts → rx-state/rx-state.module.d.ts} +0 -0
@@ -11,6 +11,7 @@ import * as i4 from "@angular/common";
11
11
  import * as i5 from "ngx-markdown";
12
12
  import * as i6 from "@angular/material/icon";
13
13
  import * as i7 from "../../shared/pipes/arrays.pipe";
14
+ import * as i8 from "../../shared/pipes/string.pipes";
14
15
  export const APP_ABOUT_DEVELOPERS = new InjectionToken('aboutDevelopers');
15
16
  export const APP_ABOUT_PARTNERS = new InjectionToken('aboutPartners');
16
17
  export class AboutModal {
@@ -23,8 +24,8 @@ export class AboutModal {
23
24
  name;
24
25
  version;
25
26
  sourceUrl;
26
- reportIssueUrl;
27
27
  config$;
28
+ reportIssueUrl;
28
29
  forumUrl;
29
30
  helpUrl;
30
31
  _subscription = new Subscription();
@@ -58,13 +59,14 @@ export class AboutModal {
58
59
  setConfig(config) {
59
60
  this.forumUrl = config?.getProperty(CORE_CONFIG_OPTIONS.FORUM_URL) || this.environment.forumUrl;
60
61
  this.helpUrl = config?.getProperty(CORE_CONFIG_OPTIONS.HELP_URL) || this.environment.helpUrl;
62
+ this.reportIssueUrl = config?.getProperty(CORE_CONFIG_OPTIONS.REPORT_ISSUE_URL) || this.environment.reportIssueUrl;
61
63
  }
62
64
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AboutModal, deps: [{ token: i1.TranslateService }, { token: i2.ModalController }, { token: i3.ConfigService }, { token: ENVIRONMENT, optional: true }, { token: APP_ABOUT_DEVELOPERS, optional: true }, { token: APP_ABOUT_PARTNERS, optional: true }], target: i0.ɵɵFactoryTarget.Component });
63
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: AboutModal, selector: "app-about-modal", ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"light\">\n <ion-title>\n {{ 'ABOUT.TITLE' | translate }}\n </ion-title>\n\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"close()\" visible-xs visible-sm visible-mobile>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n <ion-list lines=\"none\">\n <!-- Peer info -->\n <ion-item *ngIf=\"config$ | async; let config\">\n <span slot=\"start\">&nbsp;</span>\n <ion-label class=\"ion-text-wrap\">\n <h2>\n <b>{{ config.label }}</b>\n -\n <span [innerHTML]=\"config.name\"></span>\n </h2>\n <p *ngIf=\"config.description\">\n <markdown [data]=\"config.description\" emoji></markdown>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Version info -->\n <ion-item>\n <span slot=\"start\">&nbsp;</span>\n <ion-label class=\"ion-text-wrap\">\n <h2>\n <small *ngIf=\"name\">{{ 'ABOUT.POWERED_BY' | translate }}</small>\n {{ name }}\n <span *ngIf=\"version\" [innerHTML]=\"'ABOUT.VERSION' | translate: { version: version }\"></span>\n </h2>\n <p [innerHTML]=\"'ABOUT.LICENSE' | translate\"></p>\n </ion-label>\n </ion-item>\n\n <!-- Help -->\n <ion-item *ngIf=\"forumUrl || helpUrl\">\n <mat-icon slot=\"start\">help_outline</mat-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.HELP' | translate }}\n </p>\n <p>\n <ion-button fill=\"solid\" color=\"accent\" href=\"{{ helpUrl }}\" target=\"help\" size=\"default\">\n <mat-icon slot=\"start\">description</mat-icon>\n <ion-text translate>ABOUT.USER_MANUAL</ion-text>\n </ion-button>\n <ion-button fill=\"solid\" color=\"secondary\" href=\"{{ forumUrl }}\" target=\"forum\" size=\"default\">\n <ion-icon slot=\"start\" name=\"chatbubbles\"></ion-icon>\n <ion-text translate>ABOUT.FORUM</ion-text>\n </ion-button>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Report issue -->\n <ion-item *ngIf=\"reportIssueUrl\">\n <ion-icon slot=\"start\" name=\"bug\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.REPORT_ISSUE' | translate }}\n </p>\n <p>\n <a color=\"primary\" href=\"{{ reportIssueUrl }}\" target=\"_system\" translate>ABOUT.BTN_REPORT_ISSUE</a>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Source code -->\n <ion-item *ngIf=\"sourceUrl\">\n <ion-icon slot=\"start\" name=\"code\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.SOURCE_CODE' | translate }}\n </p>\n <p>\n <a color=\"primary\" href=\"{{ sourceUrl }}\" target=\"_system\">{{ sourceUrl }}</a>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Developers -->\n <ion-item *ngIf=\"developers | isNotEmptyArray\">\n <ion-icon slot=\"start\" name=\"people\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.DEVELOPED_BY' | translate }}\n </p>\n <ion-list lines=\"none\">\n <ion-item *ngFor=\"let item of developers\" class=\"ion-no-padding\">\n <ion-label>\n <p>\n <a color=\"primary\" href=\"{{ item.siteUrl }}\" target=\"_system\">{{ item.name || item.label }}</a>\n </p>\n </ion-label>\n <ion-img slot=\"end\" [src]=\"item.logo\" />\n </ion-item>\n </ion-list>\n </ion-label>\n </ion-item>\n\n <!-- Partners -->\n <ion-item class=\"item-partners\" *ngIf=\"partners | isNotEmptyArray\">\n <ion-icon slot=\"start\" name=\"megaphone\" color=\"dark\"></ion-icon>\n <ion-text>\n <p>{{ 'ABOUT.PARTNERS' | translate }}</p>\n <p>\n <a *ngFor=\"let item of partners\" href=\"{{ item.siteUrl }}\" class=\"partners\" target=\"_system\">\n <img *ngIf=\"item.logo; else partnerName\" [src]=\"item.logo\" [alt]=\"item.label\" />\n <ng-template #partnerName>\n <ion-text>{{ item.label }}</ion-text>\n </ng-template>\n </a>\n </p>\n </ion-text>\n </ion-item>\n </ion-list>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"close()\">{{ 'COMMON.BTN_CLOSE' | translate }}</ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", styles: [".item-partners ion-text{height:auto}.item-partners ion-text p:last-child{display:flex;flex-wrap:wrap;flex-direction:row;justify-content:space-between}.item-partners ion-text p:last-child a{padding:2px}.item-partners ion-text p:last-child a img{text-align:center;display:inline-block;max-height:40px!important}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonImg, selector: "ion-img", inputs: ["alt", "src"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i5.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i7.NotEmptyArrayPipe, name: "isNotEmptyArray" }] });
65
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: AboutModal, selector: "app-about-modal", ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"light\">\n <ion-title>\n {{ 'ABOUT.TITLE' | translate }}\n </ion-title>\n\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"close()\" visible-xs visible-sm visible-mobile>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n <ion-list lines=\"none\">\n <!-- Peer info -->\n @if (config$ | async; as config) {\n <ion-item>\n <span slot=\"start\">&nbsp;</span>\n <ion-label class=\"ion-text-wrap\">\n <h2>\n <b>{{ config.label | capitalize }}</b>\n @if (config.name) {\n -\n <span [innerHTML]=\"config.name\"></span>\n }\n </h2>\n\n @if (config.description) {\n <p>\n <markdown [data]=\"config.description\" emoji></markdown>\n </p>\n }\n </ion-label>\n </ion-item>\n }\n\n <!-- Version info -->\n <ion-item>\n <span slot=\"start\">&nbsp;</span>\n <ion-label class=\"ion-text-wrap\">\n <h2>\n <small *ngIf=\"name\">{{ 'ABOUT.POWERED_BY' | translate }}</small>\n {{ name }}\n <span *ngIf=\"version\" [innerHTML]=\"'ABOUT.VERSION' | translate: { version: version }\"></span>\n </h2>\n <p [innerHTML]=\"'ABOUT.LICENSE' | translate\"></p>\n </ion-label>\n </ion-item>\n\n <!-- Help -->\n <ion-item *ngIf=\"forumUrl || helpUrl\">\n <mat-icon slot=\"start\">help_outline</mat-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.HELP' | translate }}\n </p>\n <p>\n <ion-button fill=\"solid\" color=\"accent\" href=\"{{ helpUrl }}\" target=\"help\" size=\"default\">\n <mat-icon slot=\"start\">description</mat-icon>\n <ion-text translate>ABOUT.USER_MANUAL</ion-text>\n </ion-button>\n <ion-button fill=\"solid\" color=\"secondary\" href=\"{{ forumUrl }}\" target=\"forum\" size=\"default\">\n <ion-icon slot=\"start\" name=\"chatbubbles\"></ion-icon>\n <ion-text translate>ABOUT.FORUM</ion-text>\n </ion-button>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Report issue -->\n <ion-item *ngIf=\"reportIssueUrl\">\n <ion-icon slot=\"start\" name=\"bug\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.REPORT_ISSUE' | translate }}\n </p>\n <p>\n <a color=\"primary\" href=\"{{ reportIssueUrl }}\" target=\"_system\" translate>ABOUT.BTN_REPORT_ISSUE</a>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Source code -->\n <ion-item *ngIf=\"sourceUrl\">\n <ion-icon slot=\"start\" name=\"code\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.SOURCE_CODE' | translate }}\n </p>\n <p>\n <a color=\"primary\" href=\"{{ sourceUrl }}\" target=\"_system\">{{ sourceUrl }}</a>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Developers -->\n <ion-item *ngIf=\"developers | isNotEmptyArray\">\n <ion-icon slot=\"start\" name=\"people\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.DEVELOPED_BY' | translate }}\n </p>\n <ion-list lines=\"none\">\n <ion-item *ngFor=\"let item of developers\" class=\"ion-no-padding\">\n <ion-label>\n <p>\n <a color=\"primary\" href=\"{{ item.siteUrl }}\" target=\"_system\">{{ item.name || item.label }}</a>\n </p>\n </ion-label>\n <ion-img slot=\"end\" [src]=\"item.logo\" />\n </ion-item>\n </ion-list>\n </ion-label>\n </ion-item>\n\n <!-- Partners -->\n <ion-item class=\"item-partners\" *ngIf=\"partners | isNotEmptyArray\">\n <ion-icon slot=\"start\" name=\"megaphone\" color=\"dark\"></ion-icon>\n <ion-text>\n <p>{{ 'ABOUT.PARTNERS' | translate }}</p>\n <p>\n <a *ngFor=\"let item of partners\" href=\"{{ item.siteUrl }}\" class=\"partners\" target=\"_system\">\n <img *ngIf=\"item.logo; else partnerName\" [src]=\"item.logo\" [alt]=\"item.label\" />\n <ng-template #partnerName>\n <ion-text>{{ item.label }}</ion-text>\n </ng-template>\n </a>\n </p>\n </ion-text>\n </ion-item>\n </ion-list>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"close()\">{{ 'COMMON.BTN_CLOSE' | translate }}</ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", styles: [".item-partners ion-text{height:auto}.item-partners ion-text p:last-child{display:flex;flex-wrap:wrap;flex-direction:row;justify-content:space-between}.item-partners ion-text p:last-child a{padding:2px}.item-partners ion-text p:last-child a img{text-align:center;display:inline-block;max-height:40px!important}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonImg, selector: "ion-img", inputs: ["alt", "src"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i5.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i7.NotEmptyArrayPipe, name: "isNotEmptyArray" }, { kind: "pipe", type: i8.CapitalizePipe, name: "capitalize" }] });
64
66
  }
65
67
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AboutModal, decorators: [{
66
68
  type: Component,
67
- args: [{ selector: 'app-about-modal', template: "<ion-header>\n <ion-toolbar color=\"light\">\n <ion-title>\n {{ 'ABOUT.TITLE' | translate }}\n </ion-title>\n\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"close()\" visible-xs visible-sm visible-mobile>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n <ion-list lines=\"none\">\n <!-- Peer info -->\n <ion-item *ngIf=\"config$ | async; let config\">\n <span slot=\"start\">&nbsp;</span>\n <ion-label class=\"ion-text-wrap\">\n <h2>\n <b>{{ config.label }}</b>\n -\n <span [innerHTML]=\"config.name\"></span>\n </h2>\n <p *ngIf=\"config.description\">\n <markdown [data]=\"config.description\" emoji></markdown>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Version info -->\n <ion-item>\n <span slot=\"start\">&nbsp;</span>\n <ion-label class=\"ion-text-wrap\">\n <h2>\n <small *ngIf=\"name\">{{ 'ABOUT.POWERED_BY' | translate }}</small>\n {{ name }}\n <span *ngIf=\"version\" [innerHTML]=\"'ABOUT.VERSION' | translate: { version: version }\"></span>\n </h2>\n <p [innerHTML]=\"'ABOUT.LICENSE' | translate\"></p>\n </ion-label>\n </ion-item>\n\n <!-- Help -->\n <ion-item *ngIf=\"forumUrl || helpUrl\">\n <mat-icon slot=\"start\">help_outline</mat-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.HELP' | translate }}\n </p>\n <p>\n <ion-button fill=\"solid\" color=\"accent\" href=\"{{ helpUrl }}\" target=\"help\" size=\"default\">\n <mat-icon slot=\"start\">description</mat-icon>\n <ion-text translate>ABOUT.USER_MANUAL</ion-text>\n </ion-button>\n <ion-button fill=\"solid\" color=\"secondary\" href=\"{{ forumUrl }}\" target=\"forum\" size=\"default\">\n <ion-icon slot=\"start\" name=\"chatbubbles\"></ion-icon>\n <ion-text translate>ABOUT.FORUM</ion-text>\n </ion-button>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Report issue -->\n <ion-item *ngIf=\"reportIssueUrl\">\n <ion-icon slot=\"start\" name=\"bug\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.REPORT_ISSUE' | translate }}\n </p>\n <p>\n <a color=\"primary\" href=\"{{ reportIssueUrl }}\" target=\"_system\" translate>ABOUT.BTN_REPORT_ISSUE</a>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Source code -->\n <ion-item *ngIf=\"sourceUrl\">\n <ion-icon slot=\"start\" name=\"code\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.SOURCE_CODE' | translate }}\n </p>\n <p>\n <a color=\"primary\" href=\"{{ sourceUrl }}\" target=\"_system\">{{ sourceUrl }}</a>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Developers -->\n <ion-item *ngIf=\"developers | isNotEmptyArray\">\n <ion-icon slot=\"start\" name=\"people\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.DEVELOPED_BY' | translate }}\n </p>\n <ion-list lines=\"none\">\n <ion-item *ngFor=\"let item of developers\" class=\"ion-no-padding\">\n <ion-label>\n <p>\n <a color=\"primary\" href=\"{{ item.siteUrl }}\" target=\"_system\">{{ item.name || item.label }}</a>\n </p>\n </ion-label>\n <ion-img slot=\"end\" [src]=\"item.logo\" />\n </ion-item>\n </ion-list>\n </ion-label>\n </ion-item>\n\n <!-- Partners -->\n <ion-item class=\"item-partners\" *ngIf=\"partners | isNotEmptyArray\">\n <ion-icon slot=\"start\" name=\"megaphone\" color=\"dark\"></ion-icon>\n <ion-text>\n <p>{{ 'ABOUT.PARTNERS' | translate }}</p>\n <p>\n <a *ngFor=\"let item of partners\" href=\"{{ item.siteUrl }}\" class=\"partners\" target=\"_system\">\n <img *ngIf=\"item.logo; else partnerName\" [src]=\"item.logo\" [alt]=\"item.label\" />\n <ng-template #partnerName>\n <ion-text>{{ item.label }}</ion-text>\n </ng-template>\n </a>\n </p>\n </ion-text>\n </ion-item>\n </ion-list>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"close()\">{{ 'COMMON.BTN_CLOSE' | translate }}</ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", styles: [".item-partners ion-text{height:auto}.item-partners ion-text p:last-child{display:flex;flex-wrap:wrap;flex-direction:row;justify-content:space-between}.item-partners ion-text p:last-child a{padding:2px}.item-partners ion-text p:last-child a img{text-align:center;display:inline-block;max-height:40px!important}\n"] }]
69
+ args: [{ selector: 'app-about-modal', template: "<ion-header>\n <ion-toolbar color=\"light\">\n <ion-title>\n {{ 'ABOUT.TITLE' | translate }}\n </ion-title>\n\n <ion-buttons slot=\"end\">\n <ion-button (click)=\"close()\" visible-xs visible-sm visible-mobile>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n <ion-list lines=\"none\">\n <!-- Peer info -->\n @if (config$ | async; as config) {\n <ion-item>\n <span slot=\"start\">&nbsp;</span>\n <ion-label class=\"ion-text-wrap\">\n <h2>\n <b>{{ config.label | capitalize }}</b>\n @if (config.name) {\n -\n <span [innerHTML]=\"config.name\"></span>\n }\n </h2>\n\n @if (config.description) {\n <p>\n <markdown [data]=\"config.description\" emoji></markdown>\n </p>\n }\n </ion-label>\n </ion-item>\n }\n\n <!-- Version info -->\n <ion-item>\n <span slot=\"start\">&nbsp;</span>\n <ion-label class=\"ion-text-wrap\">\n <h2>\n <small *ngIf=\"name\">{{ 'ABOUT.POWERED_BY' | translate }}</small>\n {{ name }}\n <span *ngIf=\"version\" [innerHTML]=\"'ABOUT.VERSION' | translate: { version: version }\"></span>\n </h2>\n <p [innerHTML]=\"'ABOUT.LICENSE' | translate\"></p>\n </ion-label>\n </ion-item>\n\n <!-- Help -->\n <ion-item *ngIf=\"forumUrl || helpUrl\">\n <mat-icon slot=\"start\">help_outline</mat-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.HELP' | translate }}\n </p>\n <p>\n <ion-button fill=\"solid\" color=\"accent\" href=\"{{ helpUrl }}\" target=\"help\" size=\"default\">\n <mat-icon slot=\"start\">description</mat-icon>\n <ion-text translate>ABOUT.USER_MANUAL</ion-text>\n </ion-button>\n <ion-button fill=\"solid\" color=\"secondary\" href=\"{{ forumUrl }}\" target=\"forum\" size=\"default\">\n <ion-icon slot=\"start\" name=\"chatbubbles\"></ion-icon>\n <ion-text translate>ABOUT.FORUM</ion-text>\n </ion-button>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Report issue -->\n <ion-item *ngIf=\"reportIssueUrl\">\n <ion-icon slot=\"start\" name=\"bug\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.REPORT_ISSUE' | translate }}\n </p>\n <p>\n <a color=\"primary\" href=\"{{ reportIssueUrl }}\" target=\"_system\" translate>ABOUT.BTN_REPORT_ISSUE</a>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Source code -->\n <ion-item *ngIf=\"sourceUrl\">\n <ion-icon slot=\"start\" name=\"code\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.SOURCE_CODE' | translate }}\n </p>\n <p>\n <a color=\"primary\" href=\"{{ sourceUrl }}\" target=\"_system\">{{ sourceUrl }}</a>\n </p>\n </ion-label>\n </ion-item>\n\n <!-- Developers -->\n <ion-item *ngIf=\"developers | isNotEmptyArray\">\n <ion-icon slot=\"start\" name=\"people\" color=\"dark\"></ion-icon>\n <ion-label>\n <p>\n {{ 'ABOUT.DEVELOPED_BY' | translate }}\n </p>\n <ion-list lines=\"none\">\n <ion-item *ngFor=\"let item of developers\" class=\"ion-no-padding\">\n <ion-label>\n <p>\n <a color=\"primary\" href=\"{{ item.siteUrl }}\" target=\"_system\">{{ item.name || item.label }}</a>\n </p>\n </ion-label>\n <ion-img slot=\"end\" [src]=\"item.logo\" />\n </ion-item>\n </ion-list>\n </ion-label>\n </ion-item>\n\n <!-- Partners -->\n <ion-item class=\"item-partners\" *ngIf=\"partners | isNotEmptyArray\">\n <ion-icon slot=\"start\" name=\"megaphone\" color=\"dark\"></ion-icon>\n <ion-text>\n <p>{{ 'ABOUT.PARTNERS' | translate }}</p>\n <p>\n <a *ngFor=\"let item of partners\" href=\"{{ item.siteUrl }}\" class=\"partners\" target=\"_system\">\n <img *ngIf=\"item.logo; else partnerName\" [src]=\"item.logo\" [alt]=\"item.label\" />\n <ng-template #partnerName>\n <ion-text>{{ item.label }}</ion-text>\n </ng-template>\n </a>\n </p>\n </ion-text>\n </ion-item>\n </ion-list>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"close()\">{{ 'COMMON.BTN_CLOSE' | translate }}</ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n</ion-footer>\n", styles: [".item-partners ion-text{height:auto}.item-partners ion-text p:last-child{display:flex;flex-wrap:wrap;flex-direction:row;justify-content:space-between}.item-partners ion-text p:last-child a{padding:2px}.item-partners ion-text p:last-child a img{text-align:center;display:inline-block;max-height:40px!important}\n"] }]
68
70
  }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.ModalController }, { type: i3.ConfigService }, { type: undefined, decorators: [{
69
71
  type: Optional
70
72
  }, {
@@ -81,4 +83,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
81
83
  type: Inject,
82
84
  args: [APP_ABOUT_PARTNERS]
83
85
  }] }] });
84
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJvdXQubW9kYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvYWJvdXQvYWJvdXQubW9kYWwudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvYWJvdXQvYWJvdXQubW9kYWwuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQWEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUsvRCxPQUFPLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7Ozs7QUFFckUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxjQUFjLENBQXdCLGlCQUFpQixDQUFDLENBQUM7QUFDakcsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQXdCLGVBQWUsQ0FBQyxDQUFDO0FBTzdGLE1BQU0sT0FBTyxVQUFVO0lBWVQ7SUFDQTtJQUNBO0lBQ2lDO0lBQ007SUFDRjtJQWhCeEMsSUFBSSxDQUFTO0lBQ2IsT0FBTyxDQUFTO0lBQ2hCLFNBQVMsQ0FBUztJQUNsQixjQUFjLENBQVM7SUFDdkIsT0FBTyxDQUE0QjtJQUM1QyxRQUFRLENBQVM7SUFDakIsT0FBTyxDQUFTO0lBRUMsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFFcEQsWUFDWSxTQUEyQixFQUMzQixlQUFnQyxFQUNoQyxhQUE0QixFQUNLLFdBQVcsRUFDTCxVQUFpQyxFQUNuQyxRQUErQjtRQUxwRSxjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDSyxnQkFBVyxHQUFYLFdBQVcsQ0FBQTtRQUNMLGVBQVUsR0FBVixVQUFVLENBQXVCO1FBQ25DLGFBQVEsR0FBUixRQUFRLENBQXVCO1FBRTlFLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDN0Isa0RBQWtEO1lBQ2xELElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUM7UUFDeEcsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDbEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxXQUFXLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsSUFBSSxXQUFXLENBQUMsY0FBYyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUM7UUFDcEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUNsRCxJQUFJLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFFcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELCtCQUErQjtJQUVyQixTQUFTLENBQUMsTUFBc0I7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLEVBQUUsV0FBVyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO1FBQ2hHLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxFQUFFLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztJQUMvRixDQUFDO3VHQS9DVSxVQUFVLDhHQWVDLFdBQVcsNkJBQ1gsb0JBQW9CLDZCQUNwQixrQkFBa0I7MkZBakI3QixVQUFVLHVEQ25CdkIsK25KQTBJQTs7MkZEdkhhLFVBQVU7a0JBTHRCLFNBQVM7K0JBQ0UsaUJBQWlCOzswQkFtQnhCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsV0FBVzs7MEJBQzlCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsb0JBQW9COzswQkFDdkMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgSW5qZWN0aW9uVG9rZW4sIE9uRGVzdHJveSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGFsQ29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IEVOVklST05NRU5UIH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7IGNhcGl0YWxpemVGaXJzdExldHRlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgRGVwYXJ0bWVudCB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2RlcGFydG1lbnQubW9kZWwnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDT1JFX0NPTkZJR19PUFRJT05TIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnL2NvcmUuY29uZmlnJztcblxuZXhwb3J0IGNvbnN0IEFQUF9BQk9VVF9ERVZFTE9QRVJTID0gbmV3IEluamVjdGlvblRva2VuPFBhcnRpYWw8RGVwYXJ0bWVudD5bXT4oJ2Fib3V0RGV2ZWxvcGVycycpO1xuZXhwb3J0IGNvbnN0IEFQUF9BQk9VVF9QQVJUTkVSUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxQYXJ0aWFsPERlcGFydG1lbnQ+W10+KCdhYm91dFBhcnRuZXJzJyk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hYm91dC1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hYm91dC5tb2RhbC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWJvdXQubW9kYWwuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBBYm91dE1vZGFsIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNvdXJjZVVybDogc3RyaW5nO1xuICByZWFkb25seSByZXBvcnRJc3N1ZVVybDogc3RyaW5nO1xuICByZWFkb25seSBjb25maWckOiBPYnNlcnZhYmxlPENvbmZpZ3VyYXRpb24+O1xuICBmb3J1bVVybDogc3RyaW5nO1xuICBoZWxwVXJsOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG1vZGFsQ29udHJvbGxlcjogTW9kYWxDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9BQk9VVF9ERVZFTE9QRVJTKSBwdWJsaWMgZGV2ZWxvcGVyczogUGFydGlhbDxEZXBhcnRtZW50PltdLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX0FCT1VUX1BBUlRORVJTKSBwdWJsaWMgcGFydG5lcnM6IFBhcnRpYWw8RGVwYXJ0bWVudD5bXVxuICApIHtcbiAgICB0aGlzLm5hbWUgPSB0cmFuc2xhdGUuaW5zdGFudCgnQVBQX05BTUUnKTtcbiAgICBpZiAodGhpcy5uYW1lID09PSAnQVBQX05BTUUnKSB7XG4gICAgICAvLyBOb3QgdHJhbnNsYXRlZDogdXNlIG5hbWUgZnJvbSB0aGUgZW52aXJvbm5lbWVudFxuICAgICAgdGhpcy5uYW1lID0gKGVudmlyb25tZW50ICYmIGVudmlyb25tZW50Lm5hbWUgJiYgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGVudmlyb25tZW50Lm5hbWUpKSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMudmVyc2lvbiA9IGVudmlyb25tZW50ICYmIGVudmlyb25tZW50LnZlcnNpb247XG4gICAgdGhpcy5zb3VyY2VVcmwgPSBlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5zb3VyY2VVcmw7XG4gICAgdGhpcy5yZXBvcnRJc3N1ZVVybCA9IGVudmlyb25tZW50ICYmIGVudmlyb25tZW50LnJlcG9ydElzc3VlVXJsO1xuICAgIHRoaXMuZm9ydW1VcmwgPSBlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5mb3J1bVVybDtcbiAgICB0aGlzLmhlbHBVcmwgPSBlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5oZWxwVXJsO1xuICAgIHRoaXMuY29uZmlnJCA9IGNvbmZpZ1NlcnZpY2UuY29uZmlnO1xuXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLmNvbmZpZyQuc3Vic2NyaWJlKChjb25maWcpID0+IHRoaXMuc2V0Q29uZmlnKGNvbmZpZykpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgYXdhaXQgdGhpcy5tb2RhbENvbnRyb2xsZXIuZGlzbWlzcygpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIGZ1bmN0aW9ucyAtLSAqL1xuXG4gIHByb3RlY3RlZCBzZXRDb25maWcoY29uZmlnPzogQ29uZmlndXJhdGlvbikge1xuICAgIHRoaXMuZm9ydW1VcmwgPSBjb25maWc/LmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuRk9SVU1fVVJMKSB8fCB0aGlzLmVudmlyb25tZW50LmZvcnVtVXJsO1xuICAgIHRoaXMuaGVscFVybCA9IGNvbmZpZz8uZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5IRUxQX1VSTCkgfHwgdGhpcy5lbnZpcm9ubWVudC5oZWxwVXJsO1xuICB9XG59XG4iLCI8aW9uLWhlYWRlcj5cbiAgPGlvbi10b29sYmFyIGNvbG9yPVwibGlnaHRcIj5cbiAgICA8aW9uLXRpdGxlPlxuICAgICAge3sgJ0FCT1VULlRJVExFJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvaW9uLXRpdGxlPlxuXG4gICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJjbG9zZSgpXCIgdmlzaWJsZS14cyB2aXNpYmxlLXNtIHZpc2libGUtbW9iaWxlPlxuICAgICAgICB7eyAnQ09NTU9OLkJUTl9DTE9TRScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICA8L2lvbi1idXR0b25zPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuXG48aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICA8aW9uLWxpc3QgbGluZXM9XCJub25lXCI+XG4gICAgPCEtLSBQZWVyIGluZm8gLS0+XG4gICAgPGlvbi1pdGVtICpuZ0lmPVwiY29uZmlnJCB8IGFzeW5jOyBsZXQgY29uZmlnXCI+XG4gICAgICA8c3BhbiBzbG90PVwic3RhcnRcIj4mbmJzcDs8L3NwYW4+XG4gICAgICA8aW9uLWxhYmVsIGNsYXNzPVwiaW9uLXRleHQtd3JhcFwiPlxuICAgICAgICA8aDI+XG4gICAgICAgICAgPGI+e3sgY29uZmlnLmxhYmVsIH19PC9iPlxuICAgICAgICAgIC1cbiAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cImNvbmZpZy5uYW1lXCI+PC9zcGFuPlxuICAgICAgICA8L2gyPlxuICAgICAgICA8cCAqbmdJZj1cImNvbmZpZy5kZXNjcmlwdGlvblwiPlxuICAgICAgICAgIDxtYXJrZG93biBbZGF0YV09XCJjb25maWcuZGVzY3JpcHRpb25cIiBlbW9qaT48L21hcmtkb3duPlxuICAgICAgICA8L3A+XG4gICAgICA8L2lvbi1sYWJlbD5cbiAgICA8L2lvbi1pdGVtPlxuXG4gICAgPCEtLSBWZXJzaW9uIGluZm8gLS0+XG4gICAgPGlvbi1pdGVtPlxuICAgICAgPHNwYW4gc2xvdD1cInN0YXJ0XCI+Jm5ic3A7PC9zcGFuPlxuICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cImlvbi10ZXh0LXdyYXBcIj5cbiAgICAgICAgPGgyPlxuICAgICAgICAgIDxzbWFsbCAqbmdJZj1cIm5hbWVcIj57eyAnQUJPVVQuUE9XRVJFRF9CWScgfCB0cmFuc2xhdGUgfX08L3NtYWxsPlxuICAgICAgICAgIHt7IG5hbWUgfX1cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cInZlcnNpb25cIiBbaW5uZXJIVE1MXT1cIidBQk9VVC5WRVJTSU9OJyB8IHRyYW5zbGF0ZTogeyB2ZXJzaW9uOiB2ZXJzaW9uIH1cIj48L3NwYW4+XG4gICAgICAgIDwvaDI+XG4gICAgICAgIDxwIFtpbm5lckhUTUxdPVwiJ0FCT1VULkxJQ0VOU0UnIHwgdHJhbnNsYXRlXCI+PC9wPlxuICAgICAgPC9pb24tbGFiZWw+XG4gICAgPC9pb24taXRlbT5cblxuICAgIDwhLS0gSGVscCAtLT5cbiAgICA8aW9uLWl0ZW0gKm5nSWY9XCJmb3J1bVVybCB8fCBoZWxwVXJsXCI+XG4gICAgICA8bWF0LWljb24gc2xvdD1cInN0YXJ0XCI+aGVscF9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgIDxwPlxuICAgICAgICAgIHt7ICdBQk9VVC5IRUxQJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPlxuICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJzb2xpZFwiIGNvbG9yPVwiYWNjZW50XCIgaHJlZj1cInt7IGhlbHBVcmwgfX1cIiB0YXJnZXQ9XCJoZWxwXCIgc2l6ZT1cImRlZmF1bHRcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzbG90PVwic3RhcnRcIj5kZXNjcmlwdGlvbjwvbWF0LWljb24+XG4gICAgICAgICAgICA8aW9uLXRleHQgdHJhbnNsYXRlPkFCT1VULlVTRVJfTUFOVUFMPC9pb24tdGV4dD5cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cInNvbGlkXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBocmVmPVwie3sgZm9ydW1VcmwgfX1cIiB0YXJnZXQ9XCJmb3J1bVwiIHNpemU9XCJkZWZhdWx0XCI+XG4gICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cImNoYXRidWJibGVzXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIDxpb24tdGV4dCB0cmFuc2xhdGU+QUJPVVQuRk9SVU08L2lvbi10ZXh0PlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgPC9pb24tbGFiZWw+XG4gICAgPC9pb24taXRlbT5cblxuICAgIDwhLS0gUmVwb3J0IGlzc3VlIC0tPlxuICAgIDxpb24taXRlbSAqbmdJZj1cInJlcG9ydElzc3VlVXJsXCI+XG4gICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cImJ1Z1wiIGNvbG9yPVwiZGFya1wiPjwvaW9uLWljb24+XG4gICAgICA8aW9uLWxhYmVsPlxuICAgICAgICA8cD5cbiAgICAgICAgICB7eyAnQUJPVVQuUkVQT1JUX0lTU1VFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPlxuICAgICAgICAgIDxhIGNvbG9yPVwicHJpbWFyeVwiIGhyZWY9XCJ7eyByZXBvcnRJc3N1ZVVybCB9fVwiIHRhcmdldD1cIl9zeXN0ZW1cIiB0cmFuc2xhdGU+QUJPVVQuQlROX1JFUE9SVF9JU1NVRTwvYT5cbiAgICAgICAgPC9wPlxuICAgICAgPC9pb24tbGFiZWw+XG4gICAgPC9pb24taXRlbT5cblxuICAgIDwhLS0gU291cmNlIGNvZGUgLS0+XG4gICAgPGlvbi1pdGVtICpuZ0lmPVwic291cmNlVXJsXCI+XG4gICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cImNvZGVcIiBjb2xvcj1cImRhcmtcIj48L2lvbi1pY29uPlxuICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgPHA+XG4gICAgICAgICAge3sgJ0FCT1VULlNPVVJDRV9DT0RFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPlxuICAgICAgICAgIDxhIGNvbG9yPVwicHJpbWFyeVwiIGhyZWY9XCJ7eyBzb3VyY2VVcmwgfX1cIiB0YXJnZXQ9XCJfc3lzdGVtXCI+e3sgc291cmNlVXJsIH19PC9hPlxuICAgICAgICA8L3A+XG4gICAgICA8L2lvbi1sYWJlbD5cbiAgICA8L2lvbi1pdGVtPlxuXG4gICAgPCEtLSBEZXZlbG9wZXJzIC0tPlxuICAgIDxpb24taXRlbSAqbmdJZj1cImRldmVsb3BlcnMgfCBpc05vdEVtcHR5QXJyYXlcIj5cbiAgICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBuYW1lPVwicGVvcGxlXCIgY29sb3I9XCJkYXJrXCI+PC9pb24taWNvbj5cbiAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgIDxwPlxuICAgICAgICAgIHt7ICdBQk9VVC5ERVZFTE9QRURfQlknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGlvbi1saXN0IGxpbmVzPVwibm9uZVwiPlxuICAgICAgICAgIDxpb24taXRlbSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkZXZlbG9wZXJzXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgPGEgY29sb3I9XCJwcmltYXJ5XCIgaHJlZj1cInt7IGl0ZW0uc2l0ZVVybCB9fVwiIHRhcmdldD1cIl9zeXN0ZW1cIj57eyBpdGVtLm5hbWUgfHwgaXRlbS5sYWJlbCB9fTwvYT5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICA8aW9uLWltZyBzbG90PVwiZW5kXCIgW3NyY109XCJpdGVtLmxvZ29cIiAvPlxuICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgIDwvaW9uLWxpc3Q+XG4gICAgICA8L2lvbi1sYWJlbD5cbiAgICA8L2lvbi1pdGVtPlxuXG4gICAgPCEtLSBQYXJ0bmVycyAtLT5cbiAgICA8aW9uLWl0ZW0gY2xhc3M9XCJpdGVtLXBhcnRuZXJzXCIgKm5nSWY9XCJwYXJ0bmVycyB8IGlzTm90RW1wdHlBcnJheVwiPlxuICAgICAgPGlvbi1pY29uIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJtZWdhcGhvbmVcIiBjb2xvcj1cImRhcmtcIj48L2lvbi1pY29uPlxuICAgICAgPGlvbi10ZXh0PlxuICAgICAgICA8cD57eyAnQUJPVVQuUEFSVE5FUlMnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8cD5cbiAgICAgICAgICA8YSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwYXJ0bmVyc1wiIGhyZWY9XCJ7eyBpdGVtLnNpdGVVcmwgfX1cIiBjbGFzcz1cInBhcnRuZXJzXCIgdGFyZ2V0PVwiX3N5c3RlbVwiPlxuICAgICAgICAgICAgPGltZyAqbmdJZj1cIml0ZW0ubG9nbzsgZWxzZSBwYXJ0bmVyTmFtZVwiIFtzcmNdPVwiaXRlbS5sb2dvXCIgW2FsdF09XCJpdGVtLmxhYmVsXCIgLz5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGFydG5lck5hbWU+XG4gICAgICAgICAgICAgIDxpb24tdGV4dD57eyBpdGVtLmxhYmVsIH19PC9pb24tdGV4dD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L3A+XG4gICAgICA8L2lvbi10ZXh0PlxuICAgIDwvaW9uLWl0ZW0+XG4gIDwvaW9uLWxpc3Q+XG48L2lvbi1jb250ZW50PlxuXG48aW9uLWZvb3RlciBoaWRkZW4teHMgaGlkZGVuLXNtIGhpZGRlbi1tb2JpbGU+XG4gIDxpb24tdG9vbGJhcj5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCIgbm93cmFwPlxuICAgICAgPGlvbi1jb2w+PC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIj5cbiAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cInNvbGlkXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiIChjbGljayk9XCJjbG9zZSgpXCI+e3sgJ0NPTU1PTi5CVE5fQ0xPU0UnIHwgdHJhbnNsYXRlIH19PC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgPC9pb24tdG9vbGJhcj5cbjwvaW9uLWZvb3Rlcj5cbiJdfQ==
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJvdXQubW9kYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvYWJvdXQvYWJvdXQubW9kYWwudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvYWJvdXQvYWJvdXQubW9kYWwuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQWEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUsvRCxPQUFPLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7Ozs7O0FBRXJFLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLElBQUksY0FBYyxDQUF3QixpQkFBaUIsQ0FBQyxDQUFDO0FBQ2pHLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksY0FBYyxDQUF3QixlQUFlLENBQUMsQ0FBQztBQU83RixNQUFNLE9BQU8sVUFBVTtJQVlUO0lBQ0E7SUFDQTtJQUNpQztJQUNNO0lBQ0Y7SUFoQnhDLElBQUksQ0FBUztJQUNiLE9BQU8sQ0FBUztJQUNoQixTQUFTLENBQVM7SUFDbEIsT0FBTyxDQUE0QjtJQUM1QyxjQUFjLENBQVM7SUFDdkIsUUFBUSxDQUFTO0lBQ2pCLE9BQU8sQ0FBUztJQUVDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBRXBELFlBQ1ksU0FBMkIsRUFDM0IsZUFBZ0MsRUFDaEMsYUFBNEIsRUFDSyxXQUFXLEVBQ0wsVUFBaUMsRUFDbkMsUUFBK0I7UUFMcEUsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0Isb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ0ssZ0JBQVcsR0FBWCxXQUFXLENBQUE7UUFDTCxlQUFVLEdBQVYsVUFBVSxDQUF1QjtRQUNuQyxhQUFRLEdBQVIsUUFBUSxDQUF1QjtRQUU5RSxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzdCLGtEQUFrRDtZQUNsRCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUkscUJBQXFCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO1FBQ3hHLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDO1FBQ2xELElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUM7UUFDdEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLElBQUksV0FBVyxDQUFDLGNBQWMsQ0FBQztRQUNoRSxJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDbEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBRXBDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1QsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCwrQkFBK0I7SUFFckIsU0FBUyxDQUFDLE1BQXNCO1FBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxFQUFFLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUNoRyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sRUFBRSxXQUFXLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDN0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLEVBQUUsV0FBVyxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUM7SUFDckgsQ0FBQzt1R0FoRFUsVUFBVSw4R0FlQyxXQUFXLDZCQUNYLG9CQUFvQiw2QkFDcEIsa0JBQWtCOzJGQWpCN0IsVUFBVSx1RENuQnZCLGl3SkFpSkE7OzJGRDlIYSxVQUFVO2tCQUx0QixTQUFTOytCQUNFLGlCQUFpQjs7MEJBbUJ4QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFdBQVc7OzBCQUM5QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLG9CQUFvQjs7MEJBQ3ZDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIEluamVjdGlvblRva2VuLCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBjYXBpdGFsaXplRmlyc3RMZXR0ZXIgfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IERlcGFydG1lbnQgfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9kZXBhcnRtZW50Lm1vZGVsJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvY29uZmlnLm1vZGVsJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ09SRV9DT05GSUdfT1BUSU9OUyB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5cbmV4cG9ydCBjb25zdCBBUFBfQUJPVVRfREVWRUxPUEVSUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxQYXJ0aWFsPERlcGFydG1lbnQ+W10+KCdhYm91dERldmVsb3BlcnMnKTtcbmV4cG9ydCBjb25zdCBBUFBfQUJPVVRfUEFSVE5FUlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48UGFydGlhbDxEZXBhcnRtZW50PltdPignYWJvdXRQYXJ0bmVycycpO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtYWJvdXQtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWJvdXQubW9kYWwuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Fib3V0Lm1vZGFsLnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQWJvdXRNb2RhbCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBzb3VyY2VVcmw6IHN0cmluZztcbiAgcmVhZG9ubHkgY29uZmlnJDogT2JzZXJ2YWJsZTxDb25maWd1cmF0aW9uPjtcbiAgcmVwb3J0SXNzdWVVcmw6IHN0cmluZztcbiAgZm9ydW1Vcmw6IHN0cmluZztcbiAgaGVscFVybDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBtb2RhbENvbnRyb2xsZXI6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfQUJPVVRfREVWRUxPUEVSUykgcHVibGljIGRldmVsb3BlcnM6IFBhcnRpYWw8RGVwYXJ0bWVudD5bXSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9BQk9VVF9QQVJUTkVSUykgcHVibGljIHBhcnRuZXJzOiBQYXJ0aWFsPERlcGFydG1lbnQ+W11cbiAgKSB7XG4gICAgdGhpcy5uYW1lID0gdHJhbnNsYXRlLmluc3RhbnQoJ0FQUF9OQU1FJyk7XG4gICAgaWYgKHRoaXMubmFtZSA9PT0gJ0FQUF9OQU1FJykge1xuICAgICAgLy8gTm90IHRyYW5zbGF0ZWQ6IHVzZSBuYW1lIGZyb20gdGhlIGVudmlyb25uZW1lbnRcbiAgICAgIHRoaXMubmFtZSA9IChlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5uYW1lICYmIGNhcGl0YWxpemVGaXJzdExldHRlcihlbnZpcm9ubWVudC5uYW1lKSkgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLnZlcnNpb24gPSBlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC52ZXJzaW9uO1xuICAgIHRoaXMuc291cmNlVXJsID0gZW52aXJvbm1lbnQgJiYgZW52aXJvbm1lbnQuc291cmNlVXJsO1xuICAgIHRoaXMucmVwb3J0SXNzdWVVcmwgPSBlbnZpcm9ubWVudCAmJiBlbnZpcm9ubWVudC5yZXBvcnRJc3N1ZVVybDtcbiAgICB0aGlzLmZvcnVtVXJsID0gZW52aXJvbm1lbnQgJiYgZW52aXJvbm1lbnQuZm9ydW1Vcmw7XG4gICAgdGhpcy5oZWxwVXJsID0gZW52aXJvbm1lbnQgJiYgZW52aXJvbm1lbnQuaGVscFVybDtcbiAgICB0aGlzLmNvbmZpZyQgPSBjb25maWdTZXJ2aWNlLmNvbmZpZztcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQodGhpcy5jb25maWckLnN1YnNjcmliZSgoY29uZmlnKSA9PiB0aGlzLnNldENvbmZpZyhjb25maWcpKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIGF3YWl0IHRoaXMubW9kYWxDb250cm9sbGVyLmRpc21pc3MoKTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBmdW5jdGlvbnMgLS0gKi9cblxuICBwcm90ZWN0ZWQgc2V0Q29uZmlnKGNvbmZpZz86IENvbmZpZ3VyYXRpb24pIHtcbiAgICB0aGlzLmZvcnVtVXJsID0gY29uZmlnPy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLkZPUlVNX1VSTCkgfHwgdGhpcy5lbnZpcm9ubWVudC5mb3J1bVVybDtcbiAgICB0aGlzLmhlbHBVcmwgPSBjb25maWc/LmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuSEVMUF9VUkwpIHx8IHRoaXMuZW52aXJvbm1lbnQuaGVscFVybDtcbiAgICB0aGlzLnJlcG9ydElzc3VlVXJsID0gY29uZmlnPy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLlJFUE9SVF9JU1NVRV9VUkwpIHx8IHRoaXMuZW52aXJvbm1lbnQucmVwb3J0SXNzdWVVcmw7XG4gIH1cbn1cbiIsIjxpb24taGVhZGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJsaWdodFwiPlxuICAgIDxpb24tdGl0bGU+XG4gICAgICB7eyAnQUJPVVQuVElUTEUnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9pb24tdGl0bGU+XG5cbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cImNsb3NlKClcIiB2aXNpYmxlLXhzIHZpc2libGUtc20gdmlzaWJsZS1tb2JpbGU+XG4gICAgICAgIHt7ICdDT01NT04uQlROX0NMT1NFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1oZWFkZXI+XG5cbjxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gIDxpb24tbGlzdCBsaW5lcz1cIm5vbmVcIj5cbiAgICA8IS0tIFBlZXIgaW5mbyAtLT5cbiAgICBAaWYgKGNvbmZpZyQgfCBhc3luYzsgYXMgY29uZmlnKSB7XG4gICAgICA8aW9uLWl0ZW0+XG4gICAgICAgIDxzcGFuIHNsb3Q9XCJzdGFydFwiPiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cImlvbi10ZXh0LXdyYXBcIj5cbiAgICAgICAgICA8aDI+XG4gICAgICAgICAgICA8Yj57eyBjb25maWcubGFiZWwgfCBjYXBpdGFsaXplIH19PC9iPlxuICAgICAgICAgICAgQGlmIChjb25maWcubmFtZSkge1xuICAgICAgICAgICAgICAtXG4gICAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwiY29uZmlnLm5hbWVcIj48L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9oMj5cblxuICAgICAgICAgIEBpZiAoY29uZmlnLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgPG1hcmtkb3duIFtkYXRhXT1cImNvbmZpZy5kZXNjcmlwdGlvblwiIGVtb2ppPjwvbWFya2Rvd24+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgfVxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgfVxuXG4gICAgPCEtLSBWZXJzaW9uIGluZm8gLS0+XG4gICAgPGlvbi1pdGVtPlxuICAgICAgPHNwYW4gc2xvdD1cInN0YXJ0XCI+Jm5ic3A7PC9zcGFuPlxuICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cImlvbi10ZXh0LXdyYXBcIj5cbiAgICAgICAgPGgyPlxuICAgICAgICAgIDxzbWFsbCAqbmdJZj1cIm5hbWVcIj57eyAnQUJPVVQuUE9XRVJFRF9CWScgfCB0cmFuc2xhdGUgfX08L3NtYWxsPlxuICAgICAgICAgIHt7IG5hbWUgfX1cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cInZlcnNpb25cIiBbaW5uZXJIVE1MXT1cIidBQk9VVC5WRVJTSU9OJyB8IHRyYW5zbGF0ZTogeyB2ZXJzaW9uOiB2ZXJzaW9uIH1cIj48L3NwYW4+XG4gICAgICAgIDwvaDI+XG4gICAgICAgIDxwIFtpbm5lckhUTUxdPVwiJ0FCT1VULkxJQ0VOU0UnIHwgdHJhbnNsYXRlXCI+PC9wPlxuICAgICAgPC9pb24tbGFiZWw+XG4gICAgPC9pb24taXRlbT5cblxuICAgIDwhLS0gSGVscCAtLT5cbiAgICA8aW9uLWl0ZW0gKm5nSWY9XCJmb3J1bVVybCB8fCBoZWxwVXJsXCI+XG4gICAgICA8bWF0LWljb24gc2xvdD1cInN0YXJ0XCI+aGVscF9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgIDxwPlxuICAgICAgICAgIHt7ICdBQk9VVC5IRUxQJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPlxuICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJzb2xpZFwiIGNvbG9yPVwiYWNjZW50XCIgaHJlZj1cInt7IGhlbHBVcmwgfX1cIiB0YXJnZXQ9XCJoZWxwXCIgc2l6ZT1cImRlZmF1bHRcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzbG90PVwic3RhcnRcIj5kZXNjcmlwdGlvbjwvbWF0LWljb24+XG4gICAgICAgICAgICA8aW9uLXRleHQgdHJhbnNsYXRlPkFCT1VULlVTRVJfTUFOVUFMPC9pb24tdGV4dD5cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cInNvbGlkXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBocmVmPVwie3sgZm9ydW1VcmwgfX1cIiB0YXJnZXQ9XCJmb3J1bVwiIHNpemU9XCJkZWZhdWx0XCI+XG4gICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cImNoYXRidWJibGVzXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIDxpb24tdGV4dCB0cmFuc2xhdGU+QUJPVVQuRk9SVU08L2lvbi10ZXh0PlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9wPlxuICAgICAgPC9pb24tbGFiZWw+XG4gICAgPC9pb24taXRlbT5cblxuICAgIDwhLS0gUmVwb3J0IGlzc3VlIC0tPlxuICAgIDxpb24taXRlbSAqbmdJZj1cInJlcG9ydElzc3VlVXJsXCI+XG4gICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cImJ1Z1wiIGNvbG9yPVwiZGFya1wiPjwvaW9uLWljb24+XG4gICAgICA8aW9uLWxhYmVsPlxuICAgICAgICA8cD5cbiAgICAgICAgICB7eyAnQUJPVVQuUkVQT1JUX0lTU1VFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPlxuICAgICAgICAgIDxhIGNvbG9yPVwicHJpbWFyeVwiIGhyZWY9XCJ7eyByZXBvcnRJc3N1ZVVybCB9fVwiIHRhcmdldD1cIl9zeXN0ZW1cIiB0cmFuc2xhdGU+QUJPVVQuQlROX1JFUE9SVF9JU1NVRTwvYT5cbiAgICAgICAgPC9wPlxuICAgICAgPC9pb24tbGFiZWw+XG4gICAgPC9pb24taXRlbT5cblxuICAgIDwhLS0gU291cmNlIGNvZGUgLS0+XG4gICAgPGlvbi1pdGVtICpuZ0lmPVwic291cmNlVXJsXCI+XG4gICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cImNvZGVcIiBjb2xvcj1cImRhcmtcIj48L2lvbi1pY29uPlxuICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgPHA+XG4gICAgICAgICAge3sgJ0FCT1VULlNPVVJDRV9DT0RFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPlxuICAgICAgICAgIDxhIGNvbG9yPVwicHJpbWFyeVwiIGhyZWY9XCJ7eyBzb3VyY2VVcmwgfX1cIiB0YXJnZXQ9XCJfc3lzdGVtXCI+e3sgc291cmNlVXJsIH19PC9hPlxuICAgICAgICA8L3A+XG4gICAgICA8L2lvbi1sYWJlbD5cbiAgICA8L2lvbi1pdGVtPlxuXG4gICAgPCEtLSBEZXZlbG9wZXJzIC0tPlxuICAgIDxpb24taXRlbSAqbmdJZj1cImRldmVsb3BlcnMgfCBpc05vdEVtcHR5QXJyYXlcIj5cbiAgICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBuYW1lPVwicGVvcGxlXCIgY29sb3I9XCJkYXJrXCI+PC9pb24taWNvbj5cbiAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgIDxwPlxuICAgICAgICAgIHt7ICdBQk9VVC5ERVZFTE9QRURfQlknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGlvbi1saXN0IGxpbmVzPVwibm9uZVwiPlxuICAgICAgICAgIDxpb24taXRlbSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkZXZlbG9wZXJzXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgPGEgY29sb3I9XCJwcmltYXJ5XCIgaHJlZj1cInt7IGl0ZW0uc2l0ZVVybCB9fVwiIHRhcmdldD1cIl9zeXN0ZW1cIj57eyBpdGVtLm5hbWUgfHwgaXRlbS5sYWJlbCB9fTwvYT5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICA8aW9uLWltZyBzbG90PVwiZW5kXCIgW3NyY109XCJpdGVtLmxvZ29cIiAvPlxuICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgIDwvaW9uLWxpc3Q+XG4gICAgICA8L2lvbi1sYWJlbD5cbiAgICA8L2lvbi1pdGVtPlxuXG4gICAgPCEtLSBQYXJ0bmVycyAtLT5cbiAgICA8aW9uLWl0ZW0gY2xhc3M9XCJpdGVtLXBhcnRuZXJzXCIgKm5nSWY9XCJwYXJ0bmVycyB8IGlzTm90RW1wdHlBcnJheVwiPlxuICAgICAgPGlvbi1pY29uIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJtZWdhcGhvbmVcIiBjb2xvcj1cImRhcmtcIj48L2lvbi1pY29uPlxuICAgICAgPGlvbi10ZXh0PlxuICAgICAgICA8cD57eyAnQUJPVVQuUEFSVE5FUlMnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8cD5cbiAgICAgICAgICA8YSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwYXJ0bmVyc1wiIGhyZWY9XCJ7eyBpdGVtLnNpdGVVcmwgfX1cIiBjbGFzcz1cInBhcnRuZXJzXCIgdGFyZ2V0PVwiX3N5c3RlbVwiPlxuICAgICAgICAgICAgPGltZyAqbmdJZj1cIml0ZW0ubG9nbzsgZWxzZSBwYXJ0bmVyTmFtZVwiIFtzcmNdPVwiaXRlbS5sb2dvXCIgW2FsdF09XCJpdGVtLmxhYmVsXCIgLz5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGFydG5lck5hbWU+XG4gICAgICAgICAgICAgIDxpb24tdGV4dD57eyBpdGVtLmxhYmVsIH19PC9pb24tdGV4dD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L3A+XG4gICAgICA8L2lvbi10ZXh0PlxuICAgIDwvaW9uLWl0ZW0+XG4gIDwvaW9uLWxpc3Q+XG48L2lvbi1jb250ZW50PlxuXG48aW9uLWZvb3RlciBoaWRkZW4teHMgaGlkZGVuLXNtIGhpZGRlbi1tb2JpbGU+XG4gIDxpb24tdG9vbGJhcj5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCIgbm93cmFwPlxuICAgICAgPGlvbi1jb2w+PC9pb24tY29sPlxuICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIj5cbiAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cInNvbGlkXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiIChjbGljayk9XCJjbG9zZSgpXCI+e3sgJ0NPTU1PTi5CVE5fQ0xPU0UnIHwgdHJhbnNsYXRlIH19PC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgPC9pb24tdG9vbGJhcj5cbjwvaW9uLWZvb3Rlcj5cbiJdfQ==
@@ -3,19 +3,20 @@ import { SharedModule } from '../../shared/shared.module';
3
3
  import { IonicModule } from '@ionic/angular';
4
4
  import { AboutModal } from './about.modal';
5
5
  import { TranslateModule } from '@ngx-translate/core';
6
+ import { MarkdownModule } from 'ngx-markdown';
6
7
  import * as i0 from "@angular/core";
7
8
  import * as i1 from "@ngx-translate/core";
8
9
  export class AppAboutModalModule {
9
10
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AppAboutModalModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.8", ngImport: i0, type: AppAboutModalModule, declarations: [AboutModal], imports: [SharedModule, IonicModule, i1.TranslateModule], exports: [TranslateModule, AboutModal] });
11
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AppAboutModalModule, imports: [SharedModule, IonicModule, TranslateModule.forChild(), TranslateModule] });
11
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.8", ngImport: i0, type: AppAboutModalModule, declarations: [AboutModal], imports: [SharedModule, IonicModule, i1.TranslateModule, MarkdownModule], exports: [TranslateModule, AboutModal] });
12
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AppAboutModalModule, imports: [SharedModule, IonicModule, TranslateModule.forChild(), MarkdownModule, TranslateModule] });
12
13
  }
13
14
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AppAboutModalModule, decorators: [{
14
15
  type: NgModule,
15
16
  args: [{
16
- imports: [SharedModule, IonicModule, TranslateModule.forChild()],
17
+ imports: [SharedModule, IonicModule, TranslateModule.forChild(), MarkdownModule],
17
18
  declarations: [AboutModal],
18
19
  exports: [TranslateModule, AboutModal],
19
20
  }]
20
21
  }] });
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJvdXQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Fib3V0L2Fib3V0Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQVF0RCxNQUFNLE9BQU8sbUJBQW1CO3VHQUFuQixtQkFBbUI7d0dBQW5CLG1CQUFtQixpQkFIZixVQUFVLGFBRmYsWUFBWSxFQUFFLFdBQVcsaUNBR3pCLGVBQWUsRUFBRSxVQUFVO3dHQUUxQixtQkFBbUIsWUFMcEIsWUFBWSxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFLEVBR3JELGVBQWU7OzJGQUVkLG1CQUFtQjtrQkFOL0IsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFFaEUsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO29CQUMxQixPQUFPLEVBQUUsQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDO2lCQUN2QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTaGFyZWRNb2R1bGUgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2hhcmVkLm1vZHVsZSc7XG5pbXBvcnQgeyBJb25pY01vZHVsZSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IEFib3V0TW9kYWwgfSBmcm9tICcuL2Fib3V0Lm1vZGFsJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbU2hhcmVkTW9kdWxlLCBJb25pY01vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLmZvckNoaWxkKCldLFxuXG4gIGRlY2xhcmF0aW9uczogW0Fib3V0TW9kYWxdLFxuICBleHBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlLCBBYm91dE1vZGFsXSxcbn0pXG5leHBvcnQgY2xhc3MgQXBwQWJvdXRNb2RhbE1vZHVsZSB7fVxuIl19
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJvdXQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Fib3V0L2Fib3V0Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7O0FBUTlDLE1BQU0sT0FBTyxtQkFBbUI7dUdBQW5CLG1CQUFtQjt3R0FBbkIsbUJBQW1CLGlCQUhmLFVBQVUsYUFGZixZQUFZLEVBQUUsV0FBVyxzQkFBOEIsY0FBYyxhQUdyRSxlQUFlLEVBQUUsVUFBVTt3R0FFMUIsbUJBQW1CLFlBTHBCLFlBQVksRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRSxFQUFFLGNBQWMsRUFHckUsZUFBZTs7MkZBRWQsbUJBQW1CO2tCQU4vQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRSxFQUFFLGNBQWMsQ0FBQztvQkFFaEYsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO29CQUMxQixPQUFPLEVBQUUsQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDO2lCQUN2QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTaGFyZWRNb2R1bGUgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2hhcmVkLm1vZHVsZSc7XG5pbXBvcnQgeyBJb25pY01vZHVsZSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IEFib3V0TW9kYWwgfSBmcm9tICcuL2Fib3V0Lm1vZGFsJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTWFya2Rvd25Nb2R1bGUgfSBmcm9tICduZ3gtbWFya2Rvd24nO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbU2hhcmVkTW9kdWxlLCBJb25pY01vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLmZvckNoaWxkKCksIE1hcmtkb3duTW9kdWxlXSxcblxuICBkZWNsYXJhdGlvbnM6IFtBYm91dE1vZGFsXSxcbiAgZXhwb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgQWJvdXRNb2RhbF0sXG59KVxuZXhwb3J0IGNsYXNzIEFwcEFib3V0TW9kYWxNb2R1bGUge31cbiJdfQ==