aril 2.0.1-dev.1 → 2.0.1-dev.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/boot/config/apps/src/custom-route-reuse-strategy.class.d.ts +17 -0
- package/esm2022/boot/config/apps/src/custom-route-reuse-strategy.class.mjs +109 -39
- package/esm2022/boot/mfe/src/bootstrap.mjs +45 -5
- package/fesm2022/aril-boot-config-apps.mjs +108 -38
- package/fesm2022/aril-boot-config-apps.mjs.map +1 -1
- package/fesm2022/{aril-boot-mfe-app.component-a34GeuUv.mjs → aril-boot-mfe-app.component-AS4MzEo2.mjs} +2 -2
- package/fesm2022/{aril-boot-mfe-app.component-a34GeuUv.mjs.map → aril-boot-mfe-app.component-AS4MzEo2.mjs.map} +1 -1
- package/fesm2022/{aril-boot-mfe-aril-boot-mfe-KFO_X7yR.mjs → aril-boot-mfe-aril-boot-mfe-Ui9Cv3UC.mjs} +46 -6
- package/fesm2022/aril-boot-mfe-aril-boot-mfe-Ui9Cv3UC.mjs.map +1 -0
- package/fesm2022/aril-boot-mfe.mjs +1 -1
- package/fesm2022/aril.mjs +44 -4
- package/fesm2022/aril.mjs.map +1 -1
- package/package.json +197 -197
- package/fesm2022/aril-boot-mfe-aril-boot-mfe-KFO_X7yR.mjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Location, LocationStrategy } from '@angular/common';
|
|
2
2
|
import { HttpClient } from '@angular/common/http';
|
|
3
|
-
import { APP_INITIALIZER, ApplicationRef, createComponent, createEnvironmentInjector, importProvidersFrom, isDevMode, ɵINJECTOR_SCOPE } from '@angular/core';
|
|
3
|
+
import { APP_INITIALIZER, ApplicationRef, EnvironmentInjector, createComponent, createEnvironmentInjector, importProvidersFrom, inject, isDevMode, ɵINJECTOR_SCOPE } from '@angular/core';
|
|
4
4
|
import { createApplication } from '@angular/platform-browser';
|
|
5
5
|
import { RouteReuseStrategy, Router, UrlSerializer, provideRouter, withComponentInputBinding, withRouterConfig } from '@angular/router';
|
|
6
6
|
import { ConfirmationService, MessageService, PrimeNGConfig } from 'primeng/api';
|
|
@@ -111,9 +111,41 @@ export const boot = (_appName, _routes, _menuItems) => {
|
|
|
111
111
|
// detection almaz. AppComponent'i biz açıkça `sharedAppRef.attachView` ile bağladığımız için
|
|
112
112
|
// çalışır; ama `inject(ApplicationRef)` yapan üçüncü taraf kod (PrimeNG `DialogService` →
|
|
113
113
|
// `this.appRef.attachView`) child-local sahte appRef'i alıp dialog'u ona bağlıyordu → dialog
|
|
114
|
-
// yaratılıyor ama `*ngIf="visible"` hiç render edilmiyordu (boş açılıyordu).
|
|
115
|
-
//
|
|
116
|
-
|
|
114
|
+
// yaratılıyor ama `*ngIf="visible"` hiç render edilmiyordu (boş açılıyordu).
|
|
115
|
+
//
|
|
116
|
+
// Çözüm — `sharedAppRef`'i saran Proxy: TÜM üyeler (attachView/detachView/tick/components…)
|
|
117
|
+
// gerçek `sharedAppRef`'e delege olur (method'lar `target`'a bind'li → private field dahil
|
|
118
|
+
// doğru `this`), TEK fark `.injector` → bu tab'ın child injector'ı. Neden kritik: PrimeNG
|
|
119
|
+
// `DialogService` dialog'u `createComponent(..., { environmentInjector: this.appRef.injector })`
|
|
120
|
+
// ile yaratır. Düz `sharedAppRef` dönersek dialog içeriği shared ROOT'ta çözülür, sayfa ise
|
|
121
|
+
// child injector'da → `providedIn:'root'` her servis İKİ ayrı instance olur (split-brain) ve
|
|
122
|
+
// BehaviorSubject tabanlı sayfa↔dialog state senkronize OLMAZ (seçili kayıt dialog'da null).
|
|
123
|
+
// `.injector`'ı child'a yönlendirince dialog içeriği sayfayla AYNI injector'da çözer → otomatik
|
|
124
|
+
// tek instance, TÜM (mevcut+gelecek) servisler için — servis listesi tutmaya gerek yok.
|
|
125
|
+
// `attachView` yine `sharedAppRef`'e gittiği için tek tick döngüsü/change detection korunur.
|
|
126
|
+
{
|
|
127
|
+
provide: ApplicationRef,
|
|
128
|
+
useFactory: () => {
|
|
129
|
+
const tabInjector = inject(EnvironmentInjector);
|
|
130
|
+
return new Proxy(sharedAppRef, {
|
|
131
|
+
get(target, prop) {
|
|
132
|
+
if (prop === 'injector')
|
|
133
|
+
return tabInjector;
|
|
134
|
+
// `ngOnDestroy`'u GİZLE (undefined döndür). Aksi halde `inject(ApplicationRef)`
|
|
135
|
+
// yapan tab child injector'ı (PrimeNG DialogService veya aşağıdaki dev guard)
|
|
136
|
+
// proxy'yi kendi `_ngOnDestroyHooks`'una kaydeder (R3Injector.hydrate →
|
|
137
|
+
// hasOnDestroy=true) ve tab kapanışında `childInjector.destroy()` →
|
|
138
|
+
// `sharedAppRef.ngOnDestroy()` → açık TÜM tab'ların view'larını destroy edip
|
|
139
|
+
// shared app'i öldürür. Shared app'in lifecycle'ı bootstrap'a aittir, tab'a değil
|
|
140
|
+
// (gerçek `sharedAppRef.ngOnDestroy` etkilenmez; yalnızca proxy üzerinden gizlenir).
|
|
141
|
+
if (prop === 'ngOnDestroy')
|
|
142
|
+
return undefined;
|
|
143
|
+
const value = Reflect.get(target, prop, target);
|
|
144
|
+
return typeof value === 'function' ? value.bind(target) : value;
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
},
|
|
117
149
|
// Tarama (log15) ile saptanan, child-local olunca bozulan ek `providedIn:'root'` servisleri:
|
|
118
150
|
// • PubSubService — MFE'nin `breadcrumbUpdated` event'i host `history.service`'e ulaşmalı;
|
|
119
151
|
// child-local olunca MFE↔host event köprüsü kopuyordu.
|
|
@@ -166,6 +198,14 @@ export const boot = (_appName, _routes, _menuItems) => {
|
|
|
166
198
|
console.error(`[boot:${_appName}] HİBRİT İZOLASYON BOZULDU: child Router shared root ile aynı instance! ` +
|
|
167
199
|
`ɵINJECTOR_SCOPE davranışı değişmiş olabilir (Angular upgrade?) — tab izolasyonu çalışmaz.`);
|
|
168
200
|
}
|
|
201
|
+
// [Dialog injector köprüsü guard — kalıcı] ApplicationRef proxy'sinin `.injector`'ı bu
|
|
202
|
+
// tab'ın child injector'ını göstermeli; aksi halde PrimeNG DialogService dialog içeriğini
|
|
203
|
+
// shared root'ta çözer → sayfa↔dialog `providedIn:'root'` split-brain geri döner. PrimeNG
|
|
204
|
+
// ya da Angular upgrade'i `appRef.injector` kullanımını değiştirirse burada yakalanır.
|
|
205
|
+
if (isDevMode() && this.childInjector.get(ApplicationRef).injector !== this.childInjector) {
|
|
206
|
+
console.error(`[boot:${_appName}] DIALOG INJECTOR KÖPRÜSÜ BOZULDU: ApplicationRef.injector tab child ` +
|
|
207
|
+
`injector'ı göstermiyor — dialog içeriği sayfadan farklı injector'da çözülür (split-brain).`);
|
|
208
|
+
}
|
|
169
209
|
// AppComponent'i child injector context'inde yarat → inject(Router)/LocationStrategy
|
|
170
210
|
// child-local; inject(MfeBridge)/HttpClient/Keycloak/TranslocoService vb. parent'tan
|
|
171
211
|
// paylaşımlı. `attachView` shared app'in change detection döngüsüne bağlar. (`bootstrap`
|
|
@@ -232,4 +272,4 @@ export const boot = (_appName, _routes, _menuItems) => {
|
|
|
232
272
|
throw e;
|
|
233
273
|
}
|
|
234
274
|
};
|
|
235
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC9ib290L21mZS9zcmMvYm9vdHN0cmFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNOLGVBQWUsRUFFZixjQUFjLEVBS2QsZUFBZSxFQUNmLHlCQUF5QixFQUN6QixtQkFBbUIsRUFDbkIsU0FBUyxFQUNULGVBQWUsRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBRU4sa0JBQWtCLEVBQ2xCLE1BQU0sRUFFTixhQUFhLEVBQ2IsYUFBYSxFQUNiLHlCQUF5QixFQUN6QixnQkFBZ0IsRUFDaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVqRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFcEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFRLHdCQUF3QixFQUFrQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlHLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENB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LE9BQU87UUFDUixDQUFDO1FBQ0QsTUFBTSxDQUFDLENBQUM7SUFDVCxDQUFDO0FBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9jYXRpb24sIExvY2F0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQge1xyXG5cdEFQUF9JTklUSUFMSVpFUixcclxuXHRBcHBsaWNhdGlvbkNvbmZpZyxcclxuXHRBcHBsaWNhdGlvblJlZixcclxuXHRDb21wb25lbnRSZWYsXHJcblx0RW52aXJvbm1lbnRJbmplY3RvcixcclxuXHRFbnZpcm9ubWVudFByb3ZpZGVycyxcclxuXHRQcm92aWRlcixcclxuXHRjcmVhdGVDb21wb25lbnQsXHJcblx0Y3JlYXRlRW52aXJvbm1lbnRJbmplY3RvcixcclxuXHRpbXBvcnRQcm92aWRlcnNGcm9tLFxyXG5cdGlzRGV2TW9kZSxcclxuXHTJtUlOSkVDVE9SX1NDT1BFXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGNyZWF0ZUFwcGxpY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7XHJcblx0Q2hpbGRyZW5PdXRsZXRDb250ZXh0cyxcclxuXHRSb3V0ZVJldXNlU3RyYXRlZ3ksXHJcblx0Um91dGVyLFxyXG5cdFJvdXRlcyxcclxuXHRVcmxTZXJpYWxpemVyLFxyXG5cdHByb3ZpZGVSb3V0ZXIsXHJcblx0d2l0aENvbXBvbmVudElucHV0QmluZGluZyxcclxuXHR3aXRoUm91dGVyQ29uZmlnXHJcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlLCBQcmltZU5HQ29uZmlnIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5cclxuaW1wb3J0IHsgVHJhbnNsb2NvU2VydmljZSB9IGZyb20gJ0BuZ25lYXQvdHJhbnNsb2NvJztcclxuXHJcbmltcG9ydCB7IEtleWNsb2FrU2VydmljZSB9IGZyb20gJ2tleWNsb2FrLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBNb25hY29FZGl0b3JNb2R1bGUsIE5HWF9NT05BQ09fRURJVE9SX0NPTkZJRyB9IGZyb20gJ25neC1tb25hY28tZWRpdG9yLXYyJztcclxuXHJcbmltcG9ydCB7IGNyZWF0ZUJhc2VBcHBDb25maWcgfSBmcm9tICdhcmlsL2Jvb3QvYmFzZSc7XHJcbmltcG9ydCB7IHNldEFwaUNvbmZpZ09uTUZFTW9kZSB9IGZyb20gJ2FyaWwvYm9vdC9jb25maWcvYXBpJztcclxuaW1wb3J0IHsgQXBwcywgQ3VzdG9tUm91dGVSZXVzZVN0cmF0ZWd5LCBQbHVnaW5NZW51SXRlbSwgVGFiQXdhcmVVcmxTZXJpYWxpemVyIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9hcHBzJztcclxuaW1wb3J0IHsgZ2V0Tmdab25lLCBsb2FkUGx1Z2lucyB9IGZyb20gJ2FyaWwvYm9vdC9jb25maWcvcGx1Z2lucyc7XHJcbmltcG9ydCB7IGkxOG5Gb2xkZXJOYW1lIH0gZnJvbSAnYXJpbC9pMThuJztcclxuaW1wb3J0IHsgcHJvdmlkZUhvc3QgfSBmcm9tICdhcmlsL3Byb3ZpZGVyJztcclxuaW1wb3J0IHsgUHViU3ViU2VydmljZSB9IGZyb20gJ2FyaWwvdXRpbC9wdWItc3ViJztcclxuXHJcbmltcG9ydCB7IGFwcENvbXBvbmVudExvYWRlciB9IGZyb20gJy4vYXBwQ29tcG9uZW50TG9hZGVyJztcclxuaW1wb3J0IHsgSXNvbGF0ZWRMb2NhdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9pc29sYXRlZC1sb2NhdGlvbi1zdHJhdGVneSc7XHJcbmltcG9ydCB7IG1vbmFjb0NvbmZpZyB9IGZyb20gJy4vbW9uYWNvLmNvbmZpZyc7XHJcblxyXG5leHBvcnQgdmFyIGFwcE5hbWU6IEFwcHM7XHJcbmV4cG9ydCB2YXIgbWVudUl0ZW1zOiBQbHVnaW5NZW51SXRlbVtdID0gW107XHJcblxyXG4vKipcclxuICogYGJvb3RgIMOnYcSfcsSxbGFyxLFuxLFuIGlkZW1wb3RlbnQga2FsbWFzxLFuxLEgc2HEn2xheWFuIHN5bmMgZ3VhcmQuIEF5bsSxIHJlbW90ZSBpw6dpblxyXG4gKiBiaXJkZW4gZmF6bGEgcGFyYWxlbCBgYm9vdCgnd2RtJywgLi4uKWAgw6dhxJ9yxLFzxLEgZ2VsZGnEn2luZGUsIGlsayBgY3VzdG9tRWxlbWVudHMuZGVmaW5lYFxyXG4gKiB0YW1hbWxhbm1hZGFuIGlraW5jaSDDp2HEn3LEsSBgY3VzdG9tRWxlbWVudHMuZ2V0YCBndWFyZCfEsW7EsSBnZcOnaXlvcmR1IOKGkiBoZXIgaWtpc2kgZGVcclxuICogZGVmaW5lIGV0bWV5ZSDDp2FsxLHFn8SxcCBgTm90U3VwcG9ydGVkRXJyb3I6IHRoZSBuYW1lIFwiYXBwLXdkbVwiIGhhcyBhbHJlYWR5IGJlZW4gdXNlZGBcclxuICogaGF0YXPEsSBmxLFybGF0xLFsxLF5b3JkdS4gU2V0IGlsZSBzeW5jIG1hcmsgZWRlcmVrIHRlayBiaXIgZGVmaW5lIGN5Y2xlJ8SxIGdhcmFudGkgZWRpeW9ydXouXHJcbiAqL1xyXG5jb25zdCBib290ZWRBcHBzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG5leHBvcnQgY29uc3QgYm9vdCA9IChfYXBwTmFtZTogQXBwcywgX3JvdXRlczogUm91dGVzLCBfbWVudUl0ZW1zOiBQbHVnaW5NZW51SXRlbVtdKSA9PiB7XHJcblx0aWYgKGJvb3RlZEFwcHMuaGFzKF9hcHBOYW1lKSB8fCBjdXN0b21FbGVtZW50cy5nZXQoYGFwcC0ke19hcHBOYW1lfWApKSByZXR1cm47XHJcblx0Ym9vdGVkQXBwcy5hZGQoX2FwcE5hbWUpO1xyXG5cclxuXHRhcHBOYW1lID0gX2FwcE5hbWU7XHJcblx0bWVudUl0ZW1zID0gX21lbnVJdGVtcztcclxuXHJcblx0LyoqXHJcblx0ICogKipQYXlsYcWfxLFsYW4gYmFzZSBjb25maWcqKiDigJQgcmVtb3RlIGJhxZ/EsW5hIFRFSyBgY3JlYXRlQXBwbGljYXRpb25gLiBBxJ/EsXIgc2VydmlzbGVyXHJcblx0ICogKEh0dHBDbGllbnQgKyBpbnRlcmNlcHRvciBjaGFpbiwgS2V5Y2xvYWssIGkxOG4vVHJhbnNsb2NvLCBNb25hY28sIGFuaW1hdGlvbnMpIGJ1cmFkYVxyXG5cdCAqIHlhxZ9hcjsgYHByb3ZpZGVkSW5gIHRhxZ/EsW1heWFuIGV4cGxpY2l0IHByb3ZpZGVyIG9sZHVrbGFyxLEgacOnaW4gdMO8bSB0YWInbGFyxLFuIGNoaWxkXHJcblx0ICogaW5qZWN0b3InbGFyxLFuZGFuIHBhcmVudCBvbGFyYWsgcGF5bGHFn8SxbMSxciDihpIgUkFNIGxpbmVlciBiw7x5w7xtZXouIFJvdXRlci9Mb2NhdGlvbi9cclxuXHQgKiBSZXVzZVN0cmF0ZWd5L1VybFNlcmlhbGl6ZXIgYnVyYWRhIFlPSzsgb25sYXIgdGFiIGJhxZ/EsW5hIGl6b2xlIGNoaWxkIGluamVjdG9yJ2RhIHZlcmlsaXIuXHJcblx0ICovXHJcblx0Y29uc3Qgc2hhcmVkQmFzZUNvbmZpZzogQXBwbGljYXRpb25Db25maWcgPSB7XHJcblx0XHRwcm92aWRlcnM6IFtcclxuXHRcdFx0Y3JlYXRlQmFzZUFwcENvbmZpZyh7IGkxOG5Gb2xkZXI6IF9hcHBOYW1lIH0pLFxyXG5cdFx0XHRwcm92aWRlSG9zdChfYXBwTmFtZSksXHJcblx0XHRcdGdldE5nWm9uZSgpLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0cHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxyXG5cdFx0XHRcdHVzZUZhY3Rvcnk6IChodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBrZXljbG9hazogS2V5Y2xvYWtTZXJ2aWNlLCBmb2xkZXJOYW1lOiB0eXBlb2YgaTE4bkZvbGRlck5hbWUpID0+IHtcclxuXHRcdFx0XHRcdGNvbnN0IHJ1bkFwaUluaXQgPSBzZXRBcGlDb25maWdPbk1GRU1vZGUoaHR0cENsaWVudCwga2V5Y2xvYWssIGZvbGRlck5hbWUgYXMgdW5rbm93biBhcyBBcHBzKTtcclxuXHRcdFx0XHRcdGNvbnN0IHJ1bkxvYWRQbHVnaW5zID0gbG9hZFBsdWdpbnMoKTtcclxuXHRcdFx0XHRcdHJldHVybiBhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHJ1bkFwaUluaXQoKTtcclxuXHRcdFx0XHRcdFx0cnVuTG9hZFBsdWdpbnMoKTtcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRtdWx0aTogdHJ1ZSxcclxuXHRcdFx0XHRkZXBzOiBbSHR0cENsaWVudCwgS2V5Y2xvYWtTZXJ2aWNlLCBpMThuRm9sZGVyTmFtZV1cclxuXHRcdFx0fSxcclxuXHRcdFx0aW1wb3J0UHJvdmlkZXJzRnJvbShNb25hY29FZGl0b3JNb2R1bGUuZm9yUm9vdCgpKSxcclxuXHRcdFx0eyBwcm92aWRlOiBOR1hfTU9OQUNPX0VESVRPUl9DT05GSUcsIHVzZVZhbHVlOiBtb25hY29Db25maWcgfVxyXG5cdFx0XVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW90ZSBiYcWfxLFuYSBURUsgcGF5bGHFn8SxbGFuIGBBcHBsaWNhdGlvblJlZmAg4oCUIGNsb3N1cmUtc2NvcGUuIMSwbGsgYDxhcHAtJHthcHBOYW1lfT5gXHJcblx0ICogZWxlbWVudCdpIGBjcmVhdGVBcHBsaWNhdGlvbihzaGFyZWRCYXNlQ29uZmlnKWAgw6dhxJ/EsXLEsXIsIHNvbnJha2kgdMO8bSBlbGVtZW50J2xlciBheW7EsVxyXG5cdCAqIHByb21pc2UnxLEgYmVrbGVyIChkdXBsaWNhdGUgQXBwbGljYXRpb24geWFyYXTEsW3EsSBpbWvDom5zxLF6KS4gSGVyIGVsZW1lbnQga2VuZGkgY2hpbGRcclxuXHQgKiBpbmplY3RvciArIGBjcmVhdGVDb21wb25lbnRgIGlsZSBrZW5kaSBgQXBwQ29tcG9uZW50YCB2aWV3J8SxbsSxIHlhcmF0xLFwIHNoYXJlZCBhcHAnZVxyXG5cdCAqIGBhdHRhY2hWaWV3YCBpbGUgYmHEn2xhci4gU2hhcmVkIGFwcCB1enVuIMO2bcO8cmzDvGTDvHIgKHRhYidsYXIga2FwYW5zYSBkYSBkZXN0cm95IGVkaWxtZXopLlxyXG5cdCAqXHJcblx0ICogYGNoaWxkUHJvdmlkZXJzYCd0YWtpIGBUcmFuc2xvY29TZXJ2aWNlYCBmYWN0b3J5J3NpIGJ1IHJlZmVyYW5zxLEga3VsbGFuZMSxxJ/EsSBpw6dpblxyXG5cdCAqIGBjaGlsZFByb3ZpZGVyc2AndGFuIMOWTkNFIHRhbsSxbWxhbsSxciAoZm9yd2FyZCBURFoneWkgw7ZubGVyKS5cclxuXHQgKi9cclxuXHRsZXQgc2hhcmVkQXBwUmVmOiBBcHBsaWNhdGlvblJlZiB8IG51bGwgPSBudWxsO1xyXG5cdGxldCBzaGFyZWRBcHBQcm9taXNlOiBQcm9taXNlPEFwcGxpY2F0aW9uUmVmPiB8IG51bGwgPSBudWxsO1xyXG5cclxuXHQvKipcclxuXHQgKiAqKlRhYiBiYcWfxLFuYSBpem9sZSBSb3V0ZXIgc3RhY2sqKiDigJQgaGVyIGA8YXBwLSR7YXBwTmFtZX0+YCBrZW5kaSBjaGlsZFxyXG5cdCAqIGBFbnZpcm9ubWVudEluamVjdG9yYCfEsW5kYSBidW5sYXLEsSBhbMSxci4gYMm1SU5KRUNUT1JfU0NPUEU6ICdyb290J2AgY2hpbGQnxLEgJ3Jvb3QnXHJcblx0ICogc2NvcGUgeWFwYXIgKEFuZ3VsYXIgYFIzSW5qZWN0b3JgIGN0b3I6IGBzY29wZXMuYWRkKCdyb290JylgKTsgYsO2eWxlY2UgYHByb3ZpZGVSb3V0ZXJgJ8SxblxyXG5cdCAqIGluamVjdCBldHRpxJ9pIGBwcm92aWRlZEluOidyb290J2AgUm91dGVyIHNlcnZpc2xlcmkg4oCUIGBSb3V0ZXJgLCBgQ2hpbGRyZW5PdXRsZXRDb250ZXh0c2AsXHJcblx0ICogYExvY2F0aW9uYCwgYE5hdmlnYXRpb25UcmFuc2l0aW9uc2AgdmIuIOKAlCBjaGlsZC1MT0NBTCDDvHJldGlsaXIuIFNvbnXDpzogaGVyIHRhYiBrZW5kaVxyXG5cdCAqIFJvdXRlciArIGtlbmRpIGBSb3V0ZXJPdXRsZXRgIGNvbnRleHQnaW5lIHNhaGlwIG9sdXIg4oaSICoqMSBSb3V0ZXIgOiAxIG91dGxldCoqLlxyXG5cdCAqXHJcblx0ICogTmVkZW4gZ2VyZWtsaTogcGF5bGHFn8SxbGFuIHRlayBBcHBsaWNhdGlvbidkYSBOIGA8cm91dGVyLW91dGxldD5gIGF5bsSxIHRla1xyXG5cdCAqIGBDaGlsZHJlbk91dGxldENvbnRleHRzYCdlIFwicHJpbWFyeVwiIGRpeWUga2F5ZG9sdXAgYmlyYmlyaW5pIGV6aXlvcmR1IChgY29udGV4dHMuc2V0YFxyXG5cdCAqIG92ZXJ3cml0ZSkg4oaSIHRhYiBnZcOnacWfaSBzb25yYXPEsSBheW7EsSB0YWIgacOnaSBuYXZpZ2FzeW9uIChsaXN04oaSZGV0YWlsKSB5YW5sxLHFnyBvdXRsZXQnZVxyXG5cdCAqIHJlbmRlciBvbHV5b3JkdS4gQ2hpbGQtaW5qZWN0b3IgaXpvbGFzeW9udSBidW51IGvDtmt0ZW4gw6fDtnplci5cclxuXHQgKlxyXG5cdCAqICoqVHJhbnNsb2NvU2VydmljZSBpc3Rpc25hc8SxKio6IGAncm9vdCdgIHNjb3BlIG9udSBkYSBjaGlsZC1sb2NhbCB5YXBhcmTEsTsgYW1hIGdsb2JhbFxyXG5cdCAqIChzY29wZSdzdXopIMOnZXZpcmlsZXIgc2hhcmVkIGFwcCdpbiBpbml0IGFrxLHFn8SxbmRhIHnDvGtsZW5kacSfaW5kZW4g4oCUIGBjcmVhdGVDb21wb25lbnRgXHJcblx0ICogYEFQUF9JTklUSUFMSVpFUmAgw6dhbMSxxZ90xLFybWF6IOKAlCBjaGlsZC1sb2NhbCBzZXJ2aWNlJ2luIGdsb2JhbCBjYWNoZSdpIGJvxZ8ga2FsxLFwIGhhbSBrZXlcclxuXHQgKiBnw7ZzdGVyaXlvcmR1LiBUYWIgYmHFn8SxbmEgYXlyxLEgZGlsIHNlbmFyeW9zdSB5b2s7IHNlcnZpY2UnaSBzaGFyZWQgYXBwJ3RlbiBwYXlsYcWfdMSxcsSxeW9ydXpcclxuXHQgKiAoZ2xvYmFsIMOnZXZpcmkgdGVrIHllcmRlIHnDvGtsZW5pciwgdGVrIHRyYW5zbGF0aW9uIGNhY2hlIOKGkiBlayBSQU0ga2F6YW5jxLEpLiBTY29wZSDDp2V2aXJpbGVyaVxyXG5cdCAqIChgcHJvdmlkZWkxOG5TY29wZWApIGNvbXBvbmVudC1sZXZlbCBzYcSfbGFuZMSxxJ/EsSBpw6dpbiBwYXlsYcWfxLFsYW4gc2VydmljZSdsZSBkZSDDp2FsxLHFn8Sxci5cclxuXHQgKlxyXG5cdCAqIE5PVDogYMm1SU5KRUNUT1JfU0NPUEVgIEFuZ3VsYXIgcHJpdmF0ZSBBUEknc2lkaXI7IG1pbm9yIHPDvHLDvG0gecO8a3NlbHRtZWxlcmluZGUgZGF2cmFuxLHFn8SxXHJcblx0ICogZG/En3J1bGFubWFsxLEgKGHFn2HEn8SxZGFraSBQT0MgaXpvbGFzeW9uIGxvZyd1IGJ1bnVuIGnDp2luIGLEsXJha8SxbGTEsSkuXHJcblx0ICovXHJcblx0Y29uc3QgY2hpbGRQcm92aWRlcnM6IEFycmF5PFByb3ZpZGVyIHwgRW52aXJvbm1lbnRQcm92aWRlcnM+ID0gW1xyXG5cdFx0eyBwcm92aWRlOiDJtUlOSkVDVE9SX1NDT1BFLCB1c2VWYWx1ZTogJ3Jvb3QnIH0sXHJcblx0XHRwcm92aWRlUm91dGVyKFxyXG5cdFx0XHRfcm91dGVzLFxyXG5cdFx0XHR3aXRoQ29tcG9uZW50SW5wdXRCaW5kaW5nKCksXHJcblx0XHRcdHdpdGhSb3V0ZXJDb25maWcoeyBvblNhbWVVcmxOYXZpZ2F0aW9uOiAncmVsb2FkJyB9KVxyXG5cdFx0KSxcclxuXHRcdHsgcHJvdmlkZTogTG9jYXRpb25TdHJhdGVneSwgdXNlQ2xhc3M6IElzb2xhdGVkTG9jYXRpb25TdHJhdGVneSB9LFxyXG5cdFx0eyBwcm92aWRlOiBMb2NhdGlvbiwgdXNlQ2xhc3M6IExvY2F0aW9uIH0sXHJcblx0XHR7IHByb3ZpZGU6IFJvdXRlUmV1c2VTdHJhdGVneSwgdXNlRXhpc3Rpbmc6IEN1c3RvbVJvdXRlUmV1c2VTdHJhdGVneSB9LFxyXG5cdFx0eyBwcm92aWRlOiBVcmxTZXJpYWxpemVyLCB1c2VFeGlzdGluZzogVGFiQXdhcmVVcmxTZXJpYWxpemVyIH0sXHJcblx0XHR7IHByb3ZpZGU6IFRyYW5zbG9jb1NlcnZpY2UsIHVzZUZhY3Rvcnk6ICgpID0+IHNoYXJlZEFwcFJlZiEuaW5qZWN0b3IuZ2V0KFRyYW5zbG9jb1NlcnZpY2UpIH0sXHJcblx0XHQvLyBgybVJTkpFQ1RPUl9TQ09QRToncm9vdCdgIHlhbiBldGtpc2k6IGBBcHBsaWNhdGlvblJlZmAgZGUgYHByb3ZpZGVkSW46J3Jvb3QnYCBvbGR1xJ91IGnDp2luXHJcblx0XHQvLyBjaGlsZCBpbmplY3RvcidkYSBjaGlsZC1MT0tBTCAoc2FodGUpIGJpciBpbnN0YW5jZSDDvHJldGlsaXJkaSDigJQgYnUgaW5zdGFuY2UgTmdab25lJ3VuXHJcblx0XHQvLyB0aWNrIGTDtm5nw7xzw7xuZSBiYcSfbMSxIERFxJ7EsExExLBSLiBTb251w6c6IGJ1IGFwcFJlZidlIGBhdHRhY2hWaWV3YCBlZGlsZW4gdmlldydsYXIgaGnDpyBjaGFuZ2VcclxuXHRcdC8vIGRldGVjdGlvbiBhbG1hei4gQXBwQ29tcG9uZW50J2kgYml6IGHDp8Sxa8OnYSBgc2hhcmVkQXBwUmVmLmF0dGFjaFZpZXdgIGlsZSBiYcSfbGFkxLHEn8SxbcSxeiBpw6dpblxyXG5cdFx0Ly8gw6dhbMSxxZ/EsXI7IGFtYSBgaW5qZWN0KEFwcGxpY2F0aW9uUmVmKWAgeWFwYW4gw7zDp8O8bmPDvCB0YXJhZiBrb2QgKFByaW1lTkcgYERpYWxvZ1NlcnZpY2VgIOKGklxyXG5cdFx0Ly8gYHRoaXMuYXBwUmVmLmF0dGFjaFZpZXdgKSBjaGlsZC1sb2NhbCBzYWh0ZSBhcHBSZWYnaSBhbMSxcCBkaWFsb2cndSBvbmEgYmHEn2zEsXlvcmR1IOKGkiBkaWFsb2dcclxuXHRcdC8vIHlhcmF0xLFsxLF5b3IgYW1hIGAqbmdJZj1cInZpc2libGVcImAgaGnDpyByZW5kZXIgZWRpbG1peW9yZHUgKGJvxZ8gYcOnxLFsxLF5b3JkdSkuIEdlcsOnZWsgKHRlayxcclxuXHRcdC8vIHRpY2sgYWxhbikgYHNoYXJlZEFwcFJlZmAnZSBzYWJpdGxpeW9ydXouXHJcblx0XHR7IHByb3ZpZGU6IEFwcGxpY2F0aW9uUmVmLCB1c2VGYWN0b3J5OiAoKSA9PiBzaGFyZWRBcHBSZWYhIH0sXHJcblx0XHQvLyBUYXJhbWEgKGxvZzE1KSBpbGUgc2FwdGFuYW4sIGNoaWxkLWxvY2FsIG9sdW5jYSBib3p1bGFuIGVrIGBwcm92aWRlZEluOidyb290J2Agc2VydmlzbGVyaTpcclxuXHRcdC8vIOKAoiBQdWJTdWJTZXJ2aWNlIOKAlCBNRkUnbmluIGBicmVhZGNydW1iVXBkYXRlZGAgZXZlbnQnaSBob3N0IGBoaXN0b3J5LnNlcnZpY2VgJ2UgdWxhxZ9tYWzEsTtcclxuXHRcdC8vICAgY2hpbGQtbG9jYWwgb2x1bmNhIE1GReKGlGhvc3QgZXZlbnQga8O2cHLDvHPDvCBrb3B1eW9yZHUuXHJcblx0XHQvLyDigKIgUHJpbWVOR0NvbmZpZyDigJQgZGluYW1payBkaWFsb2cnbGFyIHNoYXJlZCByb290IGNvbnRleHQnaW5kZSB5YXJhdMSxbGTEscSfxLEgacOnaW4gUHJpbWVOR1xyXG5cdFx0Ly8gICDDp2V2aXJpbGVyaSAoY2FsZW5kYXIvcGFnaW5hdG9yIHZiLikgdmUgYHNldFRyYW5zbGF0aW9uYCBzaGFyZWQgaW5zdGFuY2UndGFuIG9rdW5tYWzEsS5cclxuXHRcdC8vIChCcmVhZGNydW1iU2VydmljZSBiaWxpbsOnbGkgb2xhcmFrIGNoaWxkLWxvY2FsIGLEsXJha8SxbGTEsTogaGVyIHRhYiBrZW5kaSBicmVhZGNydW1iJ8SxLilcclxuXHRcdHsgcHJvdmlkZTogUHViU3ViU2VydmljZSwgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoUHViU3ViU2VydmljZSkgfSxcclxuXHRcdHsgcHJvdmlkZTogUHJpbWVOR0NvbmZpZywgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoUHJpbWVOR0NvbmZpZykgfSxcclxuXHRcdC8vIFRvYXN0L2NvbmZpcm0gR0xPQkFMOiB0ZWsgc2hhcmVkIE1lc3NhZ2VTZXJ2aWNlL0NvbmZpcm1hdGlvblNlcnZpY2UuIEFrc2kgaGFsZGUgaGVyIHRhYlxyXG5cdFx0Ly8ga2VuZGkgaW5zdGFuY2UnxLFuYSBzYWhpcCBvbHVyIOKGkiBob3N0J3RhbiB0ZXRpa2xlbmVuIHRvYXN0IE1GRSB0YWInxLFuZGEgKHlhIGRhIHRlcnNpKVxyXG5cdFx0Ly8gZ8O2csO8bm1lei4gU2hhcmVkIGluc3RhbmNlIGlsZSB0w7xtIGA8cC10b2FzdCBrZXk9XCJ0b2FzdC1yb290XCI+YCBjb250YWluZXInbGFyxLEgYXluxLEga3V5cnXEn3UgZGlubGVyLlxyXG5cdFx0eyBwcm92aWRlOiBNZXNzYWdlU2VydmljZSwgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoTWVzc2FnZVNlcnZpY2UpIH0sXHJcblx0XHR7IHByb3ZpZGU6IENvbmZpcm1hdGlvblNlcnZpY2UsIHVzZUZhY3Rvcnk6ICgpID0+IHNoYXJlZEFwcFJlZiEuaW5qZWN0b3IuZ2V0KENvbmZpcm1hdGlvblNlcnZpY2UpIH1cclxuXHRdO1xyXG5cclxuXHRjb25zdCBhcHBDb21wb25lbnRQcm9taXNlID0gYXBwQ29tcG9uZW50TG9hZGVyKCk7XHJcblxyXG5cdGNsYXNzIE1GRUFwcEVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XHJcblx0XHRwcml2YXRlIGNoaWxkSW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IgfCBudWxsID0gbnVsbDtcclxuXHRcdHByaXZhdGUgY29tcFJlZjogQ29tcG9uZW50UmVmPHVua25vd24+IHwgbnVsbCA9IG51bGw7XHJcblx0XHRwcml2YXRlIGlzQm9vdHN0cmFwcGluZyA9IGZhbHNlO1xyXG5cdFx0cHJpdmF0ZSBkZXN0cm95VGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdFx0YXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRcdC8vIFN0cmF0ZWd5IGhpZGRlbiBjb250YWluZXIg4oaUIHZpZXcgYXJhc8SxIHRhxZ/EsW1hbGFyZGEgcmUtYm9vdHN0cmFwJ8SxIMO2bmxlIOKAlFxyXG5cdFx0XHQvLyB2aWV3IHphdGVuIHlhcmF0xLFsZMSxeXNhIHNraXAuIGRlc3Ryb3lUaW1lciBwZW5kaW5nIGlzZSBpcHRhbCBldC5cclxuXHRcdFx0aWYgKHRoaXMuY29tcFJlZiB8fCB0aGlzLmlzQm9vdHN0cmFwcGluZykge1xyXG5cdFx0XHRcdGlmICh0aGlzLmRlc3Ryb3lUaW1lcikge1xyXG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMuZGVzdHJveVRpbWVyKTtcclxuXHRcdFx0XHRcdHRoaXMuZGVzdHJveVRpbWVyID0gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuaXNCb290c3RyYXBwaW5nID0gdHJ1ZTtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHQvLyBQYXlsYcWfxLFsYW4gQXBwbGljYXRpb24g4oCUIGlsayDDp2HEn8SxcmFuIHlhcmF0xLFyLCBkacSfZXJsZXJpIGF5bsSxIHByb21pc2UnxLEgYmVrbGVyLlxyXG5cdFx0XHRcdGlmICghc2hhcmVkQXBwUHJvbWlzZSkge1xyXG5cdFx0XHRcdFx0c2hhcmVkQXBwUHJvbWlzZSA9IGNyZWF0ZUFwcGxpY2F0aW9uKHNoYXJlZEJhc2VDb25maWcpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb25zdCBbYXBwUmVmLCBBcHBDb21wb25lbnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3NoYXJlZEFwcFByb21pc2UsIGFwcENvbXBvbmVudFByb21pc2VdKTtcclxuXHRcdFx0XHRzaGFyZWRBcHBSZWYgPSBhcHBSZWY7XHJcblxyXG5cdFx0XHRcdC8vIEJ1IHRhYiBpw6dpbiBpem9sZSBSb3V0ZXIgc3RhY2snaSBiYXLEsW5kxLFyYW4gY2hpbGQgaW5qZWN0b3IuXHJcblx0XHRcdFx0Y29uc3QgdGFiSWQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnYXJpbC10YWItaWQnKSA/PyAnJztcclxuXHRcdFx0XHR0aGlzLmNoaWxkSW5qZWN0b3IgPSBjcmVhdGVFbnZpcm9ubWVudEluamVjdG9yKFxyXG5cdFx0XHRcdFx0Y2hpbGRQcm92aWRlcnMsXHJcblx0XHRcdFx0XHRhcHBSZWYuaW5qZWN0b3IsXHJcblx0XHRcdFx0XHRgbWZlOiR7X2FwcE5hbWV9OiR7dGFiSWQgfHwgJ3BlbmRpbmcnfWBcclxuXHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHQvLyBbSGlicml0IGl6b2xhc3lvbiBndWFyZCDigJQga2FsxLFjxLFdIGDJtUlOSkVDVE9SX1NDT1BFOidyb290J2AgaWxlIGNoaWxkIGluamVjdG9yJ8SxblxyXG5cdFx0XHRcdC8vIEtFTkTEsCBSb3V0ZXIgKyBDaGlsZHJlbk91dGxldENvbnRleHRzJ2kgb2xtYXPEsSwgdGFiIGl6b2xhc3lvbnVudW4gdGVtZWxpZGlyXHJcblx0XHRcdFx0Ly8gKFwiMSBSb3V0ZXIgOiAxIG91dGxldFwiKS4gQnUgcHJpdmF0ZSBBUEkgQW5ndWxhciB1cGdyYWRlJ2luZGUgZGF2cmFuxLHFnyBkZcSfacWfdGlyaXJzZVxyXG5cdFx0XHRcdC8vIGJ1cmFkYSBlcmtlbiB5YWthbGFuxLFyOyBha3NpIGhhbGRlIFwiMSBSb3V0ZXIgOiBOIG91dGxldFwiIGJ1ZyfEsSBzZXNzaXpjZSBnZXJpIGTDtm5lci5cclxuXHRcdFx0XHRpZiAoaXNEZXZNb2RlKCkgJiYgdGhpcy5jaGlsZEluamVjdG9yLmdldChSb3V0ZXIpID09PSBhcHBSZWYuaW5qZWN0b3IuZ2V0KFJvdXRlcikpIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXHJcblx0XHRcdFx0XHRcdGBbYm9vdDoke19hcHBOYW1lfV0gSMSwQlLEsFQgxLBaT0xBU1lPTiBCT1pVTERVOiBjaGlsZCBSb3V0ZXIgc2hhcmVkIHJvb3QgaWxlIGF5bsSxIGluc3RhbmNlISBgICtcclxuXHRcdFx0XHRcdFx0XHRgybVJTkpFQ1RPUl9TQ09QRSBkYXZyYW7EscWfxLEgZGXEn2nFn21pxZ8gb2xhYmlsaXIgKEFuZ3VsYXIgdXBncmFkZT8pIOKAlCB0YWIgaXpvbGFzeW9udSDDp2FsxLHFn21hei5gXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gQXBwQ29tcG9uZW50J2kgY2hpbGQgaW5qZWN0b3IgY29udGV4dCdpbmRlIHlhcmF0IOKGkiBpbmplY3QoUm91dGVyKS9Mb2NhdGlvblN0cmF0ZWd5XHJcblx0XHRcdFx0Ly8gY2hpbGQtbG9jYWw7IGluamVjdChNZmVCcmlkZ2UpL0h0dHBDbGllbnQvS2V5Y2xvYWsvVHJhbnNsb2NvU2VydmljZSB2Yi4gcGFyZW50J3RhblxyXG5cdFx0XHRcdC8vIHBheWxhxZ/EsW1sxLEuIGBhdHRhY2hWaWV3YCBzaGFyZWQgYXBwJ2luIGNoYW5nZSBkZXRlY3Rpb24gZMO2bmfDvHPDvG5lIGJhxJ9sYXIuIChgYm9vdHN0cmFwYFxyXG5cdFx0XHRcdC8vIGRlxJ9pbDogQVBQX0JPT1RTVFJBUF9MSVNURU5FUiDDp2FsxLHFn21heiwgY2hpbGQgUm91dGVyJ8SxbiBpbml0aWFsIG5hdmlnYXRpb24nxLFuxLFcclxuXHRcdFx0XHQvLyBBcHBDb21wb25lbnQgaG9zdC1Sb3V0ZXIgc3luYydpIGBzYWZlTmF2aWdhdGVgIGlsZSB5YXDEsXlvci4pXHJcblx0XHRcdFx0dGhpcy5jb21wUmVmID0gY3JlYXRlQ29tcG9uZW50KEFwcENvbXBvbmVudCBhcyBuZXZlciwge1xyXG5cdFx0XHRcdFx0ZW52aXJvbm1lbnRJbmplY3RvcjogdGhpcy5jaGlsZEluamVjdG9yLFxyXG5cdFx0XHRcdFx0aG9zdEVsZW1lbnQ6IHRoaXNcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRhcHBSZWYuYXR0YWNoVmlldyh0aGlzLmNvbXBSZWYuaG9zdFZpZXcpO1xyXG5cdFx0XHRcdC8vIEJhxZ9hcsSxbMSxIGJvb3Q6IGd1YXJkIGFydMSxayBgY29tcFJlZmAgw7x6ZXJpbmRlbiDDp2FsxLHFn8SxciDihpIgYGlzQm9vdHN0cmFwcGluZ2AnaSBixLFyYWsuXHJcblx0XHRcdFx0Ly8gKGF3YWl0IHPEsXJhc8SxbmRhIGRpc2Nvbm5lY3Qgb2x1cCBoYXRhIG9sdcWfbWF6c2EgZmxhZyB0YWvEsWzEsSBrYWxtYXPEsW47IGFrc2kgaGFsZGVcclxuXHRcdFx0XHQvLyByZWNvbm5lY3QndGUgZ3VhcmQgZXJrZW4gcmV0dXJuIGVkaXAgdGFiJ8SxIGthbMSxY8SxIGJvxZ8gYsSxcmFrxLFyLilcclxuXHRcdFx0XHR0aGlzLmlzQm9vdHN0cmFwcGluZyA9IGZhbHNlO1xyXG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBbYm9vdDoke19hcHBOYW1lfV0gYXBwbGljYXRpb24gYm9vdHN0cmFwIGhhdGFzxLE6YCwgZXJyKTtcclxuXHRcdFx0XHR0aGlzLmlzQm9vdHN0cmFwcGluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdC8vIHNoYXJlZEFwcCBoZW7DvHogc2V0IGVkaWxtZWRpeXNlIChjcmVhdGVBcHBsaWNhdGlvbiBiYcWfYXLEsXPEsXopIHByb21pc2UnxLEgc8SxZsSxcmxhIGtpXHJcblx0XHRcdFx0Ly8gc29ucmFraSB0YWIgcmV0cnkgZWRlYmlsc2luIOKAlCBha3NpIGhhbGRlIHJlamVjdGVkIHByb21pc2UgY2xvc3VyZSdkYSBrYWzEsWPEsSBrYWzEsXIgdmVcclxuXHRcdFx0XHQvLyByZW1vdGUgc2F5ZmEgeWVuaWxlbWVkZW4gYmlyIGRhaGEgYm9vdCBlZGlsZW1lei4gKGNyZWF0ZUNvbXBvbmVudCBoYXRhc8SxbmRhXHJcblx0XHRcdFx0Ly8gc2hhcmVkQXBwUmVmIHphdGVuIHNldCd0aXI7IG8gZHVydW1kYSBwcm9taXNlIGtvcnVudXIsIGFwcCB5ZW5pZGVuIHlhcmF0xLFsbWF6LilcclxuXHRcdFx0XHRpZiAoIXNoYXJlZEFwcFJlZikgc2hhcmVkQXBwUHJvbWlzZSA9IG51bGw7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcclxuXHRcdFx0Ly8gU3RyYXRlZ3kgaGlkZGVuIGNvbnRhaW5lciDihpQgdmlldyBhcmFzxLEgdGHFn8SxbWFsYXJkYSBgcmVtb3ZlQ2hpbGRgICsgYGFwcGVuZENoaWxkYFxyXG5cdFx0XHQvLyBhcmTEscWfxLFrIG9sZHXEn3UgacOnaW4gZGlzY29ubmVjdGVkQ2FsbGJhY2sgcGFyZW50IGRlxJ9pxZ9pbWl5bGUgdGV0aWtsZW5pciDigJQgZWxlbWVudFxyXG5cdFx0XHQvLyBnZXLDp2VrdGVuIGRlc3Ryb3kgZWRpbG1peW9yLiBgcHJlc2VydmVXZWJDb21wb25lbnRFbGVtZW50YCDDtm5jZXNpbmRlIFN0cmF0ZWd5XHJcblx0XHRcdC8vIGBfX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaGAgZmxhZydpIHNldCBlZGl5b3I7IG8gZmxhZyB2YXJzYSB2aWV3IGtvcnVudXIuXHJcblx0XHRcdGNvbnN0IHByZXNlcnZlRmxhZyA9ICh0aGlzIGFzIEhUTUxFbGVtZW50ICYgeyBfX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaD86IGJvb2xlYW4gfSkuX19hcmlsUHJlc2VydmVEdXJpbmdEZXRhY2g7XHJcblx0XHRcdGlmIChwcmVzZXJ2ZUZsYWcpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gRmxhZyB5b2sg4oaSIGdlcsOnZWsgZGVzdHJveS4gQXN5bmMgcmUtY29ubmVjdCBpaHRpbWFsaW5lIGthcsWfxLEgbWljcm90YXNrIHPEsW7EsXJsxLFcclxuXHRcdFx0Ly8gZGVmYW5zaWYgZ2VjaWttZTsgYmlyIHNvbnJha2kgdGljayd0ZSBow6Jsw6IgZGlzY29ubmVjdGVkIG3EsSBkaXllIHNvbiBrb250cm9sLlxyXG5cdFx0XHRpZiAodGhpcy5kZXN0cm95VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmRlc3Ryb3lUaW1lcik7XHJcblx0XHRcdHRoaXMuZGVzdHJveVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0aWYgKCF0aGlzLmlzQ29ubmVjdGVkICYmIHRoaXMuY29tcFJlZikge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coYFtib290OiR7X2FwcE5hbWV9XSBnZXLDp2VrIGRlc3Ryb3kg4oaSIHZpZXcgKyBjaGlsZCBpbmplY3RvciBkZXN0cm95YCk7XHJcblx0XHRcdFx0XHQvLyBTaGFyZWQgYXBwJ2UgQVNMQSBkb2t1bm1hOyBzYWRlY2UgYnUgdGFiJ8SxbiB2aWV3J8SxbsSxIHZlIGNoaWxkIGluamVjdG9yJ8SxbsSxIHnEsWsuXHJcblx0XHRcdFx0XHRpZiAoc2hhcmVkQXBwUmVmKSBzaGFyZWRBcHBSZWYuZGV0YWNoVmlldyh0aGlzLmNvbXBSZWYuaG9zdFZpZXcpO1xyXG5cdFx0XHRcdFx0dGhpcy5jb21wUmVmLmRlc3Ryb3koKTtcclxuXHRcdFx0XHRcdHRoaXMuY2hpbGRJbmplY3Rvcj8uZGVzdHJveSgpO1xyXG5cdFx0XHRcdFx0dGhpcy5jb21wUmVmID0gbnVsbDtcclxuXHRcdFx0XHRcdHRoaXMuY2hpbGRJbmplY3RvciA9IG51bGw7XHJcblx0XHRcdFx0XHR0aGlzLmlzQm9vdHN0cmFwcGluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLmRlc3Ryb3lUaW1lciA9IG51bGw7XHJcblx0XHRcdH0sIDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dHJ5IHtcclxuXHRcdGN1c3RvbUVsZW1lbnRzLmRlZmluZShgYXBwLSR7YXBwTmFtZX1gLCBNRkVBcHBFbGVtZW50KTtcclxuXHR9IGNhdGNoIChlKSB7XHJcblx0XHRpZiAoZSBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiBlLm5hbWUgPT09ICdOb3RTdXBwb3J0ZWRFcnJvcicpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKGBbYm9vdDoke2FwcE5hbWV9XSBjdXN0b20gZWxlbWVudCB6YXRlbiB0YW7EsW1sxLEsIGRlZmluZSBhdGxhbmTEsWApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHR0aHJvdyBlO1xyXG5cdH1cclxufTtcclxuIl19
|
|
275
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC9ib290L21mZS9zcmMvYm9vdHN0cmFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNOLGVBQWUsRUFFZixjQUFjLEVBRWQsbUJBQW1CLEVBR25CLGVBQWUsRUFDZix5QkFBeUIsRUFDekIsbUJBQW1CLEVBQ25CLE1BQU0sRUFDTixTQUFTLEVBQ1QsZUFBZSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzlELE9BQU8sRUFFTixrQkFBa0IsRUFDbEIsTUFBTSxFQUVOLGFBQWEsRUFDYixhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLGdCQUFnQixFQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXJELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQVEsd0JBQXdCLEVBQWtCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxX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Q0FBQztZQUMvRSxPQUFPO1FBQ1IsQ0FBQztRQUNELE1BQU0sQ0FBQyxDQUFDO0lBQ1QsQ0FBQztBQUNGLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uLCBMb2NhdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtcclxuXHRBUFBfSU5JVElBTElaRVIsXHJcblx0QXBwbGljYXRpb25Db25maWcsXHJcblx0QXBwbGljYXRpb25SZWYsXHJcblx0Q29tcG9uZW50UmVmLFxyXG5cdEVudmlyb25tZW50SW5qZWN0b3IsXHJcblx0RW52aXJvbm1lbnRQcm92aWRlcnMsXHJcblx0UHJvdmlkZXIsXHJcblx0Y3JlYXRlQ29tcG9uZW50LFxyXG5cdGNyZWF0ZUVudmlyb25tZW50SW5qZWN0b3IsXHJcblx0aW1wb3J0UHJvdmlkZXJzRnJvbSxcclxuXHRpbmplY3QsXHJcblx0aXNEZXZNb2RlLFxyXG5cdMm1SU5KRUNUT1JfU0NPUEVcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY3JlYXRlQXBwbGljYXRpb24gfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHtcclxuXHRDaGlsZHJlbk91dGxldENvbnRleHRzLFxyXG5cdFJvdXRlUmV1c2VTdHJhdGVneSxcclxuXHRSb3V0ZXIsXHJcblx0Um91dGVzLFxyXG5cdFVybFNlcmlhbGl6ZXIsXHJcblx0cHJvdmlkZVJvdXRlcixcclxuXHR3aXRoQ29tcG9uZW50SW5wdXRCaW5kaW5nLFxyXG5cdHdpdGhSb3V0ZXJDb25maWdcclxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSwgTWVzc2FnZVNlcnZpY2UsIFByaW1lTkdDb25maWcgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcblxyXG5pbXBvcnQgeyBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSAnQG5nbmVhdC90cmFuc2xvY28nO1xyXG5cclxuaW1wb3J0IHsgS2V5Y2xvYWtTZXJ2aWNlIH0gZnJvbSAna2V5Y2xvYWstYW5ndWxhcic7XHJcbmltcG9ydCB7IE1vbmFjb0VkaXRvck1vZHVsZSwgTkdYX01PTkFDT19FRElUT1JfQ09ORklHIH0gZnJvbSAnbmd4LW1vbmFjby1lZGl0b3ItdjInO1xyXG5cclxuaW1wb3J0IHsgY3JlYXRlQmFzZUFwcENvbmZpZyB9IGZyb20gJ2FyaWwvYm9vdC9iYXNlJztcclxuaW1wb3J0IHsgc2V0QXBpQ29uZmlnT25NRkVNb2RlIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9hcGknO1xyXG5pbXBvcnQgeyBBcHBzLCBDdXN0b21Sb3V0ZVJldXNlU3RyYXRlZ3ksIFBsdWdpbk1lbnVJdGVtLCBUYWJBd2FyZVVybFNlcmlhbGl6ZXIgfSBmcm9tICdhcmlsL2Jvb3QvY29uZmlnL2FwcHMnO1xyXG5pbXBvcnQgeyBnZXROZ1pvbmUsIGxvYWRQbHVnaW5zIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9wbHVnaW5zJztcclxuaW1wb3J0IHsgaTE4bkZvbGRlck5hbWUgfSBmcm9tICdhcmlsL2kxOG4nO1xyXG5pbXBvcnQgeyBwcm92aWRlSG9zdCB9IGZyb20gJ2FyaWwvcHJvdmlkZXInO1xyXG5pbXBvcnQgeyBQdWJTdWJTZXJ2aWNlIH0gZnJvbSAnYXJpbC91dGlsL3B1Yi1zdWInO1xyXG5cclxuaW1wb3J0IHsgYXBwQ29tcG9uZW50TG9hZGVyIH0gZnJvbSAnLi9hcHBDb21wb25lbnRMb2FkZXInO1xyXG5pbXBvcnQgeyBJc29sYXRlZExvY2F0aW9uU3RyYXRlZ3kgfSBmcm9tICcuL2lzb2xhdGVkLWxvY2F0aW9uLXN0cmF0ZWd5JztcclxuaW1wb3J0IHsgbW9uYWNvQ29uZmlnIH0gZnJvbSAnLi9tb25hY28uY29uZmlnJztcclxuXHJcbmV4cG9ydCB2YXIgYXBwTmFtZTogQXBwcztcclxuZXhwb3J0IHZhciBtZW51SXRlbXM6IFBsdWdpbk1lbnVJdGVtW10gPSBbXTtcclxuXHJcbi8qKlxyXG4gKiBgYm9vdGAgw6dhxJ9yxLFsYXLEsW7EsW4gaWRlbXBvdGVudCBrYWxtYXPEsW7EsSBzYcSfbGF5YW4gc3luYyBndWFyZC4gQXluxLEgcmVtb3RlIGnDp2luXHJcbiAqIGJpcmRlbiBmYXpsYSBwYXJhbGVsIGBib290KCd3ZG0nLCAuLi4pYCDDp2HEn3LEsXPEsSBnZWxkacSfaW5kZSwgaWxrIGBjdXN0b21FbGVtZW50cy5kZWZpbmVgXHJcbiAqIHRhbWFtbGFubWFkYW4gaWtpbmNpIMOnYcSfcsSxIGBjdXN0b21FbGVtZW50cy5nZXRgIGd1YXJkJ8SxbsSxIGdlw6dpeW9yZHUg4oaSIGhlciBpa2lzaSBkZVxyXG4gKiBkZWZpbmUgZXRtZXllIMOnYWzEscWfxLFwIGBOb3RTdXBwb3J0ZWRFcnJvcjogdGhlIG5hbWUgXCJhcHAtd2RtXCIgaGFzIGFscmVhZHkgYmVlbiB1c2VkYFxyXG4gKiBoYXRhc8SxIGbEsXJsYXTEsWzEsXlvcmR1LiBTZXQgaWxlIHN5bmMgbWFyayBlZGVyZWsgdGVrIGJpciBkZWZpbmUgY3ljbGUnxLEgZ2FyYW50aSBlZGl5b3J1ei5cclxuICovXHJcbmNvbnN0IGJvb3RlZEFwcHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHJcbmV4cG9ydCBjb25zdCBib290ID0gKF9hcHBOYW1lOiBBcHBzLCBfcm91dGVzOiBSb3V0ZXMsIF9tZW51SXRlbXM6IFBsdWdpbk1lbnVJdGVtW10pID0+IHtcclxuXHRpZiAoYm9vdGVkQXBwcy5oYXMoX2FwcE5hbWUpIHx8IGN1c3RvbUVsZW1lbnRzLmdldChgYXBwLSR7X2FwcE5hbWV9YCkpIHJldHVybjtcclxuXHRib290ZWRBcHBzLmFkZChfYXBwTmFtZSk7XHJcblxyXG5cdGFwcE5hbWUgPSBfYXBwTmFtZTtcclxuXHRtZW51SXRlbXMgPSBfbWVudUl0ZW1zO1xyXG5cclxuXHQvKipcclxuXHQgKiAqKlBheWxhxZ/EsWxhbiBiYXNlIGNvbmZpZyoqIOKAlCByZW1vdGUgYmHFn8SxbmEgVEVLIGBjcmVhdGVBcHBsaWNhdGlvbmAuIEHEn8SxciBzZXJ2aXNsZXJcclxuXHQgKiAoSHR0cENsaWVudCArIGludGVyY2VwdG9yIGNoYWluLCBLZXljbG9haywgaTE4bi9UcmFuc2xvY28sIE1vbmFjbywgYW5pbWF0aW9ucykgYnVyYWRhXHJcblx0ICogeWHFn2FyOyBgcHJvdmlkZWRJbmAgdGHFn8SxbWF5YW4gZXhwbGljaXQgcHJvdmlkZXIgb2xkdWtsYXLEsSBpw6dpbiB0w7xtIHRhYidsYXLEsW4gY2hpbGRcclxuXHQgKiBpbmplY3RvcidsYXLEsW5kYW4gcGFyZW50IG9sYXJhayBwYXlsYcWfxLFsxLFyIOKGkiBSQU0gbGluZWVyIGLDvHnDvG1lei4gUm91dGVyL0xvY2F0aW9uL1xyXG5cdCAqIFJldXNlU3RyYXRlZ3kvVXJsU2VyaWFsaXplciBidXJhZGEgWU9LOyBvbmxhciB0YWIgYmHFn8SxbmEgaXpvbGUgY2hpbGQgaW5qZWN0b3InZGEgdmVyaWxpci5cclxuXHQgKi9cclxuXHRjb25zdCBzaGFyZWRCYXNlQ29uZmlnOiBBcHBsaWNhdGlvbkNvbmZpZyA9IHtcclxuXHRcdHByb3ZpZGVyczogW1xyXG5cdFx0XHRjcmVhdGVCYXNlQXBwQ29uZmlnKHsgaTE4bkZvbGRlcjogX2FwcE5hbWUgfSksXHJcblx0XHRcdHByb3ZpZGVIb3N0KF9hcHBOYW1lKSxcclxuXHRcdFx0Z2V0Tmdab25lKCksXHJcblx0XHRcdHtcclxuXHRcdFx0XHRwcm92aWRlOiBBUFBfSU5JVElBTElaRVIsXHJcblx0XHRcdFx0dXNlRmFjdG9yeTogKGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIGtleWNsb2FrOiBLZXljbG9ha1NlcnZpY2UsIGZvbGRlck5hbWU6IHR5cGVvZiBpMThuRm9sZGVyTmFtZSkgPT4ge1xyXG5cdFx0XHRcdFx0Y29uc3QgcnVuQXBpSW5pdCA9IHNldEFwaUNvbmZpZ09uTUZFTW9kZShodHRwQ2xpZW50LCBrZXljbG9haywgZm9sZGVyTmFtZSBhcyB1bmtub3duIGFzIEFwcHMpO1xyXG5cdFx0XHRcdFx0Y29uc3QgcnVuTG9hZFBsdWdpbnMgPSBsb2FkUGx1Z2lucygpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdFx0YXdhaXQgcnVuQXBpSW5pdCgpO1xyXG5cdFx0XHRcdFx0XHRydW5Mb2FkUGx1Z2lucygpO1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG11bHRpOiB0cnVlLFxyXG5cdFx0XHRcdGRlcHM6IFtIdHRwQ2xpZW50LCBLZXljbG9ha1NlcnZpY2UsIGkxOG5Gb2xkZXJOYW1lXVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRpbXBvcnRQcm92aWRlcnNGcm9tKE1vbmFjb0VkaXRvck1vZHVsZS5mb3JSb290KCkpLFxyXG5cdFx0XHR7IHByb3ZpZGU6IE5HWF9NT05BQ09fRURJVE9SX0NPTkZJRywgdXNlVmFsdWU6IG1vbmFjb0NvbmZpZyB9XHJcblx0XHRdXHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3RlIGJhxZ/EsW5hIFRFSyBwYXlsYcWfxLFsYW4gYEFwcGxpY2F0aW9uUmVmYCDigJQgY2xvc3VyZS1zY29wZS4gxLBsayBgPGFwcC0ke2FwcE5hbWV9PmBcclxuXHQgKiBlbGVtZW50J2kgYGNyZWF0ZUFwcGxpY2F0aW9uKHNoYXJlZEJhc2VDb25maWcpYCDDp2HEn8SxcsSxciwgc29ucmFraSB0w7xtIGVsZW1lbnQnbGVyIGF5bsSxXHJcblx0ICogcHJvbWlzZSfEsSBiZWtsZXIgKGR1cGxpY2F0ZSBBcHBsaWNhdGlvbiB5YXJhdMSxbcSxIGlta8OibnPEsXopLiBIZXIgZWxlbWVudCBrZW5kaSBjaGlsZFxyXG5cdCAqIGluamVjdG9yICsgYGNyZWF0ZUNvbXBvbmVudGAgaWxlIGtlbmRpIGBBcHBDb21wb25lbnRgIHZpZXcnxLFuxLEgeWFyYXTEsXAgc2hhcmVkIGFwcCdlXHJcblx0ICogYGF0dGFjaFZpZXdgIGlsZSBiYcSfbGFyLiBTaGFyZWQgYXBwIHV6dW4gw7Ztw7xybMO8ZMO8ciAodGFiJ2xhciBrYXBhbnNhIGRhIGRlc3Ryb3kgZWRpbG1leikuXHJcblx0ICpcclxuXHQgKiBgY2hpbGRQcm92aWRlcnNgJ3Rha2kgYFRyYW5zbG9jb1NlcnZpY2VgIGZhY3Rvcnknc2kgYnUgcmVmZXJhbnPEsSBrdWxsYW5kxLHEn8SxIGnDp2luXHJcblx0ICogYGNoaWxkUHJvdmlkZXJzYCd0YW4gw5ZOQ0UgdGFuxLFtbGFuxLFyIChmb3J3YXJkIFREWid5aSDDtm5sZXIpLlxyXG5cdCAqL1xyXG5cdGxldCBzaGFyZWRBcHBSZWY6IEFwcGxpY2F0aW9uUmVmIHwgbnVsbCA9IG51bGw7XHJcblx0bGV0IHNoYXJlZEFwcFByb21pc2U6IFByb21pc2U8QXBwbGljYXRpb25SZWY+IHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdC8qKlxyXG5cdCAqICoqVGFiIGJhxZ/EsW5hIGl6b2xlIFJvdXRlciBzdGFjayoqIOKAlCBoZXIgYDxhcHAtJHthcHBOYW1lfT5gIGtlbmRpIGNoaWxkXHJcblx0ICogYEVudmlyb25tZW50SW5qZWN0b3JgJ8SxbmRhIGJ1bmxhcsSxIGFsxLFyLiBgybVJTkpFQ1RPUl9TQ09QRTogJ3Jvb3QnYCBjaGlsZCfEsSAncm9vdCdcclxuXHQgKiBzY29wZSB5YXBhciAoQW5ndWxhciBgUjNJbmplY3RvcmAgY3RvcjogYHNjb3Blcy5hZGQoJ3Jvb3QnKWApOyBiw7Z5bGVjZSBgcHJvdmlkZVJvdXRlcmAnxLFuXHJcblx0ICogaW5qZWN0IGV0dGnEn2kgYHByb3ZpZGVkSW46J3Jvb3QnYCBSb3V0ZXIgc2VydmlzbGVyaSDigJQgYFJvdXRlcmAsIGBDaGlsZHJlbk91dGxldENvbnRleHRzYCxcclxuXHQgKiBgTG9jYXRpb25gLCBgTmF2aWdhdGlvblRyYW5zaXRpb25zYCB2Yi4g4oCUIGNoaWxkLUxPQ0FMIMO8cmV0aWxpci4gU29udcOnOiBoZXIgdGFiIGtlbmRpXHJcblx0ICogUm91dGVyICsga2VuZGkgYFJvdXRlck91dGxldGAgY29udGV4dCdpbmUgc2FoaXAgb2x1ciDihpIgKioxIFJvdXRlciA6IDEgb3V0bGV0KiouXHJcblx0ICpcclxuXHQgKiBOZWRlbiBnZXJla2xpOiBwYXlsYcWfxLFsYW4gdGVrIEFwcGxpY2F0aW9uJ2RhIE4gYDxyb3V0ZXItb3V0bGV0PmAgYXluxLEgdGVrXHJcblx0ICogYENoaWxkcmVuT3V0bGV0Q29udGV4dHNgJ2UgXCJwcmltYXJ5XCIgZGl5ZSBrYXlkb2x1cCBiaXJiaXJpbmkgZXppeW9yZHUgKGBjb250ZXh0cy5zZXRgXHJcblx0ICogb3ZlcndyaXRlKSDihpIgdGFiIGdlw6dpxZ9pIHNvbnJhc8SxIGF5bsSxIHRhYiBpw6dpIG5hdmlnYXN5b24gKGxpc3TihpJkZXRhaWwpIHlhbmzEscWfIG91dGxldCdlXHJcblx0ICogcmVuZGVyIG9sdXlvcmR1LiBDaGlsZC1pbmplY3RvciBpem9sYXN5b251IGJ1bnUga8O2a3RlbiDDp8O2emVyLlxyXG5cdCAqXHJcblx0ICogKipUcmFuc2xvY29TZXJ2aWNlIGlzdGlzbmFzxLEqKjogYCdyb290J2Agc2NvcGUgb251IGRhIGNoaWxkLWxvY2FsIHlhcGFyZMSxOyBhbWEgZ2xvYmFsXHJcblx0ICogKHNjb3BlJ3N1eikgw6dldmlyaWxlciBzaGFyZWQgYXBwJ2luIGluaXQgYWvEscWfxLFuZGEgecO8a2xlbmRpxJ9pbmRlbiDigJQgYGNyZWF0ZUNvbXBvbmVudGBcclxuXHQgKiBgQVBQX0lOSVRJQUxJWkVSYCDDp2FsxLHFn3TEsXJtYXog4oCUIGNoaWxkLWxvY2FsIHNlcnZpY2UnaW4gZ2xvYmFsIGNhY2hlJ2kgYm/FnyBrYWzEsXAgaGFtIGtleVxyXG5cdCAqIGfDtnN0ZXJpeW9yZHUuIFRhYiBiYcWfxLFuYSBheXLEsSBkaWwgc2VuYXJ5b3N1IHlvazsgc2VydmljZSdpIHNoYXJlZCBhcHAndGVuIHBheWxhxZ90xLFyxLF5b3J1elxyXG5cdCAqIChnbG9iYWwgw6dldmlyaSB0ZWsgeWVyZGUgecO8a2xlbmlyLCB0ZWsgdHJhbnNsYXRpb24gY2FjaGUg4oaSIGVrIFJBTSBrYXphbmPEsSkuIFNjb3BlIMOnZXZpcmlsZXJpXHJcblx0ICogKGBwcm92aWRlaTE4blNjb3BlYCkgY29tcG9uZW50LWxldmVsIHNhxJ9sYW5kxLHEn8SxIGnDp2luIHBheWxhxZ/EsWxhbiBzZXJ2aWNlJ2xlIGRlIMOnYWzEscWfxLFyLlxyXG5cdCAqXHJcblx0ICogTk9UOiBgybVJTkpFQ1RPUl9TQ09QRWAgQW5ndWxhciBwcml2YXRlIEFQSSdzaWRpcjsgbWlub3Igc8O8csO8bSB5w7xrc2VsdG1lbGVyaW5kZSBkYXZyYW7EscWfxLFcclxuXHQgKiBkb8SfcnVsYW5tYWzEsSAoYcWfYcSfxLFkYWtpIFBPQyBpem9sYXN5b24gbG9nJ3UgYnVudW4gacOnaW4gYsSxcmFrxLFsZMSxKS5cclxuXHQgKi9cclxuXHRjb25zdCBjaGlsZFByb3ZpZGVyczogQXJyYXk8UHJvdmlkZXIgfCBFbnZpcm9ubWVudFByb3ZpZGVycz4gPSBbXHJcblx0XHR7IHByb3ZpZGU6IMm1SU5KRUNUT1JfU0NPUEUsIHVzZVZhbHVlOiAncm9vdCcgfSxcclxuXHRcdHByb3ZpZGVSb3V0ZXIoXHJcblx0XHRcdF9yb3V0ZXMsXHJcblx0XHRcdHdpdGhDb21wb25lbnRJbnB1dEJpbmRpbmcoKSxcclxuXHRcdFx0d2l0aFJvdXRlckNvbmZpZyh7IG9uU2FtZVVybE5hdmlnYXRpb246ICdyZWxvYWQnIH0pXHJcblx0XHQpLFxyXG5cdFx0eyBwcm92aWRlOiBMb2NhdGlvblN0cmF0ZWd5LCB1c2VDbGFzczogSXNvbGF0ZWRMb2NhdGlvblN0cmF0ZWd5IH0sXHJcblx0XHR7IHByb3ZpZGU6IExvY2F0aW9uLCB1c2VDbGFzczogTG9jYXRpb24gfSxcclxuXHRcdHsgcHJvdmlkZTogUm91dGVSZXVzZVN0cmF0ZWd5LCB1c2VFeGlzdGluZzogQ3VzdG9tUm91dGVSZXVzZVN0cmF0ZWd5IH0sXHJcblx0XHR7IHByb3ZpZGU6IFVybFNlcmlhbGl6ZXIsIHVzZUV4aXN0aW5nOiBUYWJBd2FyZVVybFNlcmlhbGl6ZXIgfSxcclxuXHRcdHsgcHJvdmlkZTogVHJhbnNsb2NvU2VydmljZSwgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoVHJhbnNsb2NvU2VydmljZSkgfSxcclxuXHRcdC8vIGDJtUlOSkVDVE9SX1NDT1BFOidyb290J2AgeWFuIGV0a2lzaTogYEFwcGxpY2F0aW9uUmVmYCBkZSBgcHJvdmlkZWRJbjoncm9vdCdgIG9sZHXEn3UgacOnaW5cclxuXHRcdC8vIGNoaWxkIGluamVjdG9yJ2RhIGNoaWxkLUxPS0FMIChzYWh0ZSkgYmlyIGluc3RhbmNlIMO8cmV0aWxpcmRpIOKAlCBidSBpbnN0YW5jZSBOZ1pvbmUndW5cclxuXHRcdC8vIHRpY2sgZMO2bmfDvHPDvG5lIGJhxJ9sxLEgREXEnsSwTETEsFIuIFNvbnXDpzogYnUgYXBwUmVmJ2UgYGF0dGFjaFZpZXdgIGVkaWxlbiB2aWV3J2xhciBoacOnIGNoYW5nZVxyXG5cdFx0Ly8gZGV0ZWN0aW9uIGFsbWF6LiBBcHBDb21wb25lbnQnaSBiaXogYcOnxLFrw6dhIGBzaGFyZWRBcHBSZWYuYXR0YWNoVmlld2AgaWxlIGJhxJ9sYWTEscSfxLFtxLF6IGnDp2luXHJcblx0XHQvLyDDp2FsxLHFn8SxcjsgYW1hIGBpbmplY3QoQXBwbGljYXRpb25SZWYpYCB5YXBhbiDDvMOnw7xuY8O8IHRhcmFmIGtvZCAoUHJpbWVORyBgRGlhbG9nU2VydmljZWAg4oaSXHJcblx0XHQvLyBgdGhpcy5hcHBSZWYuYXR0YWNoVmlld2ApIGNoaWxkLWxvY2FsIHNhaHRlIGFwcFJlZidpIGFsxLFwIGRpYWxvZyd1IG9uYSBiYcSfbMSxeW9yZHUg4oaSIGRpYWxvZ1xyXG5cdFx0Ly8geWFyYXTEsWzEsXlvciBhbWEgYCpuZ0lmPVwidmlzaWJsZVwiYCBoacOnIHJlbmRlciBlZGlsbWl5b3JkdSAoYm/FnyBhw6fEsWzEsXlvcmR1KS5cclxuXHRcdC8vXHJcblx0XHQvLyDDh8O2esO8bSDigJQgYHNoYXJlZEFwcFJlZmAnaSBzYXJhbiBQcm94eTogVMOcTSDDvHllbGVyIChhdHRhY2hWaWV3L2RldGFjaFZpZXcvdGljay9jb21wb25lbnRz4oCmKVxyXG5cdFx0Ly8gZ2Vyw6dlayBgc2hhcmVkQXBwUmVmYCdlIGRlbGVnZSBvbHVyIChtZXRob2QnbGFyIGB0YXJnZXRgJ2EgYmluZCdsaSDihpIgcHJpdmF0ZSBmaWVsZCBkYWhpbFxyXG5cdFx0Ly8gZG/En3J1IGB0aGlzYCksIFRFSyBmYXJrIGAuaW5qZWN0b3JgIOKGkiBidSB0YWInxLFuIGNoaWxkIGluamVjdG9yJ8SxLiBOZWRlbiBrcml0aWs6IFByaW1lTkdcclxuXHRcdC8vIGBEaWFsb2dTZXJ2aWNlYCBkaWFsb2cndSBgY3JlYXRlQ29tcG9uZW50KC4uLiwgeyBlbnZpcm9ubWVudEluamVjdG9yOiB0aGlzLmFwcFJlZi5pbmplY3RvciB9KWBcclxuXHRcdC8vIGlsZSB5YXJhdMSxci4gRMO8eiBgc2hhcmVkQXBwUmVmYCBkw7ZuZXJzZWsgZGlhbG9nIGnDp2VyacSfaSBzaGFyZWQgUk9PVCd0YSDDp8O2esO8bMO8ciwgc2F5ZmEgaXNlXHJcblx0XHQvLyBjaGlsZCBpbmplY3RvcidkYSDihpIgYHByb3ZpZGVkSW46J3Jvb3QnYCBoZXIgc2VydmlzIMSwS8SwIGF5csSxIGluc3RhbmNlIG9sdXIgKHNwbGl0LWJyYWluKSB2ZVxyXG5cdFx0Ly8gQmVoYXZpb3JTdWJqZWN0IHRhYmFubMSxIHNheWZh4oaUZGlhbG9nIHN0YXRlIHNlbmtyb25pemUgT0xNQVogKHNlw6dpbGkga2F5xLF0IGRpYWxvZydkYSBudWxsKS5cclxuXHRcdC8vIGAuaW5qZWN0b3JgJ8SxIGNoaWxkJ2EgecO2bmxlbmRpcmluY2UgZGlhbG9nIGnDp2VyacSfaSBzYXlmYXlsYSBBWU5JIGluamVjdG9yJ2RhIMOnw7Z6ZXIg4oaSIG90b21hdGlrXHJcblx0XHQvLyB0ZWsgaW5zdGFuY2UsIFTDnE0gKG1ldmN1dCtnZWxlY2VrKSBzZXJ2aXNsZXIgacOnaW4g4oCUIHNlcnZpcyBsaXN0ZXNpIHR1dG1heWEgZ2VyZWsgeW9rLlxyXG5cdFx0Ly8gYGF0dGFjaFZpZXdgIHlpbmUgYHNoYXJlZEFwcFJlZmAnZSBnaXR0acSfaSBpw6dpbiB0ZWsgdGljayBkw7ZuZ8O8c8O8L2NoYW5nZSBkZXRlY3Rpb24ga29ydW51ci5cclxuXHRcdHtcclxuXHRcdFx0cHJvdmlkZTogQXBwbGljYXRpb25SZWYsXHJcblx0XHRcdHVzZUZhY3Rvcnk6ICgpID0+IHtcclxuXHRcdFx0XHRjb25zdCB0YWJJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcclxuXHRcdFx0XHRyZXR1cm4gbmV3IFByb3h5KHNoYXJlZEFwcFJlZiEsIHtcclxuXHRcdFx0XHRcdGdldCh0YXJnZXQsIHByb3ApIHtcclxuXHRcdFx0XHRcdFx0aWYgKHByb3AgPT09ICdpbmplY3RvcicpIHJldHVybiB0YWJJbmplY3RvcjtcclxuXHRcdFx0XHRcdFx0Ly8gYG5nT25EZXN0cm95YCd1IEfEsFpMRSAodW5kZWZpbmVkIGTDtm5kw7xyKS4gQWtzaSBoYWxkZSBgaW5qZWN0KEFwcGxpY2F0aW9uUmVmKWBcclxuXHRcdFx0XHRcdFx0Ly8geWFwYW4gdGFiIGNoaWxkIGluamVjdG9yJ8SxIChQcmltZU5HIERpYWxvZ1NlcnZpY2UgdmV5YSBhxZ9hxJ/EsWRha2kgZGV2IGd1YXJkKVxyXG5cdFx0XHRcdFx0XHQvLyBwcm94eSd5aSBrZW5kaSBgX25nT25EZXN0cm95SG9va3NgJ3VuYSBrYXlkZWRlciAoUjNJbmplY3Rvci5oeWRyYXRlIOKGklxyXG5cdFx0XHRcdFx0XHQvLyBoYXNPbkRlc3Ryb3k9dHJ1ZSkgdmUgdGFiIGthcGFuxLHFn8SxbmRhIGBjaGlsZEluamVjdG9yLmRlc3Ryb3koKWAg4oaSXHJcblx0XHRcdFx0XHRcdC8vIGBzaGFyZWRBcHBSZWYubmdPbkRlc3Ryb3koKWAg4oaSIGHDp8SxayBUw5xNIHRhYidsYXLEsW4gdmlldydsYXLEsW7EsSBkZXN0cm95IGVkaXBcclxuXHRcdFx0XHRcdFx0Ly8gc2hhcmVkIGFwcCdpIMO2bGTDvHLDvHIuIFNoYXJlZCBhcHAnaW4gbGlmZWN5Y2xlJ8SxIGJvb3RzdHJhcCdhIGFpdHRpciwgdGFiJ2EgZGXEn2lsXHJcblx0XHRcdFx0XHRcdC8vIChnZXLDp2VrIGBzaGFyZWRBcHBSZWYubmdPbkRlc3Ryb3lgIGV0a2lsZW5tZXo7IHlhbG7EsXpjYSBwcm94eSDDvHplcmluZGVuIGdpemxlbmlyKS5cclxuXHRcdFx0XHRcdFx0aWYgKHByb3AgPT09ICduZ09uRGVzdHJveScpIHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCB0YXJnZXQpO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nID8gdmFsdWUuYmluZCh0YXJnZXQpIDogdmFsdWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHQvLyBUYXJhbWEgKGxvZzE1KSBpbGUgc2FwdGFuYW4sIGNoaWxkLWxvY2FsIG9sdW5jYSBib3p1bGFuIGVrIGBwcm92aWRlZEluOidyb290J2Agc2VydmlzbGVyaTpcclxuXHRcdC8vIOKAoiBQdWJTdWJTZXJ2aWNlIOKAlCBNRkUnbmluIGBicmVhZGNydW1iVXBkYXRlZGAgZXZlbnQnaSBob3N0IGBoaXN0b3J5LnNlcnZpY2VgJ2UgdWxhxZ9tYWzEsTtcclxuXHRcdC8vICAgY2hpbGQtbG9jYWwgb2x1bmNhIE1GReKGlGhvc3QgZXZlbnQga8O2cHLDvHPDvCBrb3B1eW9yZHUuXHJcblx0XHQvLyDigKIgUHJpbWVOR0NvbmZpZyDigJQgZGluYW1payBkaWFsb2cnbGFyIHNoYXJlZCByb290IGNvbnRleHQnaW5kZSB5YXJhdMSxbGTEscSfxLEgacOnaW4gUHJpbWVOR1xyXG5cdFx0Ly8gICDDp2V2aXJpbGVyaSAoY2FsZW5kYXIvcGFnaW5hdG9yIHZiLikgdmUgYHNldFRyYW5zbGF0aW9uYCBzaGFyZWQgaW5zdGFuY2UndGFuIG9rdW5tYWzEsS5cclxuXHRcdC8vIChCcmVhZGNydW1iU2VydmljZSBiaWxpbsOnbGkgb2xhcmFrIGNoaWxkLWxvY2FsIGLEsXJha8SxbGTEsTogaGVyIHRhYiBrZW5kaSBicmVhZGNydW1iJ8SxLilcclxuXHRcdHsgcHJvdmlkZTogUHViU3ViU2VydmljZSwgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoUHViU3ViU2VydmljZSkgfSxcclxuXHRcdHsgcHJvdmlkZTogUHJpbWVOR0NvbmZpZywgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoUHJpbWVOR0NvbmZpZykgfSxcclxuXHRcdC8vIFRvYXN0L2NvbmZpcm0gR0xPQkFMOiB0ZWsgc2hhcmVkIE1lc3NhZ2VTZXJ2aWNlL0NvbmZpcm1hdGlvblNlcnZpY2UuIEFrc2kgaGFsZGUgaGVyIHRhYlxyXG5cdFx0Ly8ga2VuZGkgaW5zdGFuY2UnxLFuYSBzYWhpcCBvbHVyIOKGkiBob3N0J3RhbiB0ZXRpa2xlbmVuIHRvYXN0IE1GRSB0YWInxLFuZGEgKHlhIGRhIHRlcnNpKVxyXG5cdFx0Ly8gZ8O2csO8bm1lei4gU2hhcmVkIGluc3RhbmNlIGlsZSB0w7xtIGA8cC10b2FzdCBrZXk9XCJ0b2FzdC1yb290XCI+YCBjb250YWluZXInbGFyxLEgYXluxLEga3V5cnXEn3UgZGlubGVyLlxyXG5cdFx0eyBwcm92aWRlOiBNZXNzYWdlU2VydmljZSwgdXNlRmFjdG9yeTogKCkgPT4gc2hhcmVkQXBwUmVmIS5pbmplY3Rvci5nZXQoTWVzc2FnZVNlcnZpY2UpIH0sXHJcblx0XHR7IHByb3ZpZGU6IENvbmZpcm1hdGlvblNlcnZpY2UsIHVzZUZhY3Rvcnk6ICgpID0+IHNoYXJlZEFwcFJlZiEuaW5qZWN0b3IuZ2V0KENvbmZpcm1hdGlvblNlcnZpY2UpIH1cclxuXHRdO1xyXG5cclxuXHRjb25zdCBhcHBDb21wb25lbnRQcm9taXNlID0gYXBwQ29tcG9uZW50TG9hZGVyKCk7XHJcblxyXG5cdGNsYXNzIE1GRUFwcEVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XHJcblx0XHRwcml2YXRlIGNoaWxkSW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IgfCBudWxsID0gbnVsbDtcclxuXHRcdHByaXZhdGUgY29tcFJlZjogQ29tcG9uZW50UmVmPHVua25vd24+IHwgbnVsbCA9IG51bGw7XHJcblx0XHRwcml2YXRlIGlzQm9vdHN0cmFwcGluZyA9IGZhbHNlO1xyXG5cdFx0cHJpdmF0ZSBkZXN0cm95VGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdFx0YXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRcdC8vIFN0cmF0ZWd5IGhpZGRlbiBjb250YWluZXIg4oaUIHZpZXcgYXJhc8SxIHRhxZ/EsW1hbGFyZGEgcmUtYm9vdHN0cmFwJ8SxIMO2bmxlIOKAlFxyXG5cdFx0XHQvLyB2aWV3IHphdGVuIHlhcmF0xLFsZMSxeXNhIHNraXAuIGRlc3Ryb3lUaW1lciBwZW5kaW5nIGlzZSBpcHRhbCBldC5cclxuXHRcdFx0aWYgKHRoaXMuY29tcFJlZiB8fCB0aGlzLmlzQm9vdHN0cmFwcGluZykge1xyXG5cdFx0XHRcdGlmICh0aGlzLmRlc3Ryb3lUaW1lcikge1xyXG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMuZGVzdHJveVRpbWVyKTtcclxuXHRcdFx0XHRcdHRoaXMuZGVzdHJveVRpbWVyID0gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuaXNCb290c3RyYXBwaW5nID0gdHJ1ZTtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHQvLyBQYXlsYcWfxLFsYW4gQXBwbGljYXRpb24g4oCUIGlsayDDp2HEn8SxcmFuIHlhcmF0xLFyLCBkacSfZXJsZXJpIGF5bsSxIHByb21pc2UnxLEgYmVrbGVyLlxyXG5cdFx0XHRcdGlmICghc2hhcmVkQXBwUHJvbWlzZSkge1xyXG5cdFx0XHRcdFx0c2hhcmVkQXBwUHJvbWlzZSA9IGNyZWF0ZUFwcGxpY2F0aW9uKHNoYXJlZEJhc2VDb25maWcpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb25zdCBbYXBwUmVmLCBBcHBDb21wb25lbnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3NoYXJlZEFwcFByb21pc2UsIGFwcENvbXBvbmVudFByb21pc2VdKTtcclxuXHRcdFx0XHRzaGFyZWRBcHBSZWYgPSBhcHBSZWY7XHJcblxyXG5cdFx0XHRcdC8vIEJ1IHRhYiBpw6dpbiBpem9sZSBSb3V0ZXIgc3RhY2snaSBiYXLEsW5kxLFyYW4gY2hpbGQgaW5qZWN0b3IuXHJcblx0XHRcdFx0Y29uc3QgdGFiSWQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnYXJpbC10YWItaWQnKSA/PyAnJztcclxuXHRcdFx0XHR0aGlzLmNoaWxkSW5qZWN0b3IgPSBjcmVhdGVFbnZpcm9ubWVudEluamVjdG9yKFxyXG5cdFx0XHRcdFx0Y2hpbGRQcm92aWRlcnMsXHJcblx0XHRcdFx0XHRhcHBSZWYuaW5qZWN0b3IsXHJcblx0XHRcdFx0XHRgbWZlOiR7X2FwcE5hbWV9OiR7dGFiSWQgfHwgJ3BlbmRpbmcnfWBcclxuXHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHQvLyBbSGlicml0IGl6b2xhc3lvbiBndWFyZCDigJQga2FsxLFjxLFdIGDJtUlOSkVDVE9SX1NDT1BFOidyb290J2AgaWxlIGNoaWxkIGluamVjdG9yJ8SxblxyXG5cdFx0XHRcdC8vIEtFTkTEsCBSb3V0ZXIgKyBDaGlsZHJlbk91dGxldENvbnRleHRzJ2kgb2xtYXPEsSwgdGFiIGl6b2xhc3lvbnVudW4gdGVtZWxpZGlyXHJcblx0XHRcdFx0Ly8gKFwiMSBSb3V0ZXIgOiAxIG91dGxldFwiKS4gQnUgcHJpdmF0ZSBBUEkgQW5ndWxhciB1cGdyYWRlJ2luZGUgZGF2cmFuxLHFnyBkZcSfacWfdGlyaXJzZVxyXG5cdFx0XHRcdC8vIGJ1cmFkYSBlcmtlbiB5YWthbGFuxLFyOyBha3NpIGhhbGRlIFwiMSBSb3V0ZXIgOiBOIG91dGxldFwiIGJ1ZyfEsSBzZXNzaXpjZSBnZXJpIGTDtm5lci5cclxuXHRcdFx0XHRpZiAoaXNEZXZNb2RlKCkgJiYgdGhpcy5jaGlsZEluamVjdG9yLmdldChSb3V0ZXIpID09PSBhcHBSZWYuaW5qZWN0b3IuZ2V0KFJvdXRlcikpIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXHJcblx0XHRcdFx0XHRcdGBbYm9vdDoke19hcHBOYW1lfV0gSMSwQlLEsFQgxLBaT0xBU1lPTiBCT1pVTERVOiBjaGlsZCBSb3V0ZXIgc2hhcmVkIHJvb3QgaWxlIGF5bsSxIGluc3RhbmNlISBgICtcclxuXHRcdFx0XHRcdFx0XHRgybVJTkpFQ1RPUl9TQ09QRSBkYXZyYW7EscWfxLEgZGXEn2nFn21pxZ8gb2xhYmlsaXIgKEFuZ3VsYXIgdXBncmFkZT8pIOKAlCB0YWIgaXpvbGFzeW9udSDDp2FsxLHFn21hei5gXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gW0RpYWxvZyBpbmplY3RvciBrw7ZwcsO8c8O8IGd1YXJkIOKAlCBrYWzEsWPEsV0gQXBwbGljYXRpb25SZWYgcHJveHknc2luaW4gYC5pbmplY3RvcmAnxLEgYnVcclxuXHRcdFx0XHQvLyB0YWInxLFuIGNoaWxkIGluamVjdG9yJ8SxbsSxIGfDtnN0ZXJtZWxpOyBha3NpIGhhbGRlIFByaW1lTkcgRGlhbG9nU2VydmljZSBkaWFsb2cgacOnZXJpxJ9pbmlcclxuXHRcdFx0XHQvLyBzaGFyZWQgcm9vdCd0YSDDp8O2emVyIOKGkiBzYXlmYeKGlGRpYWxvZyBgcHJvdmlkZWRJbjoncm9vdCdgIHNwbGl0LWJyYWluIGdlcmkgZMO2bmVyLiBQcmltZU5HXHJcblx0XHRcdFx0Ly8geWEgZGEgQW5ndWxhciB1cGdyYWRlJ2kgYGFwcFJlZi5pbmplY3RvcmAga3VsbGFuxLFtxLFuxLEgZGXEn2nFn3Rpcmlyc2UgYnVyYWRhIHlha2FsYW7EsXIuXHJcblx0XHRcdFx0aWYgKGlzRGV2TW9kZSgpICYmIHRoaXMuY2hpbGRJbmplY3Rvci5nZXQoQXBwbGljYXRpb25SZWYpLmluamVjdG9yICE9PSB0aGlzLmNoaWxkSW5qZWN0b3IpIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXHJcblx0XHRcdFx0XHRcdGBbYm9vdDoke19hcHBOYW1lfV0gRElBTE9HIElOSkVDVE9SIEvDllBSw5xTw5wgQk9aVUxEVTogQXBwbGljYXRpb25SZWYuaW5qZWN0b3IgdGFiIGNoaWxkIGAgK1xyXG5cdFx0XHRcdFx0XHRcdGBpbmplY3RvcifEsSBnw7ZzdGVybWl5b3Ig4oCUIGRpYWxvZyBpw6dlcmnEn2kgc2F5ZmFkYW4gZmFya2zEsSBpbmplY3RvcidkYSDDp8O2esO8bMO8ciAoc3BsaXQtYnJhaW4pLmBcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBBcHBDb21wb25lbnQnaSBjaGlsZCBpbmplY3RvciBjb250ZXh0J2luZGUgeWFyYXQg4oaSIGluamVjdChSb3V0ZXIpL0xvY2F0aW9uU3RyYXRlZ3lcclxuXHRcdFx0XHQvLyBjaGlsZC1sb2NhbDsgaW5qZWN0KE1mZUJyaWRnZSkvSHR0cENsaWVudC9LZXljbG9hay9UcmFuc2xvY29TZXJ2aWNlIHZiLiBwYXJlbnQndGFuXHJcblx0XHRcdFx0Ly8gcGF5bGHFn8SxbWzEsS4gYGF0dGFjaFZpZXdgIHNoYXJlZCBhcHAnaW4gY2hhbmdlIGRldGVjdGlvbiBkw7ZuZ8O8c8O8bmUgYmHEn2xhci4gKGBib290c3RyYXBgXHJcblx0XHRcdFx0Ly8gZGXEn2lsOiBBUFBfQk9PVFNUUkFQX0xJU1RFTkVSIMOnYWzEscWfbWF6LCBjaGlsZCBSb3V0ZXInxLFuIGluaXRpYWwgbmF2aWdhdGlvbifEsW7EsVxyXG5cdFx0XHRcdC8vIEFwcENvbXBvbmVudCBob3N0LVJvdXRlciBzeW5jJ2kgYHNhZmVOYXZpZ2F0ZWAgaWxlIHlhcMSxeW9yLilcclxuXHRcdFx0XHR0aGlzLmNvbXBSZWYgPSBjcmVhdGVDb21wb25lbnQoQXBwQ29tcG9uZW50IGFzIG5ldmVyLCB7XHJcblx0XHRcdFx0XHRlbnZpcm9ubWVudEluamVjdG9yOiB0aGlzLmNoaWxkSW5qZWN0b3IsXHJcblx0XHRcdFx0XHRob3N0RWxlbWVudDogdGhpc1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdGFwcFJlZi5hdHRhY2hWaWV3KHRoaXMuY29tcFJlZi5ob3N0Vmlldyk7XHJcblx0XHRcdFx0Ly8gQmHFn2FyxLFsxLEgYm9vdDogZ3VhcmQgYXJ0xLFrIGBjb21wUmVmYCDDvHplcmluZGVuIMOnYWzEscWfxLFyIOKGkiBgaXNCb290c3RyYXBwaW5nYCdpIGLEsXJhay5cclxuXHRcdFx0XHQvLyAoYXdhaXQgc8SxcmFzxLFuZGEgZGlzY29ubmVjdCBvbHVwIGhhdGEgb2x1xZ9tYXpzYSBmbGFnIHRha8SxbMSxIGthbG1hc8SxbjsgYWtzaSBoYWxkZVxyXG5cdFx0XHRcdC8vIHJlY29ubmVjdCd0ZSBndWFyZCBlcmtlbiByZXR1cm4gZWRpcCB0YWInxLEga2FsxLFjxLEgYm/FnyBixLFyYWvEsXIuKVxyXG5cdFx0XHRcdHRoaXMuaXNCb290c3RyYXBwaW5nID0gZmFsc2U7XHJcblx0XHRcdH0gY2F0Y2ggKGVycikge1xyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFtib290OiR7X2FwcE5hbWV9XSBhcHBsaWNhdGlvbiBib290c3RyYXAgaGF0YXPEsTpgLCBlcnIpO1xyXG5cdFx0XHRcdHRoaXMuaXNCb290c3RyYXBwaW5nID0gZmFsc2U7XHJcblx0XHRcdFx0Ly8gc2hhcmVkQXBwIGhlbsO8eiBzZXQgZWRpbG1lZGl5c2UgKGNyZWF0ZUFwcGxpY2F0aW9uIGJhxZ9hcsSxc8SxeikgcHJvbWlzZSfEsSBzxLFmxLFybGEga2lcclxuXHRcdFx0XHQvLyBzb25yYWtpIHRhYiByZXRyeSBlZGViaWxzaW4g4oCUIGFrc2kgaGFsZGUgcmVqZWN0ZWQgcHJvbWlzZSBjbG9zdXJlJ2RhIGthbMSxY8SxIGthbMSxciB2ZVxyXG5cdFx0XHRcdC8vIHJlbW90ZSBzYXlmYSB5ZW5pbGVtZWRlbiBiaXIgZGFoYSBib290IGVkaWxlbWV6LiAoY3JlYXRlQ29tcG9uZW50IGhhdGFzxLFuZGFcclxuXHRcdFx0XHQvLyBzaGFyZWRBcHBSZWYgemF0ZW4gc2V0J3RpcjsgbyBkdXJ1bWRhIHByb21pc2Uga29ydW51ciwgYXBwIHllbmlkZW4geWFyYXTEsWxtYXouKVxyXG5cdFx0XHRcdGlmICghc2hhcmVkQXBwUmVmKSBzaGFyZWRBcHBQcm9taXNlID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xyXG5cdFx0XHQvLyBTdHJhdGVneSBoaWRkZW4gY29udGFpbmVyIOKGlCB2aWV3IGFyYXPEsSB0YcWfxLFtYWxhcmRhIGByZW1vdmVDaGlsZGAgKyBgYXBwZW5kQ2hpbGRgXHJcblx0XHRcdC8vIGFyZMSxxZ/EsWsgb2xkdcSfdSBpw6dpbiBkaXNjb25uZWN0ZWRDYWxsYmFjayBwYXJlbnQgZGXEn2nFn2ltaXlsZSB0ZXRpa2xlbmlyIOKAlCBlbGVtZW50XHJcblx0XHRcdC8vIGdlcsOnZWt0ZW4gZGVzdHJveSBlZGlsbWl5b3IuIGBwcmVzZXJ2ZVdlYkNvbXBvbmVudEVsZW1lbnRgIMO2bmNlc2luZGUgU3RyYXRlZ3lcclxuXHRcdFx0Ly8gYF9fYXJpbFByZXNlcnZlRHVyaW5nRGV0YWNoYCBmbGFnJ2kgc2V0IGVkaXlvcjsgbyBmbGFnIHZhcnNhIHZpZXcga29ydW51ci5cclxuXHRcdFx0Y29uc3QgcHJlc2VydmVGbGFnID0gKHRoaXMgYXMgSFRNTEVsZW1lbnQgJiB7IF9fYXJpbFByZXNlcnZlRHVyaW5nRGV0YWNoPzogYm9vbGVhbiB9KS5fX2FyaWxQcmVzZXJ2ZUR1cmluZ0RldGFjaDtcclxuXHRcdFx0aWYgKHByZXNlcnZlRmxhZykge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBGbGFnIHlvayDihpIgZ2Vyw6dlayBkZXN0cm95LiBBc3luYyByZS1jb25uZWN0IGlodGltYWxpbmUga2FyxZ/EsSBtaWNyb3Rhc2sgc8SxbsSxcmzEsVxyXG5cdFx0XHQvLyBkZWZhbnNpZiBnZWNpa21lOyBiaXIgc29ucmFraSB0aWNrJ3RlIGjDomzDoiBkaXNjb25uZWN0ZWQgbcSxIGRpeWUgc29uIGtvbnRyb2wuXHJcblx0XHRcdGlmICh0aGlzLmRlc3Ryb3lUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuZGVzdHJveVRpbWVyKTtcclxuXHRcdFx0dGhpcy5kZXN0cm95VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0XHRpZiAoIXRoaXMuaXNDb25uZWN0ZWQgJiYgdGhpcy5jb21wUmVmKSB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhgW2Jvb3Q6JHtfYXBwTmFtZX1dIGdlcsOnZWsgZGVzdHJveSDihpIgdmlldyArIGNoaWxkIGluamVjdG9yIGRlc3Ryb3lgKTtcclxuXHRcdFx0XHRcdC8vIFNoYXJlZCBhcHAnZSBBU0xBIGRva3VubWE7IHNhZGVjZSBidSB0YWInxLFuIHZpZXcnxLFuxLEgdmUgY2hpbGQgaW5qZWN0b3InxLFuxLEgecSxay5cclxuXHRcdFx0XHRcdGlmIChzaGFyZWRBcHBSZWYpIHNoYXJlZEFwcFJlZi5kZXRhY2hWaWV3KHRoaXMuY29tcFJlZi5ob3N0Vmlldyk7XHJcblx0XHRcdFx0XHR0aGlzLmNvbXBSZWYuZGVzdHJveSgpO1xyXG5cdFx0XHRcdFx0dGhpcy5jaGlsZEluamVjdG9yPy5kZXN0cm95KCk7XHJcblx0XHRcdFx0XHR0aGlzLmNvbXBSZWYgPSBudWxsO1xyXG5cdFx0XHRcdFx0dGhpcy5jaGlsZEluamVjdG9yID0gbnVsbDtcclxuXHRcdFx0XHRcdHRoaXMuaXNCb290c3RyYXBwaW5nID0gZmFsc2U7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMuZGVzdHJveVRpbWVyID0gbnVsbDtcclxuXHRcdFx0fSwgMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHR0cnkge1xyXG5cdFx0Y3VzdG9tRWxlbWVudHMuZGVmaW5lKGBhcHAtJHthcHBOYW1lfWAsIE1GRUFwcEVsZW1lbnQpO1xyXG5cdH0gY2F0Y2ggKGUpIHtcclxuXHRcdGlmIChlIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uICYmIGUubmFtZSA9PT0gJ05vdFN1cHBvcnRlZEVycm9yJykge1xyXG5cdFx0XHRjb25zb2xlLndhcm4oYFtib290OiR7YXBwTmFtZX1dIGN1c3RvbSBlbGVtZW50IHphdGVuIHRhbsSxbWzEsSwgZGVmaW5lIGF0bGFuZMSxYCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHRocm93IGU7XHJcblx0fVxyXG59O1xyXG4iXX0=
|
|
@@ -627,6 +627,13 @@ class CustomRouteReuseStrategy {
|
|
|
627
627
|
return false;
|
|
628
628
|
}
|
|
629
629
|
const routeKey = this.getRouteKey(route);
|
|
630
|
+
// Angular `outlet.detach()`, `store()`'dan ÖNCE çalışıp wrapper view'ını DOM'dan söker →
|
|
631
|
+
// içindeki MFE `<app-xxx>` element'i disconnect olur ve barındırdığı iframe (örn. Superset embed)
|
|
632
|
+
// reload olup auth handshake'ini kalıcı kaybeder. Bu yüzden element'i HÂLÂ bağlıyken, detach'ten
|
|
633
|
+
// ÖNCE atomic `moveBefore` ile hidden container'a alıyoruz (bkz. preserveLiveElementBeforeDetach).
|
|
634
|
+
if (this.isMatcherRoute(route)) {
|
|
635
|
+
this.preserveLiveElementBeforeDetach(route);
|
|
636
|
+
}
|
|
630
637
|
console.log(`[Strategy] shouldDetach key="${routeKey}" → true`);
|
|
631
638
|
return true;
|
|
632
639
|
}
|
|
@@ -686,18 +693,16 @@ class CustomRouteReuseStrategy {
|
|
|
686
693
|
return;
|
|
687
694
|
const element = componentInstance.element;
|
|
688
695
|
const hiddenContainer = this.getHiddenContainer();
|
|
689
|
-
// Flag —
|
|
690
|
-
//
|
|
696
|
+
// Flag — fallback (moveBefore desteklenmeyen tarayıcı) removeChild yaptığında disconnectedCallback
|
|
697
|
+
// bunu okuyup destroy'ı atlar. moveBefore yolunda callback hiç tetiklenmez (flag zararsız kalır).
|
|
691
698
|
element.__arilPreserveDuringDetach = true;
|
|
692
|
-
//
|
|
693
|
-
if (
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
//
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
console.log('Web component element hidden container\'a taşındı (state korunuyor)');
|
|
700
|
-
}
|
|
699
|
+
// `shouldDetach` çoğu durumda element'i detach'ten ÖNCE zaten taşıdı → burada no-op.
|
|
700
|
+
if (hiddenContainer.contains(element))
|
|
701
|
+
return;
|
|
702
|
+
// Taşınmadıysa (ör. shouldDetach element'i bulamadı): bu noktada element Angular tarafından
|
|
703
|
+
// zaten disconnect edilmiş olabilir; moveInto bağlıysa moveBefore, değilse appendChild kullanır.
|
|
704
|
+
this.moveInto(hiddenContainer, element);
|
|
705
|
+
console.log('Web component element hidden container\'a taşındı (state korunuyor)');
|
|
701
706
|
}
|
|
702
707
|
catch (error) {
|
|
703
708
|
console.warn('Web component element preserve edilirken hata:', error);
|
|
@@ -720,35 +725,45 @@ class CustomRouteReuseStrategy {
|
|
|
720
725
|
return;
|
|
721
726
|
const element = componentInstance.element;
|
|
722
727
|
const hiddenContainer = this.getHiddenContainer();
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
console.log('Web component element component view\'a eklendi (retrieve sırasında)');
|
|
734
|
-
// Props'ları güncellemek için flag set et (component kendi populateProps'unu çağıracak)
|
|
735
|
-
componentInstance.propsUpdated = false;
|
|
736
|
-
return true;
|
|
737
|
-
}
|
|
728
|
+
if (!hiddenContainer.contains(element))
|
|
729
|
+
return;
|
|
730
|
+
// ÖNEMLI: element'i hidden container'dan ERKEN çıkarmıyoruz. `retrieve`, Angular
|
|
731
|
+
// `outlet.attach()`'ten ÖNCE çağrılır → vc henüz DOM'a bağlı değildir. Erken removeChild
|
|
732
|
+
// element'i disconnect eder ve iframe reload olur (tam kaçındığımız şey). Bunun yerine
|
|
733
|
+
// element'i hidden container'da (bağlı) bırakıp vc bağlanınca atomic moveBefore ile
|
|
734
|
+
// doğrudan hidden → vc taşıyoruz; iframe hiç reload olmaz.
|
|
735
|
+
const tryRestore = () => {
|
|
736
|
+
const vcNative = componentInstance.vc?.nativeElement;
|
|
737
|
+
if (!vcNative || !vcNative.isConnected)
|
|
738
738
|
return false;
|
|
739
|
-
|
|
740
|
-
//
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
739
|
+
this.moveInto(vcNative, element);
|
|
740
|
+
// Flag'i moveInto SONRASI sil: fallback removeChild yaparsa disconnectedCallback flag'i hâlâ görsün.
|
|
741
|
+
delete element.__arilPreserveDuringDetach;
|
|
742
|
+
componentInstance.propsUpdated = false;
|
|
743
|
+
console.log('Web component element component view\'a eklendi (retrieve sırasında)');
|
|
744
|
+
return true;
|
|
745
|
+
};
|
|
746
|
+
// Hemen dene (vc genelde bağlı değil) → değilse microtask'te tekrar dene. `outlet.attach()`
|
|
747
|
+
// retrieve'den hemen sonra SENKRON çalışır; microtask geçerli task bitince (attach tamamlanmış,
|
|
748
|
+
// vc bağlı) ama PAINT'ten ÖNCE koşar → element yerine oturur, tab geçişinde boş-flash olmaz.
|
|
749
|
+
if (tryRestore())
|
|
750
|
+
return;
|
|
751
|
+
queueMicrotask(() => {
|
|
752
|
+
if (tryRestore())
|
|
753
|
+
return;
|
|
754
|
+
// Son çare: vc hâlâ bağlı değil. Element'i yine de vc'ye taşı ki tab boş kalmasın
|
|
755
|
+
// (attach view'ı bağlayınca görünür olur — iframe reload olabilir ama eski davranış korunur).
|
|
756
|
+
const vcNative = componentInstance.vc?.nativeElement;
|
|
757
|
+
if (vcNative) {
|
|
758
|
+
this.moveInto(vcNative, element);
|
|
759
|
+
delete element.__arilPreserveDuringDetach;
|
|
760
|
+
componentInstance.propsUpdated = false;
|
|
750
761
|
}
|
|
751
|
-
|
|
762
|
+
else {
|
|
763
|
+
componentInstance.needsRestore = true;
|
|
764
|
+
console.log('Web component element restore edilecek (view hazır değil, ngAfterViewInit\'te tekrar denenecek)');
|
|
765
|
+
}
|
|
766
|
+
});
|
|
752
767
|
}
|
|
753
768
|
catch (error) {
|
|
754
769
|
console.warn('Web component element restore edilirken hata:', error);
|
|
@@ -772,6 +787,61 @@ class CustomRouteReuseStrategy {
|
|
|
772
787
|
}
|
|
773
788
|
return container;
|
|
774
789
|
}
|
|
790
|
+
/**
|
|
791
|
+
* `el`'i `target`'ın son çocuğu olacak şekilde TAŞIR. `moveBefore` (atomic move) destekleniyor ve
|
|
792
|
+
* her iki düğüm de bağlıysa onu kullanır: nested browsing context (iframe) reload OLMADAN ve custom
|
|
793
|
+
* element'in connected/disconnected callback'leri tetiklenmeden taşır → iframe-tabanlı embed'lerin
|
|
794
|
+
* (Superset) auth handshake'i + scroll/filtre state'i korunur. Desteklenmiyorsa veya taşıma kısıtları
|
|
795
|
+
* ihlal edilirse (disconnected / cross-document) removeChild+appendChild'a düşer (eski davranış: iframe
|
|
796
|
+
* reload olur ama işlem güvenli tamamlanır).
|
|
797
|
+
*/
|
|
798
|
+
moveInto(target, el) {
|
|
799
|
+
const mover = target;
|
|
800
|
+
if (typeof mover.moveBefore === 'function' && el.isConnected && target.isConnected) {
|
|
801
|
+
try {
|
|
802
|
+
mover.moveBefore(el, null);
|
|
803
|
+
return;
|
|
804
|
+
}
|
|
805
|
+
catch {
|
|
806
|
+
// moveBefore kısıtları ihlal edildi → aşağıdaki klasik taşımaya düş.
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
if (el.parentNode && el.parentNode !== target) {
|
|
810
|
+
el.parentNode.removeChild(el);
|
|
811
|
+
}
|
|
812
|
+
if (!target.contains(el)) {
|
|
813
|
+
target.appendChild(el);
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
/**
|
|
817
|
+
* `shouldDetach` içinden, Angular `outlet.detach()` çalışmadan ÖNCE çağrılır: canlı outlet'teki MFE
|
|
818
|
+
* element'ini `aril-tab-id` attribute'undan bulup atomic `moveBefore` ile hidden container'a taşır.
|
|
819
|
+
* Böylece Angular wrapper view'ını söktüğünde `<app-xxx>` element'i zaten güvenli/bağlı konumdadır ve
|
|
820
|
+
* barındırdığı iframe reload olmaz. Element bulunamaz ya da zaten hidden container'daysa no-op →
|
|
821
|
+
* `store()` eski yoluyla devreye girer (regresyon yok).
|
|
822
|
+
*/
|
|
823
|
+
preserveLiveElementBeforeDetach(route) {
|
|
824
|
+
try {
|
|
825
|
+
const tabId = this.getTabIdFromRoute(route);
|
|
826
|
+
if (!tabId)
|
|
827
|
+
return;
|
|
828
|
+
const hiddenContainer = this.getHiddenContainer();
|
|
829
|
+
const candidates = document.querySelectorAll(`[aril-tab-id="${tabId}"]`);
|
|
830
|
+
for (const candidate of Array.from(candidates)) {
|
|
831
|
+
const el = candidate;
|
|
832
|
+
if (hiddenContainer.contains(el))
|
|
833
|
+
continue;
|
|
834
|
+
// Fallback removeChild yolunda disconnectedCallback'in destroy'ı atlaması için flag'i taşımadan ÖNCE set et.
|
|
835
|
+
el.__arilPreserveDuringDetach = true;
|
|
836
|
+
this.moveInto(hiddenContainer, el);
|
|
837
|
+
console.log(`[Strategy] pre-detach preserve: <${el.tagName.toLowerCase()}> tab="${tabId}" hidden container'a taşındı`);
|
|
838
|
+
break;
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
catch (error) {
|
|
842
|
+
console.warn('[Strategy] pre-detach preserve hatası:', error);
|
|
843
|
+
}
|
|
844
|
+
}
|
|
775
845
|
/**
|
|
776
846
|
* Detached route view'ı içindeki plugin/MFE custom element'lerini (tag adında `-`
|
|
777
847
|
* bulunan ve `customElements`'a kayıtlı olanları) hidden container'a taşır ve
|