@pobuca/email-builder 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +1 -1
  2. package/bundles/pobuca-email-builder.umd.js +4464 -4414
  3. package/bundles/pobuca-email-builder.umd.js.map +1 -1
  4. package/bundles/pobuca-email-builder.umd.min.js +1 -1
  5. package/bundles/pobuca-email-builder.umd.min.js.map +1 -1
  6. package/esm2015/lib/classes/DefaultEmail.js +54 -53
  7. package/esm2015/lib/classes/Elements.js +229 -229
  8. package/esm2015/lib/classes/Structure.js +89 -89
  9. package/esm2015/lib/components/block/block.component.js +89 -89
  10. package/esm2015/lib/components/block-settings/block-settings.component.js +53 -53
  11. package/esm2015/lib/components/builder-container/builder-container.component.js +114 -114
  12. package/esm2015/lib/components/dialog.component.js +30 -30
  13. package/esm2015/lib/components/general-settings/general-settings.component.js +25 -25
  14. package/esm2015/lib/components/import-dialog/import-dialog.component.js +62 -62
  15. package/esm2015/lib/components/preview.component.js +89 -89
  16. package/esm2015/lib/components/structure/structure.component.js +163 -163
  17. package/esm2015/lib/components/structure-settings/structure-settings.component.js +31 -31
  18. package/esm2015/lib/components/template-list-dialog/template-list-dialog.component.js +45 -45
  19. package/esm2015/lib/directives/dynamic-component.directive.js +46 -46
  20. package/esm2015/lib/elements/abstract-block.js +23 -23
  21. package/esm2015/lib/elements/button/button.component.js +29 -29
  22. package/esm2015/lib/elements/divider/divider.component.js +30 -30
  23. package/esm2015/lib/elements/image/image.component.js +54 -54
  24. package/esm2015/lib/elements/social/social.component.js +42 -42
  25. package/esm2015/lib/elements/spacer/spacer.component.js +30 -30
  26. package/esm2015/lib/elements/text-element/text-element.component.js +80 -80
  27. package/esm2015/lib/groups/align.js +79 -79
  28. package/esm2015/lib/groups/back-repeat.js +55 -55
  29. package/esm2015/lib/groups/border.js +102 -102
  30. package/esm2015/lib/groups/color.js +139 -139
  31. package/esm2015/lib/groups/direction.js +63 -63
  32. package/esm2015/lib/groups/font-styles.js +127 -112
  33. package/esm2015/lib/groups/gaps.js +45 -45
  34. package/esm2015/lib/groups/line-height.js +68 -68
  35. package/esm2015/lib/groups/link.js +67 -67
  36. package/esm2015/lib/groups/margin.js +45 -45
  37. package/esm2015/lib/groups/padding.js +53 -53
  38. package/esm2015/lib/groups/upload-image.js +112 -112
  39. package/esm2015/lib/groups/width-height.js +94 -94
  40. package/esm2015/lib/interceptors/pb-interceptor.interceptor.js +51 -51
  41. package/esm2015/lib/interfaces/interfaces.js +13 -13
  42. package/esm2015/lib/pb-email-builder.component.js +258 -246
  43. package/esm2015/lib/pb-email-builder.module.js +291 -291
  44. package/esm2015/lib/pb-email-builder.service.js +134 -134
  45. package/esm2015/lib/pipes/slugify.pipe.js +39 -39
  46. package/esm2015/lib/services/internals/pb-email-object-store/pb-email-object-store.service.js +175 -165
  47. package/esm2015/lib/services/internals/user-interfaces/user-interface.service.js +122 -122
  48. package/esm2015/lib/services/pb-storage/FreeUsersStorage.class.js +11 -11
  49. package/esm2015/lib/services/pb-storage/index.js +7 -7
  50. package/esm2015/lib/services/pb-storage/pb-storage.service.js +79 -79
  51. package/esm2015/lib/services/user-image-uploader-service/free-users-image-uploader.service.js +26 -26
  52. package/esm2015/lib/services/user-image-uploader-service/index.js +8 -8
  53. package/esm2015/lib/services/user-image-uploader-service/paid-users-image-uploader.service.js +30 -30
  54. package/esm2015/lib/services/user-image-uploader-service/upload-bottom-sheet-dialog/upload-bottom-sheet-dialog.component.js +112 -112
  55. package/esm2015/lib/services/user-image-uploader-service/upload-image-gallery/upload-image-gallery.component.js +91 -91
  56. package/esm2015/lib/services/user-image-uploader-service/user-image-uploader.service.js +26 -26
  57. package/esm2015/lib/services/user-middleware-service/FreeUsersMiddleware.js +31 -31
  58. package/esm2015/lib/services/user-middleware-service/PaidUsersMiddleware.js +12 -12
  59. package/esm2015/lib/services/user-middleware-service/index.js +8 -8
  60. package/esm2015/lib/services/user-middleware-service/pb-middlewares.service.js +195 -195
  61. package/esm2015/lib/services/user-rest-api-service/free-users-rest-api.service.js +16 -16
  62. package/esm2015/lib/services/user-rest-api-service/index.js +7 -7
  63. package/esm2015/lib/services/user-rest-api-service/user-rest-api.service.js +116 -116
  64. package/esm2015/lib/tokens/private-tokens.js +17 -17
  65. package/esm2015/lib/tokens/tokens.js +159 -159
  66. package/esm2015/lib/utils.js +147 -147
  67. package/esm2015/pobuca-email-builder.js +42 -42
  68. package/esm2015/public_api.js +26 -26
  69. package/fesm2015/pobuca-email-builder.js +4206 -4168
  70. package/fesm2015/pobuca-email-builder.js.map +1 -1
  71. package/lib/classes/DefaultEmail.d.ts +10 -9
  72. package/lib/classes/Elements.d.ts +62 -62
  73. package/lib/classes/Structure.d.ts +11 -11
  74. package/lib/components/block/block.component.d.ts +25 -25
  75. package/lib/components/block-settings/block-settings.component.d.ts +18 -18
  76. package/lib/components/builder-container/builder-container.component.d.ts +36 -36
  77. package/lib/components/dialog.component.d.ts +10 -10
  78. package/lib/components/general-settings/general-settings.component.d.ts +6 -6
  79. package/lib/components/import-dialog/import-dialog.component.d.ts +16 -16
  80. package/lib/components/preview.component.d.ts +18 -18
  81. package/lib/components/structure/structure.component.d.ts +43 -43
  82. package/lib/components/structure-settings/structure-settings.component.d.ts +9 -9
  83. package/lib/components/template-list-dialog/template-list-dialog.component.d.ts +15 -15
  84. package/lib/directives/dynamic-component.directive.d.ts +13 -13
  85. package/lib/elements/abstract-block.d.ts +8 -8
  86. package/lib/elements/button/button.component.d.ts +18 -18
  87. package/lib/elements/divider/divider.component.d.ts +10 -10
  88. package/lib/elements/image/image.component.d.ts +19 -19
  89. package/lib/elements/social/social.component.d.ts +21 -21
  90. package/lib/elements/spacer/spacer.component.d.ts +5 -5
  91. package/lib/elements/text-element/text-element.component.d.ts +52 -52
  92. package/lib/groups/align.d.ts +17 -17
  93. package/lib/groups/back-repeat.d.ts +8 -8
  94. package/lib/groups/border.d.ts +13 -13
  95. package/lib/groups/color.d.ts +26 -26
  96. package/lib/groups/direction.d.ts +13 -13
  97. package/lib/groups/font-styles.d.ts +21 -17
  98. package/lib/groups/gaps.d.ts +7 -7
  99. package/lib/groups/line-height.d.ts +12 -12
  100. package/lib/groups/link.d.ts +11 -11
  101. package/lib/groups/margin.d.ts +8 -8
  102. package/lib/groups/padding.d.ts +8 -8
  103. package/lib/groups/upload-image.d.ts +19 -19
  104. package/lib/groups/width-height.d.ts +19 -19
  105. package/lib/interceptors/pb-interceptor.interceptor.d.ts +10 -10
  106. package/lib/interfaces/interfaces.d.ts +430 -422
  107. package/lib/pb-email-builder.component.d.ts +67 -67
  108. package/lib/pb-email-builder.module.d.ts +51 -51
  109. package/lib/pb-email-builder.service.d.ts +83 -83
  110. package/lib/pipes/slugify.pipe.d.ts +9 -9
  111. package/lib/services/internals/pb-email-object-store/pb-email-object-store.service.d.ts +50 -50
  112. package/lib/services/internals/user-interfaces/user-interface.service.d.ts +46 -46
  113. package/lib/services/pb-storage/FreeUsersStorage.class.d.ts +6 -6
  114. package/lib/services/pb-storage/index.d.ts +2 -2
  115. package/lib/services/pb-storage/pb-storage.service.d.ts +54 -54
  116. package/lib/services/user-image-uploader-service/free-users-image-uploader.service.d.ts +12 -12
  117. package/lib/services/user-image-uploader-service/index.d.ts +3 -3
  118. package/lib/services/user-image-uploader-service/paid-users-image-uploader.service.d.ts +14 -14
  119. package/lib/services/user-image-uploader-service/upload-bottom-sheet-dialog/upload-bottom-sheet-dialog.component.d.ts +28 -28
  120. package/lib/services/user-image-uploader-service/upload-image-gallery/upload-image-gallery.component.d.ts +27 -27
  121. package/lib/services/user-image-uploader-service/user-image-uploader.service.d.ts +26 -26
  122. package/lib/services/user-middleware-service/FreeUsersMiddleware.d.ts +15 -15
  123. package/lib/services/user-middleware-service/PaidUsersMiddleware.d.ts +7 -7
  124. package/lib/services/user-middleware-service/index.d.ts +3 -3
  125. package/lib/services/user-middleware-service/pb-middlewares.service.d.ts +190 -190
  126. package/lib/services/user-rest-api-service/free-users-rest-api.service.d.ts +10 -10
  127. package/lib/services/user-rest-api-service/index.d.ts +2 -2
  128. package/lib/services/user-rest-api-service/user-rest-api.service.d.ts +82 -82
  129. package/lib/tokens/private-tokens.d.ts +5 -5
  130. package/lib/tokens/tokens.d.ts +70 -70
  131. package/lib/utils.d.ts +88 -88
  132. package/package.json +8 -3
  133. package/pobuca-email-builder.d.ts +42 -42
  134. package/pobuca-email-builder.metadata.json +1 -1
  135. package/public_api.d.ts +16 -16
@@ -1,165 +1,175 @@
1
- /*
2
- * Copyright (c) 2024 Pobuca.
3
- * All rights reserved.
4
- */
5
- import { Inject, Injectable } from '@angular/core';
6
- import { moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';
7
- import { BehaviorSubject, combineLatest, Subject } from 'rxjs';
8
- import { exhaustMap, map, pluck, switchMap, withLatestFrom } from 'rxjs/operators';
9
- // import { getDiff } from 'recursive-diff';
10
- import { PbUserMiddlewaresService } from '../../user-middleware-service/pb-middlewares.service';
11
- import { PBEmail } from '../../../classes/DefaultEmail';
12
- import { cloneDeep, createPadding, createWidthHeight, deferOf, isEqual } from '../../../utils';
13
- import { PbUserRestApiService } from '../../user-rest-api-service/user-rest-api.service';
14
- import { PbStorageService } from '../../pb-storage/pb-storage.service';
15
- import { PB_CONFIG, PB_GOOGLE_FONTS } from '../../../tokens/tokens';
16
- import * as i0 from "@angular/core";
17
- import * as i1 from "../../user-rest-api-service/user-rest-api.service";
18
- import * as i2 from "../../pb-storage/pb-storage.service";
19
- import * as i3 from "../../user-middleware-service/pb-middlewares.service";
20
- import * as i4 from "../../../tokens/tokens";
21
- // https://www.npmjs.com/package/recursive-diff
22
- /**
23
- * @internal
24
- */
25
- export class PbEmailObjectStoreService {
26
- constructor(userRestApi, pbStorage, userMiddleware, googleFonts, config) {
27
- this.userRestApi = userRestApi;
28
- this.pbStorage = pbStorage;
29
- this.userMiddleware = userMiddleware;
30
- this.googleFonts = googleFonts;
31
- this.config = config;
32
- this.Email = new PBEmail();
33
- this.clonedEmail = cloneDeep(this.Email);
34
- this._Email$ = new BehaviorSubject(this.Email);
35
- this.emailAsObservable$ = this._Email$.asObservable();
36
- this.emailStructuresAsObservable$ = this.emailAsObservable$.pipe(pluck('structures'));
37
- this.generalEmailOptionsAsObservable$ = this.emailAsObservable$.pipe(pluck('general'));
38
- this.currentEmailHasChanges$ = this.emailAsObservable$.pipe(map(current => !isEqual(current, this.clonedEmail))
39
- // shareReplay(),
40
- // tap((isDirty) => console.log('IsDirty', isDirty)),
41
- );
42
- this.builderContainerStyles$ = this.generalEmailOptionsAsObservable$.pipe(map(({ background, padding, direction }) => (Object.assign({ direction, backgroundRepeat: background.repeat, backgroundColor: background.color, backgroundSize: createWidthHeight(background.size), backgroundPosition: 'top center' }, createPadding(padding)))));
43
- // public readonly emailBodyWidth$ = this.generalEmailOptionsAsObservable$.pipe(map(({ width }) => createWidthHeight(width)));
44
- this._Mjml$ = new BehaviorSubject('');
45
- this.mjmlAsObservable$ = this._Mjml$.asObservable();
46
- this._Template$ = new BehaviorSubject('');
47
- this.templateAsObservable$ = this._Template$.asObservable();
48
- this._onTemplateCreated$ = new Subject();
49
- this.onTemplateCreated$ = this._onTemplateCreated$.pipe(withLatestFrom(this._Email$, this._Template$, this._Mjml$), map(([_, ...rest]) => rest));
50
- }
51
- createHTMLTemplate$() {
52
- return this.emailAsObservable$.pipe(switchMap(email => {
53
- if (!email.structures.length) {
54
- throw new Error('Please add some structures and blocks to perform this action.');
55
- }
56
- return deferOf(email);
57
- }), withLatestFrom(combineLatest([this.currentEmailHasChanges$, this.templateAsObservable$])), exhaustMap(([email, [hasChanges, currentHtml]]) => {
58
- if (hasChanges || !currentHtml) {
59
- return this.userMiddleware.createHTMLTemplate(email).pipe(exhaustMap(em => this.userRestApi.createHTMLTemplate$(Object.assign(Object.assign({}, em), { googleFonts: this.googleFonts }), this.config.apiPath)), map(res => {
60
- if (res.errors.length) {
61
- const error = res.errors.map(({ message, tagName }) => `${tagName} > ${message}`).join('\n');
62
- throw new Error(error);
63
- }
64
- this._Mjml$.next(res.mjml);
65
- this._Template$.next(res.html);
66
- this.clonedEmail = cloneDeep(this.Email);
67
- this._onTemplateCreated$.next();
68
- return res;
69
- }));
70
- }
71
- return combineLatest([this._Mjml$, this._Template$]).pipe(map(([mjml, html]) => ({ html, mjml, errors: [] })));
72
- }));
73
- }
74
- markForCheck() {
75
- this._Email$.next(this.Email);
76
- if (this.Email.structures.length) {
77
- this.pbStorage.addTemplateToLatestUsed(cloneDeep({
78
- templateData: this.Email,
79
- title: 'last-edited',
80
- thumbPath: 'https://via.placeholder.com/200x300?text=LAST+EDITED'
81
- }));
82
- }
83
- // console.log(getDiff(this.clonedEmail, this.Email));
84
- }
85
- setEmail(newEmail) {
86
- if (!newEmail.structures || !newEmail.general) {
87
- throw new Error('Injected object is not a valid PBEmail');
88
- }
89
- this.Email = newEmail;
90
- this.reset();
91
- }
92
- addStructure({ currentIndex = 0, item }) {
93
- const { structures = [] } = this.Email;
94
- let isModule = true;
95
- if (!item.data.elements.length) {
96
- isModule = false;
97
- item.data.elements = Array.from({ length: item.data.columns }, () => []);
98
- }
99
- const newStructure = Object.assign(Object.assign({ id: Date.now() }, cloneDeep(item.data)), { isModule });
100
- structures.splice(currentIndex, 0, newStructure);
101
- this.markForCheck();
102
- return newStructure;
103
- }
104
- changeStructureOrder({ previousIndex = 0, currentIndex = 0 }) {
105
- moveItemInArray(this.Email.structures, previousIndex, currentIndex);
106
- this.markForCheck();
107
- }
108
- duplicateStructure(index) {
109
- const { structures = [] } = this.Email;
110
- const newStructure = cloneDeep(Object.assign(Object.assign({}, structures[index]), { id: Date.now() }));
111
- structures.splice(index, 0, newStructure);
112
- this.markForCheck();
113
- return newStructure;
114
- }
115
- removeStructure(index) {
116
- const { structures = [] } = this.Email;
117
- structures.splice(index, 1);
118
- this.markForCheck();
119
- }
120
- addBlock({ previousIndex = 0, currentIndex = 0, item, previousContainer: { id, data } }, column) {
121
- // console.log(id);
122
- // console.log(item);
123
- if (id === 'block-elements') {
124
- column.splice(currentIndex, 0, cloneDeep(item.data));
125
- }
126
- else {
127
- transferArrayItem(data, column, previousIndex, currentIndex);
128
- }
129
- this.markForCheck();
130
- }
131
- changeBlockOrder({ previousIndex = 0, currentIndex = 0 }, column) {
132
- moveItemInArray(column, previousIndex, currentIndex);
133
- this.markForCheck();
134
- }
135
- duplicateBlock(key, column, block) {
136
- const newBlock = cloneDeep(block);
137
- column.splice(key, 0, newBlock);
138
- this.markForCheck();
139
- return newBlock;
140
- }
141
- removeBlock(key, column) {
142
- column.splice(key, 1);
143
- this.markForCheck();
144
- }
145
- reset() {
146
- this._Mjml$.next(null);
147
- this._Template$.next(null);
148
- this.clonedEmail = cloneDeep(this.Email);
149
- this.markForCheck();
150
- }
151
- }
152
- PbEmailObjectStoreService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PbEmailObjectStoreService_Factory() { return new PbEmailObjectStoreService(i0.ɵɵinject(i1.PbUserRestApiService), i0.ɵɵinject(i2.PbStorageService), i0.ɵɵinject(i3.PbUserMiddlewaresService), i0.ɵɵinject(i4.PB_GOOGLE_FONTS), i0.ɵɵinject(i4.PB_CONFIG)); }, token: PbEmailObjectStoreService, providedIn: "root" });
153
- PbEmailObjectStoreService.decorators = [
154
- { type: Injectable, args: [{
155
- providedIn: 'root'
156
- },] }
157
- ];
158
- PbEmailObjectStoreService.ctorParameters = () => [
159
- { type: PbUserRestApiService },
160
- { type: PbStorageService },
161
- { type: PbUserMiddlewaresService },
162
- { type: Array, decorators: [{ type: Inject, args: [PB_GOOGLE_FONTS,] }] },
163
- { type: undefined, decorators: [{ type: Inject, args: [PB_CONFIG,] }] }
164
- ];
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGItZW1haWwtb2JqZWN0LXN0b3JlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wYi1lbWFpbC1idWlsZGVyL3NyYy9saWIvc2VydmljZXMvaW50ZXJuYWxzL3BiLWVtYWlsLW9iamVjdC1zdG9yZS9wYi1lbWFpbC1vYmplY3Qtc3RvcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekYsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkYsNENBQTRDO0FBQzVDLE9BQU8sRUFBc0Msd0JBQXdCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUdwSSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9GLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7OztBQUVwRSwrQ0FBK0M7QUFFL0M7O0dBRUc7QUFJSCxNQUFNLE9BQU8seUJBQXlCO0lBaUNwQyxZQUNVLFdBQWlDLEVB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WSxFQUFFLENBQUM7UUFDcEIsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFXLEVBQUUsTUFBaUI7UUFDeEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDOzs7O1lBeEtGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBWFEsb0JBQW9CO1lBQ3BCLGdCQUFnQjtZQU5vQix3QkFBd0I7d0NBc0RoRSxNQUFNLFNBQUMsZUFBZTs0Q0FDdEIsTUFBTSxTQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDI0IFBvYnVjYS5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5LCB0cmFuc2ZlckFycmF5SXRlbSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBleGhhdXN0TWFwLCBtYXAsIHBsdWNrLCBzd2l0Y2hNYXAsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuLy8gaW1wb3J0IHsgZ2V0RGlmZiB9IGZyb20gJ3JlY3Vyc2l2ZS1kaWZmJztcbmltcG9ydCB7IElBZGRCbG9ja0V2ZW50LCBJQWRkU3RydWN0dXJlRXZlbnQsIFBiVXNlck1pZGRsZXdhcmVzU2VydmljZSB9IGZyb20gJy4uLy4uL3VzZXItbWlkZGxld2FyZS1zZXJ2aWNlL3BiLW1pZGRsZXdhcmVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUZvclJvb3RDb25mLCBJTWptbFNlcnZlclJlc3BvbnNlLCBJU3RydWN0dXJlLCBJVXNlclRlbXBsYXRlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRCbG9ja3MgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL0VsZW1lbnRzJztcbmltcG9ydCB7IFBCRW1haWwgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL0RlZmF1bHRFbWFpbCc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGNyZWF0ZVBhZGRpbmcsIGNyZWF0ZVdpZHRoSGVpZ2h0LCBkZWZlck9mLCBpc0VxdWFsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgUGJVc2VyUmVzdEFwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi91c2VyLXJlc3QtYXBpLXNlcnZpY2UvdXNlci1yZXN0LWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IFBiU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9wYi1zdG9yYWdlL3BiLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBQQl9DT05GSUcsIFBCX0dPT0dMRV9GT05UUyB9IGZyb20gJy4uLy4uLy4uL3Rva2Vucy90b2tlbnMnO1xuXG4vLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9yZWN1cnNpdmUtZGlmZlxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQYkVtYWlsT2JqZWN0U3RvcmVTZXJ2aWNlIHtcbiAgcHVibGljIEVtYWlsID0gbmV3IFBCRW1haWwoKTtcbiAgcHJpdmF0ZSBjbG9uZWRFbWFpbCA9IGNsb25lRGVlcDxQQkVtYWlsPih0aGlzLkVtYWlsKTtcbiAgcHJpdmF0ZSBfRW1haWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQQkVtYWlsPih0aGlzLkVtYWlsKTtcbiAgcmVhZG9ubHkgZW1haWxBc09ic2VydmFibGUkID0gdGhpcy5fRW1haWwkLmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSBlbWFpbFN0cnVjdHVyZXNBc09ic2VydmFibGUkID0gdGhpcy5lbWFpbEFzT2JzZXJ2YWJsZSQucGlwZShwbHVjaygnc3RydWN0dXJlcycpKTtcbiAgcmVhZG9ubHkgZ2VuZXJhbEVtYWlsT3B0aW9uc0FzT2JzZXJ2YWJsZSQgPSB0aGlzLmVtYWlsQXNPYnNlcnZhYmxlJC5waXBlKHBsdWNrKCdnZW5lcmFsJykpO1xuICByZWFkb25seSBjdXJyZW50RW1haWxIYXNDaGFuZ2VzJCA9IHRoaXMuZW1haWxBc09ic2VydmFibGUkLnBpcGUoXG4gICAgbWFwKGN1cnJlbnQgPT4gIWlzRXF1YWwoY3VycmVudCwgdGhpcy5jbG9uZWRFbWFpbCkpXG4gICAgLy8gc2hhcmVSZXBsYXkoKSxcbiAgICAvLyB0YXAoKGlzRGlydHkpID0+IGNvbnNvbGUubG9nKCdJc0RpcnR5JywgaXNEaXJ0eSkpLFxuICApO1xuICByZWFkb25seSBidWlsZGVyQ29udGFpbmVyU3R5bGVzJCA9IHRoaXMuZ2VuZXJhbEVtYWlsT3B0aW9uc0FzT2JzZXJ2YWJsZSQucGlwZShcbiAgICBtYXAoKHsgYmFja2dyb3VuZCwgcGFkZGluZywgZGlyZWN0aW9uIH0pID0+ICh7XG4gICAgICBkaXJlY3Rpb24sXG4gICAgICBiYWNrZ3JvdW5kUmVwZWF0OiBiYWNrZ3JvdW5kLnJlcGVhdCxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZC5jb2xvcixcbiAgICAgIGJhY2tncm91bmRTaXplOiBjcmVhdGVXaWR0aEhlaWdodChiYWNrZ3JvdW5kLnNpemUpLFxuICAgICAgYmFja2dyb3VuZFBvc2l0aW9uOiAndG9wIGNlbnRlcicsXG4gICAgICAuLi5jcmVhdGVQYWRkaW5nKHBhZGRpbmcpXG4gICAgfSkpXG4gICk7XG4gIC8vIHB1YmxpYyByZWFkb25seSBlbWFpbEJvZHlXaWR0aCQgPSB0aGlzLmdlbmVyYWxFbWFpbE9wdGlvbnNBc09ic2VydmFibGUkLnBpcGUobWFwKCh7IHdpZHRoIH0pID0+IGNyZWF0ZVdpZHRoSGVpZ2h0KHdpZHRoKSkpO1xuICBwcml2YXRlIF9Nam1sJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIHB1YmxpYyByZWFkb25seSBtam1sQXNPYnNlcnZhYmxlJCA9IHRoaXMuX01qbWwkLmFzT2JzZXJ2YWJsZSgpO1xuICBwcml2YXRlIF9UZW1wbGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICBwdWJsaWMgcmVhZG9ubHkgdGVtcGxhdGVBc09ic2VydmFibGUkID0gdGhpcy5fVGVtcGxhdGUkLmFzT2JzZXJ2YWJsZSgpO1xuICBwcml2YXRlIF9vblRlbXBsYXRlQ3JlYXRlZCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIHB1YmxpYyByZWFkb25seSBvblRlbXBsYXRlQ3JlYXRlZCQgPSB0aGlzLl9vblRlbXBsYXRlQ3JlYXRlZCQucGlwZShcbiAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLl9FbWFpbCQsIHRoaXMuX1RlbXBsYXRlJCwgdGhpcy5fTWptbCQpLFxuICAgIG1hcCgoW18sIC4uLnJlc3RdKSA9PiByZXN0KVxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdXNlclJlc3RBcGk6IFBiVXNlclJlc3RBcGlTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGJTdG9yYWdlOiBQYlN0b3JhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlck1pZGRsZXdhcmU6IFBiVXNlck1pZGRsZXdhcmVzU2VydmljZSxcbiAgICBASW5qZWN0KFBCX0dPT0dMRV9GT05UUykgcHJpdmF0ZSBnb29nbGVGb250czogc3RyaW5nW10sXG4gICAgQEluamVjdChQQl9DT05GSUcpIHJlYWRvbmx5IGNvbmZpZzogSUZvclJvb3RDb25mXG4gICkge31cblxuICBjcmVhdGVIVE1MVGVtcGxhdGUkKCkge1xuICAgIHJldHVybiB0aGlzLmVtYWlsQXNPYnNlcnZhYmxlJC5waXBlKFxuICAgICAgc3dpdGNoTWFwKGVtYWlsID0+IHtcbiAgICAgICAgaWYgKCFlbWFpbC5zdHJ1Y3R1cmVzLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIGFkZCBzb21lIHN0cnVjdHVyZXMgYW5kIGJsb2NrcyB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZlck9mKGVtYWlsKTtcbiAgICAgIH0pLFxuICAgICAgd2l0aExhdGVzdEZyb20oY29tYmluZUxhdGVzdChbdGhpcy5jdXJyZW50RW1haWxIYXNDaGFuZ2VzJCwgdGhpcy50ZW1wbGF0ZUFzT2JzZXJ2YWJsZSRdKSksXG4gICAgICBleGhhdXN0TWFwKChbZW1haWwsIFtoYXNDaGFuZ2VzLCBjdXJyZW50SHRtbF1dKSA9PiB7XG4gICAgICAgIGlmIChoYXNDaGFuZ2VzIHx8ICFjdXJyZW50SHRtbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnVzZXJNaWRkbGV3YXJlLmNyZWF0ZUhUTUxUZW1wbGF0ZShlbWFpbCkucGlwZShcbiAgICAgICAgICAgIGV4aGF1c3RNYXAoZW0gPT4gdGhpcy51c2VyUmVzdEFwaS5jcmVhdGVIVE1MVGVtcGxhdGUkKHsgLi4uZW0sIGdvb2dsZUZvbnRzOiB0aGlzLmdvb2dsZUZvbnRzIH0sIHRoaXMuY29uZmlnLmFwaVBhdGgpKSxcbiAgICAgICAgICAgIG1hcChyZXMgPT4ge1xuICAgICAgICAgICAgICBpZiAocmVzLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHJlcy5lcnJvcnMubWFwKCh7IG1lc3NhZ2UsIHRhZ05hbWUgfSkgPT4gYCR7dGFnTmFtZX0gPiAke21lc3NhZ2V9YCkuam9pbignXFxuJyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9Nam1sJC5uZXh0KHJlcy5tam1sKTtcbiAgICAgICAgICAgICAgdGhpcy5fVGVtcGxhdGUkLm5leHQocmVzLmh0bWwpO1xuICAgICAgICAgICAgICB0aGlzLmNsb25lZEVtYWlsID0gY2xvbmVEZWVwKHRoaXMuRW1haWwpO1xuICAgICAgICAgICAgICB0aGlzLl9vblRlbXBsYXRlQ3JlYXRlZCQubmV4dCgpO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFt0aGlzLl9Nam1sJCwgdGhpcy5fVGVtcGxhdGUkXSkucGlwZShcbiAgICAgICAgICBtYXAoKFttam1sLCBodG1sXSkgPT4gKHsgaHRtbCwgbWptbCwgZXJyb3JzOiBbXSB9IGFzIElNam1sU2VydmVyUmVzcG9uc2UpKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuX0VtYWlsJC5uZXh0KHRoaXMuRW1haWwpO1xuXG4gICAgaWYgKHRoaXMuRW1haWwuc3RydWN0dXJlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucGJTdG9yYWdlLmFkZFRlbXBsYXRlVG9MYXRlc3RVc2VkKFxuICAgICAgICBjbG9uZURlZXA8SVVzZXJUZW1wbGF0ZT4oe1xuICAgICAgICAgIHRlbXBsYXRlRGF0YTogdGhpcy5FbWFpbCxcbiAgICAgICAgICB0aXRsZTogJ2xhc3QtZWRpdGVkJyxcbiAgICAgICAgICB0aHVtYlBhdGg6ICdodHRwczovL3ZpYS5wbGFjZWhvbGRlci5jb20vMjAweDMwMD90ZXh0PUxBU1QrRURJVEVEJ1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coZ2V0RGlmZih0aGlzLmNsb25lZEVtYWlsLCB0aGlzLkVtYWlsKSk7XG4gIH1cblxuICBzZXRFbWFpbChuZXdFbWFpbDogUEJFbWFpbCkge1xuICAgIGlmICghbmV3RW1haWwuc3RydWN0dXJlcyB8fCAhbmV3RW1haWwuZ2VuZXJhbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmplY3RlZCBvYmplY3QgaXMgbm90IGEgdmFsaWQgUEJFbWFpbCcpO1xuICAgIH1cbiAgICB0aGlzLkVtYWlsID0gbmV3RW1haWw7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgYWRkU3RydWN0dXJlKHsgY3VycmVudEluZGV4ID0gMCwgaXRlbSB9OiBJQWRkU3RydWN0dXJlRXZlbnQpOiBJU3RydWN0dXJlIHtcbiAgICBjb25zdCB7IHN0cnVjdHVyZXMgPSBbXSB9ID0gdGhpcy5FbWFpbDtcbiAgICBsZXQgaXNNb2R1bGUgPSB0cnVlO1xuXG4gICAgaWYgKCFpdGVtLmRhdGEuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICBpc01vZHVsZSA9IGZhbHNlO1xuICAgICAgaXRlbS5kYXRhLmVsZW1lbnRzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogaXRlbS5kYXRhLmNvbHVtbnMgfSwgKCkgPT4gW10pO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1N0cnVjdHVyZSA9IHsgaWQ6IERhdGUubm93KCksIC4uLmNsb25lRGVlcDxJU3RydWN0dXJlPihpdGVtLmRhdGEpLCBpc01vZHVsZSB9O1xuICAgIHN0cnVjdHVyZXMuc3BsaWNlKGN1cnJlbnRJbmRleCwgMCwgbmV3U3RydWN0dXJlKTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIHJldHVybiBuZXdTdHJ1Y3R1cmU7XG4gIH1cblxuICBjaGFuZ2VTdHJ1Y3R1cmVPcmRlcih7IHByZXZpb3VzSW5kZXggPSAwLCBjdXJyZW50SW5kZXggPSAwIH06IENka0RyYWdEcm9wPFNldDxJU3RydWN0dXJlPj4pIHtcbiAgICBtb3ZlSXRlbUluQXJyYXkodGhpcy5FbWFpbC5zdHJ1Y3R1cmVzLCBwcmV2aW91c0luZGV4LCBjdXJyZW50SW5kZXgpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBkdXBsaWNhdGVTdHJ1Y3R1cmUoaW5kZXg6IG51bWJlcik6IElTdHJ1Y3R1cmUge1xuICAgIGNvbnN0IHsgc3RydWN0dXJlcyA9IFtdIH0gPSB0aGlzLkVtYWlsO1xuICAgIGNvbnN0IG5ld1N0cnVjdHVyZSA9IGNsb25lRGVlcDxJU3RydWN0dXJlPih7IC4uLnN0cnVjdHVyZXNbaW5kZXhdLCBpZDogRGF0ZS5ub3coKSB9KTtcbiAgICBzdHJ1Y3R1cmVzLnNwbGljZShpbmRleCwgMCwgbmV3U3RydWN0dXJlKTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIHJldHVybiBuZXdTdHJ1Y3R1cmU7XG4gIH1cblxuICByZW1vdmVTdHJ1Y3R1cmUoaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHsgc3RydWN0dXJlcyA9IFtdIH0gPSB0aGlzLkVtYWlsO1xuICAgIHN0cnVjdHVyZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgYWRkQmxvY2soeyBwcmV2aW91c0luZGV4ID0gMCwgY3VycmVudEluZGV4ID0gMCwgaXRlbSwgcHJldmlvdXNDb250YWluZXI6IHsgaWQsIGRhdGEgfSB9OiBJQWRkQmxvY2tFdmVudCwgY29sdW1uOiBUQmxvY2tzW10pIHtcbiAgICAvLyBjb25zb2xlLmxvZyhpZCk7XG4gICAgLy8gY29uc29sZS5sb2coaXRlbSk7XG5cbiAgICBpZiAoaWQgPT09ICdibG9jay1lbGVtZW50cycpIHtcbiAgICAgIGNvbHVtbi5zcGxpY2UoY3VycmVudEluZGV4LCAwLCBjbG9uZURlZXAoaXRlbS5kYXRhKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyYW5zZmVyQXJyYXlJdGVtKGRhdGEsIGNvbHVtbiwgcHJldmlvdXNJbmRleCwgY3VycmVudEluZGV4KTtcbiAgICB9XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNoYW5nZUJsb2NrT3JkZXIoeyBwcmV2aW91c0luZGV4ID0gMCwgY3VycmVudEluZGV4ID0gMCB9OiBDZGtEcmFnRHJvcDxUQmxvY2tzW10+LCBjb2x1bW46IFRCbG9ja3NbXSkge1xuICAgIG1vdmVJdGVtSW5BcnJheShjb2x1bW4sIHByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGR1cGxpY2F0ZUJsb2NrKGtleTogbnVtYmVyLCBjb2x1bW46IFRCbG9ja3NbXSwgYmxvY2s6IFRCbG9ja3MpOiBUQmxvY2tzIHtcbiAgICBjb25zdCBuZXdCbG9jayA9IGNsb25lRGVlcDxUQmxvY2tzPihibG9jayk7XG4gICAgY29sdW1uLnNwbGljZShrZXksIDAsIG5ld0Jsb2NrKTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIHJldHVybiBuZXdCbG9jaztcbiAgfVxuXG4gIHJlbW92ZUJsb2NrKGtleTogbnVtYmVyLCBjb2x1bW46IFRCbG9ja3NbXSkge1xuICAgIGNvbHVtbi5zcGxpY2Uoa2V5LCAxKTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5fTWptbCQubmV4dChudWxsKTtcbiAgICB0aGlzLl9UZW1wbGF0ZSQubmV4dChudWxsKTtcbiAgICB0aGlzLmNsb25lZEVtYWlsID0gY2xvbmVEZWVwKHRoaXMuRW1haWwpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiJdfQ==
1
+ /*
2
+ * Copyright (c) 2024 Pobuca.
3
+ * All rights reserved.
4
+ */
5
+ import { Inject, Injectable } from '@angular/core';
6
+ import { moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';
7
+ import { BehaviorSubject, combineLatest, Subject } from 'rxjs';
8
+ import { exhaustMap, map, pluck, switchMap, withLatestFrom } from 'rxjs/operators';
9
+ // import { getDiff } from 'recursive-diff';
10
+ import { PbUserMiddlewaresService } from '../../user-middleware-service/pb-middlewares.service';
11
+ import { PBEmail } from '../../../classes/DefaultEmail';
12
+ import { cloneDeep, createPadding, createWidthHeight, deferOf, isEqual } from '../../../utils';
13
+ import { PbUserRestApiService } from '../../user-rest-api-service/user-rest-api.service';
14
+ import { PbStorageService } from '../../pb-storage/pb-storage.service';
15
+ import { PB_CONFIG, PB_GOOGLE_FONTS } from '../../../tokens/tokens';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "../../user-rest-api-service/user-rest-api.service";
18
+ import * as i2 from "../../pb-storage/pb-storage.service";
19
+ import * as i3 from "../../user-middleware-service/pb-middlewares.service";
20
+ import * as i4 from "../../../tokens/tokens";
21
+ // https://www.npmjs.com/package/recursive-diff
22
+ /**
23
+ * @internal
24
+ */
25
+ export class PbEmailObjectStoreService {
26
+ constructor(userRestApi, pbStorage, userMiddleware, googleFonts, config) {
27
+ this.userRestApi = userRestApi;
28
+ this.pbStorage = pbStorage;
29
+ this.userMiddleware = userMiddleware;
30
+ this.googleFonts = googleFonts;
31
+ this.config = config;
32
+ this.Email = new PBEmail();
33
+ this.clonedEmail = cloneDeep(this.Email);
34
+ this._Email$ = new BehaviorSubject(this.Email);
35
+ this.emailAsObservable$ = this._Email$.asObservable();
36
+ this.emailStructuresAsObservable$ = this.emailAsObservable$.pipe(pluck('structures'));
37
+ this.generalEmailOptionsAsObservable$ = this.emailAsObservable$.pipe(pluck('general'));
38
+ this.currentEmailHasChanges$ = this.emailAsObservable$.pipe(map(current => !isEqual(current, this.clonedEmail))
39
+ // shareReplay(),
40
+ // tap((isDirty) => console.log('IsDirty', isDirty)),
41
+ );
42
+ this.builderContainerStyles$ = this.generalEmailOptionsAsObservable$.pipe(map(({ background, padding, direction }) => (Object.assign({ direction, backgroundRepeat: background.repeat, backgroundColor: background.color, backgroundSize: createWidthHeight(background.size), backgroundPosition: 'top center' }, createPadding(padding)))));
43
+ // public readonly emailBodyWidth$ = this.generalEmailOptionsAsObservable$.pipe(map(({ width }) => createWidthHeight(width)));
44
+ this._Mjml$ = new BehaviorSubject('');
45
+ this.mjmlAsObservable$ = this._Mjml$.asObservable();
46
+ this._Template$ = new BehaviorSubject('');
47
+ this.templateAsObservable$ = this._Template$.asObservable();
48
+ this._onTemplateCreated$ = new Subject();
49
+ this.onTemplateCreated$ = this._onTemplateCreated$.pipe(withLatestFrom(this._Email$, this._Template$, this._Mjml$), map(([_, ...rest]) => rest));
50
+ }
51
+ createHTMLTemplate$() {
52
+ return this.emailAsObservable$.pipe(switchMap(email => {
53
+ if (!email.structures.length) {
54
+ throw new Error('Please add some structures and blocks to perform this action.');
55
+ }
56
+ return deferOf(email);
57
+ }), withLatestFrom(combineLatest([this.currentEmailHasChanges$, this.templateAsObservable$])), exhaustMap(([email, [hasChanges, currentHtml]]) => {
58
+ if (hasChanges || !currentHtml) {
59
+ return this.userMiddleware.createHTMLTemplate(email).pipe(exhaustMap(em => this.userRestApi.createHTMLTemplate$(Object.assign(Object.assign({}, em), { googleFonts: this.googleFonts }), this.config.apiPath)), map(res => {
60
+ if (res.errors.length) {
61
+ const error = res.errors.map(({ message, tagName }) => `${tagName} > ${message}`).join('\n');
62
+ throw new Error(error);
63
+ }
64
+ // Post-process HTML to include custom fonts
65
+ if (email.customFonts && email.customFonts.length) {
66
+ const customFontLinks = email.customFonts
67
+ .filter(font => font.url)
68
+ .map(font => `<link href="${font.url}" rel="stylesheet" type="text/css">`)
69
+ .join('\n');
70
+ if (customFontLinks && res.html.includes('</head>')) {
71
+ res.html = res.html.replace('</head>', `${customFontLinks}\n</head>`);
72
+ }
73
+ }
74
+ this._Mjml$.next(res.mjml);
75
+ this._Template$.next(res.html);
76
+ this.clonedEmail = cloneDeep(this.Email);
77
+ this._onTemplateCreated$.next();
78
+ return res;
79
+ }));
80
+ }
81
+ return combineLatest([this._Mjml$, this._Template$]).pipe(map(([mjml, html]) => ({ html, mjml, errors: [] })));
82
+ }));
83
+ }
84
+ markForCheck() {
85
+ this._Email$.next(this.Email);
86
+ if (this.Email.structures.length) {
87
+ this.pbStorage.addTemplateToLatestUsed(cloneDeep({
88
+ templateData: this.Email,
89
+ title: 'last-edited',
90
+ thumbPath: 'https://via.placeholder.com/200x300?text=LAST+EDITED'
91
+ }));
92
+ }
93
+ // console.log(getDiff(this.clonedEmail, this.Email));
94
+ }
95
+ setEmail(newEmail) {
96
+ if (!newEmail.structures || !newEmail.general) {
97
+ throw new Error('Injected object is not a valid PBEmail');
98
+ }
99
+ this.Email = newEmail;
100
+ this.reset();
101
+ }
102
+ addStructure({ currentIndex = 0, item }) {
103
+ const { structures = [] } = this.Email;
104
+ let isModule = true;
105
+ if (!item.data.elements.length) {
106
+ isModule = false;
107
+ item.data.elements = Array.from({ length: item.data.columns }, () => []);
108
+ }
109
+ const newStructure = Object.assign(Object.assign({ id: Date.now() }, cloneDeep(item.data)), { isModule });
110
+ structures.splice(currentIndex, 0, newStructure);
111
+ this.markForCheck();
112
+ return newStructure;
113
+ }
114
+ changeStructureOrder({ previousIndex = 0, currentIndex = 0 }) {
115
+ moveItemInArray(this.Email.structures, previousIndex, currentIndex);
116
+ this.markForCheck();
117
+ }
118
+ duplicateStructure(index) {
119
+ const { structures = [] } = this.Email;
120
+ const newStructure = cloneDeep(Object.assign(Object.assign({}, structures[index]), { id: Date.now() }));
121
+ structures.splice(index, 0, newStructure);
122
+ this.markForCheck();
123
+ return newStructure;
124
+ }
125
+ removeStructure(index) {
126
+ const { structures = [] } = this.Email;
127
+ structures.splice(index, 1);
128
+ this.markForCheck();
129
+ }
130
+ addBlock({ previousIndex = 0, currentIndex = 0, item, previousContainer: { id, data } }, column) {
131
+ // console.log(id);
132
+ // console.log(item);
133
+ if (id === 'block-elements') {
134
+ column.splice(currentIndex, 0, cloneDeep(item.data));
135
+ }
136
+ else {
137
+ transferArrayItem(data, column, previousIndex, currentIndex);
138
+ }
139
+ this.markForCheck();
140
+ }
141
+ changeBlockOrder({ previousIndex = 0, currentIndex = 0 }, column) {
142
+ moveItemInArray(column, previousIndex, currentIndex);
143
+ this.markForCheck();
144
+ }
145
+ duplicateBlock(key, column, block) {
146
+ const newBlock = cloneDeep(block);
147
+ column.splice(key, 0, newBlock);
148
+ this.markForCheck();
149
+ return newBlock;
150
+ }
151
+ removeBlock(key, column) {
152
+ column.splice(key, 1);
153
+ this.markForCheck();
154
+ }
155
+ reset() {
156
+ this._Mjml$.next(null);
157
+ this._Template$.next(null);
158
+ this.clonedEmail = cloneDeep(this.Email);
159
+ this.markForCheck();
160
+ }
161
+ }
162
+ PbEmailObjectStoreService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PbEmailObjectStoreService_Factory() { return new PbEmailObjectStoreService(i0.ɵɵinject(i1.PbUserRestApiService), i0.ɵɵinject(i2.PbStorageService), i0.ɵɵinject(i3.PbUserMiddlewaresService), i0.ɵɵinject(i4.PB_GOOGLE_FONTS), i0.ɵɵinject(i4.PB_CONFIG)); }, token: PbEmailObjectStoreService, providedIn: "root" });
163
+ PbEmailObjectStoreService.decorators = [
164
+ { type: Injectable, args: [{
165
+ providedIn: 'root'
166
+ },] }
167
+ ];
168
+ PbEmailObjectStoreService.ctorParameters = () => [
169
+ { type: PbUserRestApiService },
170
+ { type: PbStorageService },
171
+ { type: PbUserMiddlewaresService },
172
+ { type: Array, decorators: [{ type: Inject, args: [PB_GOOGLE_FONTS,] }] },
173
+ { type: undefined, decorators: [{ type: Inject, args: [PB_CONFIG,] }] }
174
+ ];
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGItZW1haWwtb2JqZWN0LXN0b3JlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wYi1lbWFpbC1idWlsZGVyL3NyYy9saWIvc2VydmljZXMvaW50ZXJuYWxzL3BiLWVtYWlsLW9iamVjdC1zdG9yZS9wYi1lbWFpbC1vYmplY3Qtc3RvcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekYsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkYsNENBQTRDO0FBQzVDLE9BQU8sRUFBc0Msd0JBQXdCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUdwSSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9GLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7OztBQUVwRSwrQ0FBK0M7QUFFL0M7O0dBRUc7QUFJSCxNQUFNLE9BQU8seUJBQXlCO0lBaUNwQyxZQUNVLFdBQWlDLEVB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Qix3QkFBd0I7d0NBc0RoRSxNQUFNLFNBQUMsZUFBZTs0Q0FDdEIsTUFBTSxTQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgUG9idWNhLlxyXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5LCB0cmFuc2ZlckFycmF5SXRlbSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZXhoYXVzdE1hcCwgbWFwLCBwbHVjaywgc3dpdGNoTWFwLCB3aXRoTGF0ZXN0RnJvbSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuLy8gaW1wb3J0IHsgZ2V0RGlmZiB9IGZyb20gJ3JlY3Vyc2l2ZS1kaWZmJztcclxuaW1wb3J0IHsgSUFkZEJsb2NrRXZlbnQsIElBZGRTdHJ1Y3R1cmVFdmVudCwgUGJVc2VyTWlkZGxld2FyZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXNlci1taWRkbGV3YXJlLXNlcnZpY2UvcGItbWlkZGxld2FyZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IElGb3JSb290Q29uZiwgSU1qbWxTZXJ2ZXJSZXNwb25zZSwgSVN0cnVjdHVyZSwgSVVzZXJUZW1wbGF0ZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IFRCbG9ja3MgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL0VsZW1lbnRzJztcclxuaW1wb3J0IHsgUEJFbWFpbCB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvRGVmYXVsdEVtYWlsJztcclxuaW1wb3J0IHsgY2xvbmVEZWVwLCBjcmVhdGVQYWRkaW5nLCBjcmVhdGVXaWR0aEhlaWdodCwgZGVmZXJPZiwgaXNFcXVhbCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcclxuaW1wb3J0IHsgUGJVc2VyUmVzdEFwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi91c2VyLXJlc3QtYXBpLXNlcnZpY2UvdXNlci1yZXN0LWFwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUGJTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3BiLXN0b3JhZ2UvcGItc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUEJfQ09ORklHLCBQQl9HT09HTEVfRk9OVFMgfSBmcm9tICcuLi8uLi8uLi90b2tlbnMvdG9rZW5zJztcclxuXHJcbi8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3JlY3Vyc2l2ZS1kaWZmXHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQYkVtYWlsT2JqZWN0U3RvcmVTZXJ2aWNlIHtcclxuICBwdWJsaWMgRW1haWwgPSBuZXcgUEJFbWFpbCgpO1xyXG4gIHByaXZhdGUgY2xvbmVkRW1haWwgPSBjbG9uZURlZXA8UEJFbWFpbD4odGhpcy5FbWFpbCk7XHJcbiAgcHJpdmF0ZSBfRW1haWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQQkVtYWlsPih0aGlzLkVtYWlsKTtcclxuICByZWFkb25seSBlbWFpbEFzT2JzZXJ2YWJsZSQgPSB0aGlzLl9FbWFpbCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcmVhZG9ubHkgZW1haWxTdHJ1Y3R1cmVzQXNPYnNlcnZhYmxlJCA9IHRoaXMuZW1haWxBc09ic2VydmFibGUkLnBpcGUocGx1Y2soJ3N0cnVjdHVyZXMnKSk7XHJcbiAgcmVhZG9ubHkgZ2VuZXJhbEVtYWlsT3B0aW9uc0FzT2JzZXJ2YWJsZSQgPSB0aGlzLmVtYWlsQXNPYnNlcnZhYmxlJC5waXBlKHBsdWNrKCdnZW5lcmFsJykpO1xyXG4gIHJlYWRvbmx5IGN1cnJlbnRFbWFpbEhhc0NoYW5nZXMkID0gdGhpcy5lbWFpbEFzT2JzZXJ2YWJsZSQucGlwZShcclxuICAgIG1hcChjdXJyZW50ID0+ICFpc0VxdWFsKGN1cnJlbnQsIHRoaXMuY2xvbmVkRW1haWwpKVxyXG4gICAgLy8gc2hhcmVSZXBsYXkoKSxcclxuICAgIC8vIHRhcCgoaXNEaXJ0eSkgPT4gY29uc29sZS5sb2coJ0lzRGlydHknLCBpc0RpcnR5KSksXHJcbiAgKTtcclxuICByZWFkb25seSBidWlsZGVyQ29udGFpbmVyU3R5bGVzJCA9IHRoaXMuZ2VuZXJhbEVtYWlsT3B0aW9uc0FzT2JzZXJ2YWJsZSQucGlwZShcclxuICAgIG1hcCgoeyBiYWNrZ3JvdW5kLCBwYWRkaW5nLCBkaXJlY3Rpb24gfSkgPT4gKHtcclxuICAgICAgZGlyZWN0aW9uLFxyXG4gICAgICBiYWNrZ3JvdW5kUmVwZWF0OiBiYWNrZ3JvdW5kLnJlcGVhdCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiBiYWNrZ3JvdW5kLmNvbG9yLFxyXG4gICAgICBiYWNrZ3JvdW5kU2l6ZTogY3JlYXRlV2lkdGhIZWlnaHQoYmFja2dyb3VuZC5zaXplKSxcclxuICAgICAgYmFja2dyb3VuZFBvc2l0aW9uOiAndG9wIGNlbnRlcicsXHJcbiAgICAgIC4uLmNyZWF0ZVBhZGRpbmcocGFkZGluZylcclxuICAgIH0pKVxyXG4gICk7XHJcbiAgLy8gcHVibGljIHJlYWRvbmx5IGVtYWlsQm9keVdpZHRoJCA9IHRoaXMuZ2VuZXJhbEVtYWlsT3B0aW9uc0FzT2JzZXJ2YWJsZSQucGlwZShtYXAoKHsgd2lkdGggfSkgPT4gY3JlYXRlV2lkdGhIZWlnaHQod2lkdGgpKSk7XHJcbiAgcHJpdmF0ZSBfTWptbCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xyXG4gIHB1YmxpYyByZWFkb25seSBtam1sQXNPYnNlcnZhYmxlJCA9IHRoaXMuX01qbWwkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHByaXZhdGUgX1RlbXBsYXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XHJcbiAgcHVibGljIHJlYWRvbmx5IHRlbXBsYXRlQXNPYnNlcnZhYmxlJCA9IHRoaXMuX1RlbXBsYXRlJC5hc09ic2VydmFibGUoKTtcclxuICBwcml2YXRlIF9vblRlbXBsYXRlQ3JlYXRlZCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgcHVibGljIHJlYWRvbmx5IG9uVGVtcGxhdGVDcmVhdGVkJCA9IHRoaXMuX29uVGVtcGxhdGVDcmVhdGVkJC5waXBlKFxyXG4gICAgd2l0aExhdGVzdEZyb20odGhpcy5fRW1haWwkLCB0aGlzLl9UZW1wbGF0ZSQsIHRoaXMuX01qbWwkKSxcclxuICAgIG1hcCgoW18sIC4uLnJlc3RdKSA9PiByZXN0KVxyXG4gICk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB1c2VyUmVzdEFwaTogUGJVc2VyUmVzdEFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBiU3RvcmFnZTogUGJTdG9yYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgdXNlck1pZGRsZXdhcmU6IFBiVXNlck1pZGRsZXdhcmVzU2VydmljZSxcclxuICAgIEBJbmplY3QoUEJfR09PR0xFX0ZPTlRTKSBwcml2YXRlIGdvb2dsZUZvbnRzOiBzdHJpbmdbXSxcclxuICAgIEBJbmplY3QoUEJfQ09ORklHKSByZWFkb25seSBjb25maWc6IElGb3JSb290Q29uZlxyXG4gICkgeyB9XHJcblxyXG4gIGNyZWF0ZUhUTUxUZW1wbGF0ZSQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lbWFpbEFzT2JzZXJ2YWJsZSQucGlwZShcclxuICAgICAgc3dpdGNoTWFwKGVtYWlsID0+IHtcclxuICAgICAgICBpZiAoIWVtYWlsLnN0cnVjdHVyZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBhZGQgc29tZSBzdHJ1Y3R1cmVzIGFuZCBibG9ja3MgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbi4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRlZmVyT2YoZW1haWwpO1xyXG4gICAgICB9KSxcclxuICAgICAgd2l0aExhdGVzdEZyb20oY29tYmluZUxhdGVzdChbdGhpcy5jdXJyZW50RW1haWxIYXNDaGFuZ2VzJCwgdGhpcy50ZW1wbGF0ZUFzT2JzZXJ2YWJsZSRdKSksXHJcbiAgICAgIGV4aGF1c3RNYXAoKFtlbWFpbCwgW2hhc0NoYW5nZXMsIGN1cnJlbnRIdG1sXV0pID0+IHtcclxuICAgICAgICBpZiAoaGFzQ2hhbmdlcyB8fCAhY3VycmVudEh0bWwpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnVzZXJNaWRkbGV3YXJlLmNyZWF0ZUhUTUxUZW1wbGF0ZShlbWFpbCkucGlwZShcclxuICAgICAgICAgICAgZXhoYXVzdE1hcChlbSA9PiB0aGlzLnVzZXJSZXN0QXBpLmNyZWF0ZUhUTUxUZW1wbGF0ZSQoeyAuLi5lbSwgZ29vZ2xlRm9udHM6IHRoaXMuZ29vZ2xlRm9udHMgfSwgdGhpcy5jb25maWcuYXBpUGF0aCkpLFxyXG4gICAgICAgICAgICBtYXAocmVzID0+IHtcclxuICAgICAgICAgICAgICBpZiAocmVzLmVycm9ycy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzLmVycm9ycy5tYXAoKHsgbWVzc2FnZSwgdGFnTmFtZSB9KSA9PiBgJHt0YWdOYW1lfSA+ICR7bWVzc2FnZX1gKS5qb2luKCdcXG4nKTtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyBQb3N0LXByb2Nlc3MgSFRNTCB0byBpbmNsdWRlIGN1c3RvbSBmb250c1xyXG4gICAgICAgICAgICAgIGlmIChlbWFpbC5jdXN0b21Gb250cyAmJiBlbWFpbC5jdXN0b21Gb250cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUZvbnRMaW5rcyA9IGVtYWlsLmN1c3RvbUZvbnRzXHJcbiAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZm9udCA9PiBmb250LnVybClcclxuICAgICAgICAgICAgICAgICAgLm1hcChmb250ID0+IGA8bGluayBocmVmPVwiJHtmb250LnVybH1cIiByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCI+YClcclxuICAgICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1c3RvbUZvbnRMaW5rcyAmJiByZXMuaHRtbC5pbmNsdWRlcygnPC9oZWFkPicpKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJlcy5odG1sID0gcmVzLmh0bWwucmVwbGFjZSgnPC9oZWFkPicsIGAke2N1c3RvbUZvbnRMaW5rc31cXG48L2hlYWQ+YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICB0aGlzLl9Nam1sJC5uZXh0KHJlcy5tam1sKTtcclxuICAgICAgICAgICAgICB0aGlzLl9UZW1wbGF0ZSQubmV4dChyZXMuaHRtbCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5jbG9uZWRFbWFpbCA9IGNsb25lRGVlcCh0aGlzLkVtYWlsKTtcclxuICAgICAgICAgICAgICB0aGlzLl9vblRlbXBsYXRlQ3JlYXRlZCQubmV4dCgpO1xyXG4gICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdGhpcy5fTWptbCQsIHRoaXMuX1RlbXBsYXRlJF0pLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKFttam1sLCBodG1sXSkgPT4gKHsgaHRtbCwgbWptbCwgZXJyb3JzOiBbXSB9IGFzIElNam1sU2VydmVyUmVzcG9uc2UpKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbWFya0ZvckNoZWNrKCkge1xyXG4gICAgdGhpcy5fRW1haWwkLm5leHQodGhpcy5FbWFpbCk7XHJcblxyXG4gICAgaWYgKHRoaXMuRW1haWwuc3RydWN0dXJlcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5wYlN0b3JhZ2UuYWRkVGVtcGxhdGVUb0xhdGVzdFVzZWQoXHJcbiAgICAgICAgY2xvbmVEZWVwPElVc2VyVGVtcGxhdGU+KHtcclxuICAgICAgICAgIHRlbXBsYXRlRGF0YTogdGhpcy5FbWFpbCxcclxuICAgICAgICAgIHRpdGxlOiAnbGFzdC1lZGl0ZWQnLFxyXG4gICAgICAgICAgdGh1bWJQYXRoOiAnaHR0cHM6Ly92aWEucGxhY2Vob2xkZXIuY29tLzIwMHgzMDA/dGV4dD1MQVNUK0VESVRFRCdcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgLy8gY29uc29sZS5sb2coZ2V0RGlmZih0aGlzLmNsb25lZEVtYWlsLCB0aGlzLkVtYWlsKSk7XHJcbiAgfVxyXG5cclxuICBzZXRFbWFpbChuZXdFbWFpbDogUEJFbWFpbCkge1xyXG4gICAgaWYgKCFuZXdFbWFpbC5zdHJ1Y3R1cmVzIHx8ICFuZXdFbWFpbC5nZW5lcmFsKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5qZWN0ZWQgb2JqZWN0IGlzIG5vdCBhIHZhbGlkIFBCRW1haWwnKTtcclxuICAgIH1cclxuICAgIHRoaXMuRW1haWwgPSBuZXdFbWFpbDtcclxuICAgIHRoaXMucmVzZXQoKTtcclxuICB9XHJcblxyXG4gIGFkZFN0cnVjdHVyZSh7IGN1cnJlbnRJbmRleCA9IDAsIGl0ZW0gfTogSUFkZFN0cnVjdHVyZUV2ZW50KTogSVN0cnVjdHVyZSB7XHJcbiAgICBjb25zdCB7IHN0cnVjdHVyZXMgPSBbXSB9ID0gdGhpcy5FbWFpbDtcclxuICAgIGxldCBpc01vZHVsZSA9IHRydWU7XHJcblxyXG4gICAgaWYgKCFpdGVtLmRhdGEuZWxlbWVudHMubGVuZ3RoKSB7XHJcbiAgICAgIGlzTW9kdWxlID0gZmFsc2U7XHJcbiAgICAgIGl0ZW0uZGF0YS5lbGVtZW50cyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGl0ZW0uZGF0YS5jb2x1bW5zIH0sICgpID0+IFtdKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZXdTdHJ1Y3R1cmUgPSB7IGlkOiBEYXRlLm5vdygpLCAuLi5jbG9uZURlZXA8SVN0cnVjdHVyZT4oaXRlbS5kYXRhKSwgaXNNb2R1bGUgfTtcclxuICAgIHN0cnVjdHVyZXMuc3BsaWNlKGN1cnJlbnRJbmRleCwgMCwgbmV3U3RydWN0dXJlKTtcclxuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XHJcbiAgICByZXR1cm4gbmV3U3RydWN0dXJlO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlU3RydWN0dXJlT3JkZXIoeyBwcmV2aW91c0luZGV4ID0gMCwgY3VycmVudEluZGV4ID0gMCB9OiBDZGtEcmFnRHJvcDxTZXQ8SVN0cnVjdHVyZT4+KSB7XHJcbiAgICBtb3ZlSXRlbUluQXJyYXkodGhpcy5FbWFpbC5zdHJ1Y3R1cmVzLCBwcmV2aW91c0luZGV4LCBjdXJyZW50SW5kZXgpO1xyXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIGR1cGxpY2F0ZVN0cnVjdHVyZShpbmRleDogbnVtYmVyKTogSVN0cnVjdHVyZSB7XHJcbiAgICBjb25zdCB7IHN0cnVjdHVyZXMgPSBbXSB9ID0gdGhpcy5FbWFpbDtcclxuICAgIGNvbnN0IG5ld1N0cnVjdHVyZSA9IGNsb25lRGVlcDxJU3RydWN0dXJlPih7IC4uLnN0cnVjdHVyZXNbaW5kZXhdLCBpZDogRGF0ZS5ub3coKSB9KTtcclxuICAgIHN0cnVjdHVyZXMuc3BsaWNlKGluZGV4LCAwLCBuZXdTdHJ1Y3R1cmUpO1xyXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcclxuICAgIHJldHVybiBuZXdTdHJ1Y3R1cmU7XHJcbiAgfVxyXG5cclxuICByZW1vdmVTdHJ1Y3R1cmUoaW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgeyBzdHJ1Y3R1cmVzID0gW10gfSA9IHRoaXMuRW1haWw7XHJcbiAgICBzdHJ1Y3R1cmVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgYWRkQmxvY2soeyBwcmV2aW91c0luZGV4ID0gMCwgY3VycmVudEluZGV4ID0gMCwgaXRlbSwgcHJldmlvdXNDb250YWluZXI6IHsgaWQsIGRhdGEgfSB9OiBJQWRkQmxvY2tFdmVudCwgY29sdW1uOiBUQmxvY2tzW10pIHtcclxuICAgIC8vIGNvbnNvbGUubG9nKGlkKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0pO1xyXG5cclxuICAgIGlmIChpZCA9PT0gJ2Jsb2NrLWVsZW1lbnRzJykge1xyXG4gICAgICBjb2x1bW4uc3BsaWNlKGN1cnJlbnRJbmRleCwgMCwgY2xvbmVEZWVwKGl0ZW0uZGF0YSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdHJhbnNmZXJBcnJheUl0ZW0oZGF0YSwgY29sdW1uLCBwcmV2aW91c0luZGV4LCBjdXJyZW50SW5kZXgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIGNoYW5nZUJsb2NrT3JkZXIoeyBwcmV2aW91c0luZGV4ID0gMCwgY3VycmVudEluZGV4ID0gMCB9OiBDZGtEcmFnRHJvcDxUQmxvY2tzW10+LCBjb2x1bW46IFRCbG9ja3NbXSkge1xyXG4gICAgbW92ZUl0ZW1JbkFycmF5KGNvbHVtbiwgcHJldmlvdXNJbmRleCwgY3VycmVudEluZGV4KTtcclxuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBkdXBsaWNhdGVCbG9jayhrZXk6IG51bWJlciwgY29sdW1uOiBUQmxvY2tzW10sIGJsb2NrOiBUQmxvY2tzKTogVEJsb2NrcyB7XHJcbiAgICBjb25zdCBuZXdCbG9jayA9IGNsb25lRGVlcDxUQmxvY2tzPihibG9jayk7XHJcbiAgICBjb2x1bW4uc3BsaWNlKGtleSwgMCwgbmV3QmxvY2spO1xyXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcclxuICAgIHJldHVybiBuZXdCbG9jaztcclxuICB9XHJcblxyXG4gIHJlbW92ZUJsb2NrKGtleTogbnVtYmVyLCBjb2x1bW46IFRCbG9ja3NbXSkge1xyXG4gICAgY29sdW1uLnNwbGljZShrZXksIDEpO1xyXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHJlc2V0KCkge1xyXG4gICAgdGhpcy5fTWptbCQubmV4dChudWxsKTtcclxuICAgIHRoaXMuX1RlbXBsYXRlJC5uZXh0KG51bGwpO1xyXG4gICAgdGhpcy5jbG9uZWRFbWFpbCA9IGNsb25lRGVlcCh0aGlzLkVtYWlsKTtcclxuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==