@elliemae/ssf-host 2.23.0 → 2.23.1
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/dist/cjs/host.js +10 -8
- package/dist/esm/host.js +10 -8
- package/dist/public/analytics-object-v1.js.map +1 -1
- package/dist/public/analytics-object-v2.js.map +1 -1
- package/dist/public/application-object-v1.js.map +1 -1
- package/dist/public/application-object-v2.js.map +1 -1
- package/dist/public/autoFill.js.map +1 -1
- package/dist/public/index.html +1 -1
- package/dist/public/init.js.map +1 -1
- package/dist/public/js/emuiSsfHost.a4526c5eda64df08190f.js +3 -0
- package/dist/public/js/emuiSsfHost.a4526c5eda64df08190f.js.br +0 -0
- package/dist/public/js/emuiSsfHost.a4526c5eda64df08190f.js.gz +0 -0
- package/dist/public/js/emuiSsfHost.a4526c5eda64df08190f.js.map +1 -0
- package/dist/public/loan-object-v1.js.map +1 -1
- package/dist/public/loan-object.js.map +1 -1
- package/dist/public/utils.js.map +1 -1
- package/dist/public/v1-guest-v2-host.html +1 -1
- package/dist/public/v2-host-v1-guest.html +1 -1
- package/dist/types/lib/tests/utils.test.d.ts +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/umd/analytics-object-v1.js.map +1 -1
- package/dist/umd/analytics-object-v2.js.map +1 -1
- package/dist/umd/application-object-v1.js.map +1 -1
- package/dist/umd/application-object-v2.js.map +1 -1
- package/dist/umd/autoFill.js.map +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.br +0 -0
- package/dist/umd/index.js.gz +0 -0
- package/dist/umd/index.js.map +1 -1
- package/dist/umd/init.js.map +1 -1
- package/dist/umd/loan-object-v1.js.map +1 -1
- package/dist/umd/loan-object.js.map +1 -1
- package/dist/umd/utils.js.map +1 -1
- package/package.json +3 -3
- package/dist/public/js/emuiSsfHost.6b964dde53916a3845ae.js +0 -3
- package/dist/public/js/emuiSsfHost.6b964dde53916a3845ae.js.br +0 -0
- package/dist/public/js/emuiSsfHost.6b964dde53916a3845ae.js.gz +0 -0
- package/dist/public/js/emuiSsfHost.6b964dde53916a3845ae.js.map +0 -1
package/dist/cjs/host.js
CHANGED
|
@@ -1089,22 +1089,24 @@ class SSFHost {
|
|
|
1089
1089
|
options = {}
|
|
1090
1090
|
} = param;
|
|
1091
1091
|
if (!guestId) throw new Error("id for guest application is required");
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
)
|
|
1096
|
-
|
|
1092
|
+
let instanceId = guestId;
|
|
1093
|
+
if (this.#guests.has(instanceId)) {
|
|
1094
|
+
let counter = 1;
|
|
1095
|
+
while (this.#guests.has(`${guestId}-${counter}`)) {
|
|
1096
|
+
counter += 1;
|
|
1097
|
+
}
|
|
1098
|
+
instanceId = `${guestId}-${counter}`;
|
|
1097
1099
|
}
|
|
1098
1100
|
const { openMode = import_types.OpenMode.Embed, popupWindowFeatures = {} } = options;
|
|
1099
1101
|
const srcUrl = this.#getGuestUrl(url, searchParams);
|
|
1100
1102
|
let guest = null;
|
|
1101
1103
|
this.#startTiming("SSF.Guest.Load", {
|
|
1102
|
-
appId:
|
|
1104
|
+
appId: instanceId,
|
|
1103
1105
|
appUrl: srcUrl
|
|
1104
1106
|
});
|
|
1105
1107
|
if (openMode === import_types.OpenMode.Popup) {
|
|
1106
1108
|
guest = this.#openPopupGuest({
|
|
1107
|
-
guestId,
|
|
1109
|
+
guestId: instanceId,
|
|
1108
1110
|
url: srcUrl,
|
|
1109
1111
|
title,
|
|
1110
1112
|
searchParams,
|
|
@@ -1114,7 +1116,7 @@ class SSFHost {
|
|
|
1114
1116
|
});
|
|
1115
1117
|
} else if (openMode === import_types.OpenMode.Embed) {
|
|
1116
1118
|
guest = this.#openEmbedGuest({
|
|
1117
|
-
guestId,
|
|
1119
|
+
guestId: instanceId,
|
|
1118
1120
|
url: srcUrl,
|
|
1119
1121
|
title,
|
|
1120
1122
|
targetElement,
|
package/dist/esm/host.js
CHANGED
|
@@ -1076,22 +1076,24 @@ class SSFHost {
|
|
|
1076
1076
|
options = {}
|
|
1077
1077
|
} = param;
|
|
1078
1078
|
if (!guestId) throw new Error("id for guest application is required");
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
)
|
|
1083
|
-
|
|
1079
|
+
let instanceId = guestId;
|
|
1080
|
+
if (this.#guests.has(instanceId)) {
|
|
1081
|
+
let counter = 1;
|
|
1082
|
+
while (this.#guests.has(`${guestId}-${counter}`)) {
|
|
1083
|
+
counter += 1;
|
|
1084
|
+
}
|
|
1085
|
+
instanceId = `${guestId}-${counter}`;
|
|
1084
1086
|
}
|
|
1085
1087
|
const { openMode = OpenMode.Embed, popupWindowFeatures = {} } = options;
|
|
1086
1088
|
const srcUrl = this.#getGuestUrl(url, searchParams);
|
|
1087
1089
|
let guest = null;
|
|
1088
1090
|
this.#startTiming("SSF.Guest.Load", {
|
|
1089
|
-
appId:
|
|
1091
|
+
appId: instanceId,
|
|
1090
1092
|
appUrl: srcUrl
|
|
1091
1093
|
});
|
|
1092
1094
|
if (openMode === OpenMode.Popup) {
|
|
1093
1095
|
guest = this.#openPopupGuest({
|
|
1094
|
-
guestId,
|
|
1096
|
+
guestId: instanceId,
|
|
1095
1097
|
url: srcUrl,
|
|
1096
1098
|
title,
|
|
1097
1099
|
searchParams,
|
|
@@ -1101,7 +1103,7 @@ class SSFHost {
|
|
|
1101
1103
|
});
|
|
1102
1104
|
} else if (openMode === OpenMode.Embed) {
|
|
1103
1105
|
guest = this.#openEmbedGuest({
|
|
1104
|
-
guestId,
|
|
1106
|
+
guestId: instanceId,
|
|
1105
1107
|
url: srcUrl,
|
|
1106
1108
|
title,
|
|
1107
1109
|
targetElement,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack://ice.host/analytics-object-v1.js"],"sourcesContent":["export class Analytics extends elli.ssf.ScriptingObject {\n constructor() {\n super('Analytics');\n }\n\n sendBAEvent = (event) => {\n return Promise.resolve();\n }\n\n startTiming = (name, options) => {\n return Promise.resolve(performance.mark(name, { detail: options }));\n }\n\n endTiming = (start, options) => {\n performance.measure(start, {\n detail: options,\n start: start,\n });\n return Promise.resolve();\n }\n}\n"],"mappings":"AAAO,aAAM,kBAAkB,KAAK,IAAI,eAAgB,CACtD,aAAc,CACZ,MAAM,WAAW,CACnB,CAEA,YAAeA,GACN,QAAQ,QAAQ,EAGzB,YAAc,CAACC,EAAMC,IACZ,QAAQ,QAAQ,YAAY,KAAKD,EAAM,CAAE,OAAQC,CAAQ,CAAC,CAAC,EAGpE,UAAY,CAACC,EAAOD,KAClB,YAAY,QAAQC,EAAO,CACzB,OAAQD,EACR,MAAOC,CACT,CAAC,EACM,QAAQ,QAAQ,EAE3B","names":["event","name","options","start"],"
|
|
1
|
+
{"version":3,"sources":["webpack://ice.host/analytics-object-v1.js"],"sourcesContent":["export class Analytics extends elli.ssf.ScriptingObject {\n constructor() {\n super('Analytics');\n }\n\n sendBAEvent = (event) => {\n return Promise.resolve();\n }\n\n startTiming = (name, options) => {\n return Promise.resolve(performance.mark(name, { detail: options }));\n }\n\n endTiming = (start, options) => {\n performance.measure(start, {\n detail: options,\n start: start,\n });\n return Promise.resolve();\n }\n}\n"],"mappings":"AAAO,aAAM,kBAAkB,KAAK,IAAI,eAAgB,CACtD,aAAc,CACZ,MAAM,WAAW,CACnB,CAEA,YAAeA,GACN,QAAQ,QAAQ,EAGzB,YAAc,CAACC,EAAMC,IACZ,QAAQ,QAAQ,YAAY,KAAKD,EAAM,CAAE,OAAQC,CAAQ,CAAC,CAAC,EAGpE,UAAY,CAACC,EAAOD,KAClB,YAAY,QAAQC,EAAO,CACzB,OAAQD,EACR,MAAOC,CACT,CAAC,EACM,QAAQ,QAAQ,EAE3B","names":["event","name","options","start"],"sourceRoot":"","file":"analytics-object-v1.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack://ice.host/analytics-object-v2.js"],"sourcesContent":["export class Analytics extends ice.host.ScriptingObject {\n constructor() {\n super('Analytics');\n }\n\n sendBAEvent = (event) => {\n return Promise.resolve();\n }\n\n startTiming = (name, options) => {\n return Promise.resolve(performance.mark(name, { detail: options }));\n }\n\n endTiming = (start, options) => {\n performance.measure(start, {\n detail: options,\n start: start,\n });\n return Promise.resolve();\n }\n}\n"],"mappings":"AAAO,aAAM,kBAAkB,IAAI,KAAK,eAAgB,CACtD,aAAc,CACZ,MAAM,WAAW,CACnB,CAEA,YAAeA,GACN,QAAQ,QAAQ,EAGzB,YAAc,CAACC,EAAMC,IACZ,QAAQ,QAAQ,YAAY,KAAKD,EAAM,CAAE,OAAQC,CAAQ,CAAC,CAAC,EAGpE,UAAY,CAACC,EAAOD,KAClB,YAAY,QAAQC,EAAO,CACzB,OAAQD,EACR,MAAOC,CACT,CAAC,EACM,QAAQ,QAAQ,EAE3B","names":["event","name","options","start"],"
|
|
1
|
+
{"version":3,"sources":["webpack://ice.host/analytics-object-v2.js"],"sourcesContent":["export class Analytics extends ice.host.ScriptingObject {\n constructor() {\n super('Analytics');\n }\n\n sendBAEvent = (event) => {\n return Promise.resolve();\n }\n\n startTiming = (name, options) => {\n return Promise.resolve(performance.mark(name, { detail: options }));\n }\n\n endTiming = (start, options) => {\n performance.measure(start, {\n detail: options,\n start: start,\n });\n return Promise.resolve();\n }\n}\n"],"mappings":"AAAO,aAAM,kBAAkB,IAAI,KAAK,eAAgB,CACtD,aAAc,CACZ,MAAM,WAAW,CACnB,CAEA,YAAeA,GACN,QAAQ,QAAQ,EAGzB,YAAc,CAACC,EAAMC,IACZ,QAAQ,QAAQ,YAAY,KAAKD,EAAM,CAAE,OAAQC,CAAQ,CAAC,CAAC,EAGpE,UAAY,CAACC,EAAOD,KAClB,YAAY,QAAQC,EAAO,CACzB,OAAQD,EACR,MAAOC,CACT,CAAC,EACM,QAAQ,QAAQ,EAE3B","names":["event","name","options","start"],"sourceRoot":"","file":"analytics-object-v2.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack://ice.host/application-object-v1.js"],"sourcesContent":["export class Application extends elli.ssf.ScriptingObject {\n constructor() {\n super('Application');\n }\n\n keepSessionAlive = () => {\n return Promise.resolve();\n }\n}\n"],"mappings":"AAAO,aAAM,oBAAoB,KAAK,IAAI,eAAgB,CACxD,aAAc,CACZ,MAAM,aAAa,CACrB,CAEA,iBAAmB,IACV,QAAQ,QAAQ,CAE3B","names":[],"
|
|
1
|
+
{"version":3,"sources":["webpack://ice.host/application-object-v1.js"],"sourcesContent":["export class Application extends elli.ssf.ScriptingObject {\n constructor() {\n super('Application');\n }\n\n keepSessionAlive = () => {\n return Promise.resolve();\n }\n}\n"],"mappings":"AAAO,aAAM,oBAAoB,KAAK,IAAI,eAAgB,CACxD,aAAc,CACZ,MAAM,aAAa,CACrB,CAEA,iBAAmB,IACV,QAAQ,QAAQ,CAE3B","names":[],"sourceRoot":"","file":"application-object-v1.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack://ice.host/application-object-v2.js"],"sourcesContent":["export class Application extends ice.host.ScriptingObject {\n constructor() {\n super('Application');\n }\n\n keepSessionAlive = () => {\n return Promise.resolve();\n }\n}\n"],"mappings":"AAAO,aAAM,oBAAoB,IAAI,KAAK,eAAgB,CACxD,aAAc,CACZ,MAAM,aAAa,CACrB,CAEA,iBAAmB,IACV,QAAQ,QAAQ,CAE3B","names":[],"
|
|
1
|
+
{"version":3,"sources":["webpack://ice.host/application-object-v2.js"],"sourcesContent":["export class Application extends ice.host.ScriptingObject {\n constructor() {\n super('Application');\n }\n\n keepSessionAlive = () => {\n return Promise.resolve();\n }\n}\n"],"mappings":"AAAO,aAAM,oBAAoB,IAAI,KAAK,eAAgB,CACxD,aAAc,CACZ,MAAM,aAAa,CACrB,CAEA,iBAAmB,IACV,QAAQ,QAAQ,CAE3B","names":[],"sourceRoot":"","file":"application-object-v2.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack://ice.host/autoFill.js"],"sourcesContent":["import { faker } from 'https://cdn.skypack.dev/@faker-js/faker';\n\nexport const getBorrowerDetails = () => {\n const firstName = faker.name.firstName();\n const lastName = faker.name.lastName();\n const email = faker.internet.email();\n const phone = faker.phone.phoneNumber();\n const address = faker.address.streetAddress();\n const city = faker.address.city();\n const state = faker.address.state();\n const zip = faker.address.zipCode();\n return {\n firstName,\n lastName,\n email,\n phone,\n address,\n city,\n state,\n zip,\n };\n};\n"],"mappings":"AAAA,OAAS,SAAAA,MAAa,0CAEf,aAAM,mBAAqB,IAAM,CACtC,MAAMC,EAAYD,EAAM,KAAK,UAAU,EACjCE,EAAWF,EAAM,KAAK,SAAS,EAC/BG,EAAQH,EAAM,SAAS,MAAM,EAC7BI,EAAQJ,EAAM,MAAM,YAAY,EAChCK,EAAUL,EAAM,QAAQ,cAAc,EACtCM,EAAON,EAAM,QAAQ,KAAK,EAC1BO,EAAQP,EAAM,QAAQ,MAAM,EAC5BQ,EAAMR,EAAM,QAAQ,QAAQ,EAClC,MAAO,CACL,UAAAC,EACA,SAAAC,EACA,MAAAC,EACA,MAAAC,EACA,QAAAC,EACA,KAAAC,EACA,MAAAC,EACA,IAAAC,CACF,CACF","names":["faker","firstName","lastName","email","phone","address","city","state","zip"],"
|
|
1
|
+
{"version":3,"sources":["webpack://ice.host/autoFill.js"],"sourcesContent":["import { faker } from 'https://cdn.skypack.dev/@faker-js/faker';\n\nexport const getBorrowerDetails = () => {\n const firstName = faker.name.firstName();\n const lastName = faker.name.lastName();\n const email = faker.internet.email();\n const phone = faker.phone.phoneNumber();\n const address = faker.address.streetAddress();\n const city = faker.address.city();\n const state = faker.address.state();\n const zip = faker.address.zipCode();\n return {\n firstName,\n lastName,\n email,\n phone,\n address,\n city,\n state,\n zip,\n };\n};\n"],"mappings":"AAAA,OAAS,SAAAA,MAAa,0CAEf,aAAM,mBAAqB,IAAM,CACtC,MAAMC,EAAYD,EAAM,KAAK,UAAU,EACjCE,EAAWF,EAAM,KAAK,SAAS,EAC/BG,EAAQH,EAAM,SAAS,MAAM,EAC7BI,EAAQJ,EAAM,MAAM,YAAY,EAChCK,EAAUL,EAAM,QAAQ,cAAc,EACtCM,EAAON,EAAM,QAAQ,KAAK,EAC1BO,EAAQP,EAAM,QAAQ,MAAM,EAC5BQ,EAAMR,EAAM,QAAQ,QAAQ,EAClC,MAAO,CACL,UAAAC,EACA,SAAAC,EACA,MAAAC,EACA,MAAAC,EACA,QAAAC,EACA,KAAAC,EACA,MAAAC,EACA,IAAAC,CACF,CACF","names":["faker","firstName","lastName","email","phone","address","city","state","zip"],"sourceRoot":"","file":"autoFill.js"}
|
package/dist/public/index.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>Host</title><script src="https://cdn.tailwindcss.com?plugins=forms"></script><script src="https://cdn.mortgagetech.q1.ice.com/pui-diagnostics@3"></script><script defer="defer" src="js/emuiSsfHost.
|
|
1
|
+
<!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>Host</title><script src="https://cdn.tailwindcss.com?plugins=forms"></script><script src="https://cdn.mortgagetech.q1.ice.com/pui-diagnostics@3"></script><script defer="defer" src="js/emuiSsfHost.a4526c5eda64df08190f.js"></script></head><body><header class="bg-indigo-300 h-10 flex place-items-center"><div class="px-2">ICE Mortgage Product</div></header><main class="mx-auto max-w-7xl px-2 sm:px-6 lg:px-8"><div class="min-w-0 flex-1 mt-4"><h1 class="text-2xl font-bold leading-7 text-gray-900 sm:truncate sm:text-3xl sm:tracking-tight">Loan Application</h1></div><div id="successFeedback" class="hidden rounded-md bg-green-50 p-4"><div class="flex"><div class="flex-shrink-0"><svg class="h-5 w-5 text-green-400" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" clip-rule="evenodd"/></svg></div><div class="ml-3"><p class="text-sm font-medium text-green-800">Loan Saved Successfully</p></div></div></div><div id="errorFeedback" class="hidden rounded-md bg-red-50 p-4"><div class="flex"><div class="flex-shrink-0"><svg class="h-5 w-5 text-red-400" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z" clip-rule="evenodd"/></svg></div><div class="ml-3"><h3 class="text-sm font-medium text-red-800">Credit Score is not meeting the requirement</h3></div></div></div><div class="mt-2 sm:grid sm:grid-cols-2 sm:gap-2"><form class="px-2 py-2 space-y-8 divide-y divide-gray-200 bg-gray-50"><div class="space-y-8 divide-y divide-gray-200 sm:space-y-5"><div class="space-y-6 sm:space-y-5"><div><h3 class="text-lg font-medium leading-6 text-gray-900">Personal Information</h3></div><div class="space-y-6 sm:space-y-5"><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="firstName" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">First name</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input name="firstName" id="firstName" autocomplete="given-name" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="John" placeholder="John"/></div></div><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="lastName" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">Last name</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input name="lastName" id="lastName" autocomplete="family-name" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="Doe" placeholder="Doe"/></div></div><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="ssn" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">SSN</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input type="number" name="ssn" id="ssn" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="123456789" placeholder="123456789"/></div></div></div><div><h3 class="text-lg font-medium leading-6 text-gray-900">Loan Information</h3></div><div class="space-y-6 sm:space-y-5"><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="amount" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">Amount</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input type="number" name="amount" id="amount" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="500000" placeholder="500000"/></div></div><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="Term" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">Term (years)</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input type="number" name="term" id="term" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="30" placeholder="30"/></div></div><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><label for="downPayment" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">Down Payment</label><div class="mt-1 sm:col-span-2 sm:mt-0"><input type="number" name="downPayment" id="downPayment" class="block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:max-w-xs sm:text-sm" value="50000" placeholder="50000"/></div></div><div><h3 class="text-lg font-medium leading-6 text-gray-900">Order Services</h3></div><div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 sm:border-gray-200"><div class="mt-1 sm:mt-0"><button id="title" type="button" class="inline-flex items-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-sm font-medium text-white shadow-sm hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 disabled:opacity-50 disabled:cursor-not-allowed focus:ring-offset-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="w-6 h-6"><path fill-rule="evenodd" d="M7.502 6h7.128A3.375 3.375 0 0118 9.375v9.375a3 3 0 003-3V6.108c0-1.505-1.125-2.811-2.664-2.94a48.972 48.972 0 00-.673-.05A3 3 0 0015 1.5h-1.5a3 3 0 00-2.663 1.618c-.225.015-.45.032-.673.05C8.662 3.295 7.554 4.542 7.502 6zM13.5 3A1.5 1.5 0 0012 4.5h4.5A1.5 1.5 0 0015 3h-1.5z" clip-rule="evenodd"/><path fill-rule="evenodd" d="M3 9.375C3 8.339 3.84 7.5 4.875 7.5h9.75c1.036 0 1.875.84 1.875 1.875v11.25c0 1.035-.84 1.875-1.875 1.875h-9.75A1.875 1.875 0 013 20.625V9.375zM6 12a.75.75 0 01.75-.75h.008a.75.75 0 01.75.75v.008a.75.75 0 01-.75.75H6.75a.75.75 0 01-.75-.75V12zm2.25 0a.75.75 0 01.75-.75h3.75a.75.75 0 010 1.5H9a.75.75 0 01-.75-.75zM6 15a.75.75 0 01.75-.75h.008a.75.75 0 01.75.75v.008a.75.75 0 01-.75.75H6.75a.75.75 0 01-.75-.75V15zm2.25 0a.75.75 0 01.75-.75h3.75a.75.75 0 010 1.5H9a.75.75 0 01-.75-.75zM6 18a.75.75 0 01.75-.75h.008a.75.75 0 01.75.75v.008a.75.75 0 01-.75.75H6.75a.75.75 0 01-.75-.75V18zm2.25 0a.75.75 0 01.75-.75h3.75a.75.75 0 010 1.5H9a.75.75 0 01-.75-.75z" clip-rule="evenodd"/></svg> Title</button></div><div class="mt-1 sm:mt-0"><button id="credit" type="button" class="inline-flex items-center rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-sm font-medium text-white shadow-sm hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 disabled:opacity-50 disabled:cursor-not-allowed focus:ring-offset-2"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="w-6 h-6"><path fill-rule="evenodd" d="M2.25 13.5a8.25 8.25 0 018.25-8.25.75.75 0 01.75.75v6.75H18a.75.75 0 01.75.75 8.25 8.25 0 01-16.5 0z" clip-rule="evenodd"/><path fill-rule="evenodd" d="M12.75 3a.75.75 0 01.75-.75 8.25 8.25 0 018.25 8.25.75.75 0 01-.75.75h-7.5a.75.75 0 01-.75-.75V3z" clip-rule="evenodd"/></svg> Credit Score</button></div></div></div></div></div><div class="flex flex-col"><button id="saveLoan" type="button" class="rounded-md border border-transparent bg-indigo-600 px-4 py-2 text-sm font-medium text-white shadow-sm hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2">Save</button></div></form><div id="aside-container" class="flex flex-col gap-4 items-start mt-4 border-2 p-2 rounded-lg border-dashed border-cyan-300 sm:mt-0"></div></div><div id="bottom-container" class="flex flex-col gap-4 items-start mt-4 p-2 sm:mt-0"></div></main><script src="./init.js" type="module"></script></body></html>
|
package/dist/public/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack://ice.host/init.js"],"sourcesContent":["import { Loan } from './loan-object.js';\nimport { Analytics } from './analytics-object-v2.js';\nimport { Application } from './application-object-v2.js';\nimport { getGuestBaseUrl, getHost } from './utils.js';\n\nlet host = null;\nlet loanObj = null;\n\nconst setupCreditService = async () => {\n const baseUrl = await getGuestBaseUrl();\n document.getElementById('credit').addEventListener('click', () => {\n const { id } = host.loadGuest({\n id: 'creditService',\n url: new URL('./creditService.html', baseUrl).href,\n title: 'Credit Service Corp',\n searchParams: { src: new URL('./creditScoreService.js', baseUrl).href },\n targetElement: document.getElementById('bottom-container'),\n options: { fitToContent: true },\n });\n });\n};\n\nconst setupPricingService = async () => {\n const baseUrl = await getGuestBaseUrl();\n const params = {};\n host.loadGuest({\n id: 'pricingService',\n url: new URL('./pricingService.html', baseUrl).href,\n title: 'Pricing Service Corp',\n params,\n targetElement: document.getElementById('aside-container'),\n options: { fitToContent: true },\n });\n};\n\nconst setupLoanValidationService = async () => {\n const baseUrl = await getGuestBaseUrl();\n const params = {};\n host.loadGuest({\n id: 'loanValidation',\n url: new URL('./loanValidation.html', baseUrl).href,\n title: 'Loan Validation Service Corp',\n params,\n targetElement: document.getElementById('bottom-container'),\n options: { fitToContent: true },\n });\n};\n\nconst setupTitleService = async () => {\n const baseUrl = await getGuestBaseUrl();\n const params = {};\n host.loadGuest({\n id: 'titleService',\n url: new URL('./titleService.html', baseUrl).href,\n title: 'Title Service Corp',\n params,\n targetElement: document.getElementById('aside-container'),\n options: { openMode: ice.host.OpenMode.Popup },\n });\n};\n\nconst setupObjects = () => {\n loanObj = new Loan();\n host.addScriptingObject(loanObj);\n const appObj = new Application();\n host.addScriptingObject(appObj);\n};\n\nconst saveLoan = async () => {\n const loanDetails = loanObj.getLoanDetails();\n const results = await host.dispatchEvent({\n event: loanObj.onPreSave,\n eventParams: loanDetails,\n eventOptions: {\n timeout: 1000,\n },\n });\n if (results.some((result) => result === false)) {\n const errorFeedback = document.getElementById('errorFeedback');\n errorFeedback.classList.remove('hidden');\n } else {\n const successFeedback = document.getElementById('successFeedback');\n successFeedback.classList.remove('hidden');\n }\n};\n\nconst init = () => {\n // elli.ssf.setLogLevel(0);\n const analyticsObj = new Analytics();\n host = getHost(analyticsObj);\n setupObjects();\n const saveLoanButton = document.getElementById('saveLoan');\n if (saveLoanButton) saveLoanButton.addEventListener('click', saveLoan);\n setupCreditService();\n setupPricingService();\n setupLoanValidationService();\n document\n .getElementById('title')\n ?.addEventListener?.('click', setupTitleService);\n};\n\nwindow.addEventListener('DOMContentLoaded', init);\n"],"mappings":"AAAA,OAAS,QAAAA,MAAY,mBACrB,OAAS,aAAAC,MAAiB,2BAC1B,OAAS,eAAAC,MAAmB,6BAC5B,OAAS,mBAAAC,EAAiB,WAAAC,MAAe,aAEzC,IAAIC,EAAO,KACPC,EAAU,KAEd,MAAMC,EAAqB,SAAY,CACrC,MAAMC,EAAU,MAAML,EAAgB,EACtC,SAAS,eAAe,QAAQ,EAAE,iBAAiB,QAAS,IAAM,CAChE,KAAM,CAAE,GAAAM,CAAG,EAAIJ,EAAK,UAAU,CAC5B,GAAI,gBACJ,IAAK,IAAI,IAAI,uBAAwBG,CAAO,EAAE,KAC9C,MAAO,sBACP,aAAc,CAAE,IAAK,IAAI,IAAI,0BAA2BA,CAAO,EAAE,IAAK,EACtE,cAAe,SAAS,eAAe,kBAAkB,EACzD,QAAS,CAAE,aAAc,EAAK,CAChC,CAAC,CACH,CAAC,CACH,EAEME,EAAsB,SAAY,CACtC,MAAMF,EAAU,MAAML,EAAgB,EAChCQ,EAAS,CAAC,EAChBN,EAAK,UAAU,CACb,GAAI,iBACJ,IAAK,IAAI,IAAI,wBAAyBG,CAAO,EAAE,KAC/C,MAAO,uBACP,OAAAG,EACA,cAAe,SAAS,eAAe,iBAAiB,EACxD,QAAS,CAAE,aAAc,EAAK,CAChC,CAAC,CACH,EAEMC,EAA6B,SAAY,CAC7C,MAAMJ,EAAU,MAAML,EAAgB,EAChCQ,EAAS,CAAC,EAChBN,EAAK,UAAU,CACb,GAAI,iBACJ,IAAK,IAAI,IAAI,wBAAyBG,CAAO,EAAE,KAC/C,MAAO,+BACP,OAAAG,EACA,cAAe,SAAS,eAAe,kBAAkB,EACzD,QAAS,CAAE,aAAc,EAAK,CAChC,CAAC,CACH,EAEME,EAAoB,SAAY,CACpC,MAAML,EAAU,MAAML,EAAgB,EAChCQ,EAAS,CAAC,EAChBN,EAAK,UAAU,CACb,GAAI,eACJ,IAAK,IAAI,IAAI,sBAAuBG,CAAO,EAAE,KAC7C,MAAO,qBACP,OAAAG,EACA,cAAe,SAAS,eAAe,iBAAiB,EACxD,QAAS,CAAE,SAAU,IAAI,KAAK,SAAS,KAAM,CAC/C,CAAC,CACH,EAEMG,EAAe,IAAM,CACzBR,EAAU,IAAIN,EACdK,EAAK,mBAAmBC,CAAO,EAC/B,MAAMS,EAAS,IAAIb,EACnBG,EAAK,mBAAmBU,CAAM,CAChC,EAEMC,EAAW,SAAY,CAC3B,MAAMC,EAAcX,EAAQ,eAAe,GAC3B,MAAMD,EAAK,cAAc,CACvC,MAAOC,EAAQ,UACf,YAAaW,EACb,aAAc,CACZ,QAAS,GACX,CACF,CAAC,GACW,KAAMC,GAAWA,IAAW,EAAK,EACrB,SAAS,eAAe,eAAe,EAC/C,UAAU,OAAO,QAAQ,EAEf,SAAS,eAAe,iBAAiB,EACjD,UAAU,OAAO,QAAQ,CAE7C,EAEMC,EAAO,IAAM,CAEjB,MAAMC,EAAe,IAAInB,EACzBI,EAAOD,EAAQgB,CAAY,EAC3BN,EAAa,EACb,MAAMO,EAAiB,SAAS,eAAe,UAAU,EACrDA,GAAgBA,EAAe,iBAAiB,QAASL,CAAQ,EACrET,EAAmB,EACnBG,EAAoB,EACpBE,EAA2B,EAC3B,SACG,eAAe,OAAO,GACrB,mBAAmB,QAASC,CAAiB,CACnD,EAEA,OAAO,iBAAiB,mBAAoBM,CAAI","names":["Loan","Analytics","Application","getGuestBaseUrl","getHost","host","loanObj","setupCreditService","baseUrl","id","setupPricingService","params","setupLoanValidationService","setupTitleService","setupObjects","appObj","saveLoan","loanDetails","result","init","analyticsObj","saveLoanButton"],"
|
|
1
|
+
{"version":3,"sources":["webpack://ice.host/init.js"],"sourcesContent":["import { Loan } from './loan-object.js';\nimport { Analytics } from './analytics-object-v2.js';\nimport { Application } from './application-object-v2.js';\nimport { getGuestBaseUrl, getHost } from './utils.js';\n\nlet host = null;\nlet loanObj = null;\n\nconst setupCreditService = async () => {\n const baseUrl = await getGuestBaseUrl();\n document.getElementById('credit').addEventListener('click', () => {\n const { id } = host.loadGuest({\n id: 'creditService',\n url: new URL('./creditService.html', baseUrl).href,\n title: 'Credit Service Corp',\n searchParams: { src: new URL('./creditScoreService.js', baseUrl).href },\n targetElement: document.getElementById('bottom-container'),\n options: { fitToContent: true },\n });\n });\n};\n\nconst setupPricingService = async () => {\n const baseUrl = await getGuestBaseUrl();\n const params = {};\n host.loadGuest({\n id: 'pricingService',\n url: new URL('./pricingService.html', baseUrl).href,\n title: 'Pricing Service Corp',\n params,\n targetElement: document.getElementById('aside-container'),\n options: { fitToContent: true },\n });\n};\n\nconst setupLoanValidationService = async () => {\n const baseUrl = await getGuestBaseUrl();\n const params = {};\n host.loadGuest({\n id: 'loanValidation',\n url: new URL('./loanValidation.html', baseUrl).href,\n title: 'Loan Validation Service Corp',\n params,\n targetElement: document.getElementById('bottom-container'),\n options: { fitToContent: true },\n });\n};\n\nconst setupTitleService = async () => {\n const baseUrl = await getGuestBaseUrl();\n const params = {};\n host.loadGuest({\n id: 'titleService',\n url: new URL('./titleService.html', baseUrl).href,\n title: 'Title Service Corp',\n params,\n targetElement: document.getElementById('aside-container'),\n options: { openMode: ice.host.OpenMode.Popup },\n });\n};\n\nconst setupObjects = () => {\n loanObj = new Loan();\n host.addScriptingObject(loanObj);\n const appObj = new Application();\n host.addScriptingObject(appObj);\n};\n\nconst saveLoan = async () => {\n const loanDetails = loanObj.getLoanDetails();\n const results = await host.dispatchEvent({\n event: loanObj.onPreSave,\n eventParams: loanDetails,\n eventOptions: {\n timeout: 1000,\n },\n });\n if (results.some((result) => result === false)) {\n const errorFeedback = document.getElementById('errorFeedback');\n errorFeedback.classList.remove('hidden');\n } else {\n const successFeedback = document.getElementById('successFeedback');\n successFeedback.classList.remove('hidden');\n }\n};\n\nconst init = () => {\n // elli.ssf.setLogLevel(0);\n const analyticsObj = new Analytics();\n host = getHost(analyticsObj);\n setupObjects();\n const saveLoanButton = document.getElementById('saveLoan');\n if (saveLoanButton) saveLoanButton.addEventListener('click', saveLoan);\n setupCreditService();\n setupPricingService();\n setupLoanValidationService();\n document\n .getElementById('title')\n ?.addEventListener?.('click', setupTitleService);\n};\n\nwindow.addEventListener('DOMContentLoaded', init);\n"],"mappings":"AAAA,OAAS,QAAAA,MAAY,mBACrB,OAAS,aAAAC,MAAiB,2BAC1B,OAAS,eAAAC,MAAmB,6BAC5B,OAAS,mBAAAC,EAAiB,WAAAC,MAAe,aAEzC,IAAIC,EAAO,KACPC,EAAU,KAEd,MAAMC,EAAqB,SAAY,CACrC,MAAMC,EAAU,MAAML,EAAgB,EACtC,SAAS,eAAe,QAAQ,EAAE,iBAAiB,QAAS,IAAM,CAChE,KAAM,CAAE,GAAAM,CAAG,EAAIJ,EAAK,UAAU,CAC5B,GAAI,gBACJ,IAAK,IAAI,IAAI,uBAAwBG,CAAO,EAAE,KAC9C,MAAO,sBACP,aAAc,CAAE,IAAK,IAAI,IAAI,0BAA2BA,CAAO,EAAE,IAAK,EACtE,cAAe,SAAS,eAAe,kBAAkB,EACzD,QAAS,CAAE,aAAc,EAAK,CAChC,CAAC,CACH,CAAC,CACH,EAEME,EAAsB,SAAY,CACtC,MAAMF,EAAU,MAAML,EAAgB,EAChCQ,EAAS,CAAC,EAChBN,EAAK,UAAU,CACb,GAAI,iBACJ,IAAK,IAAI,IAAI,wBAAyBG,CAAO,EAAE,KAC/C,MAAO,uBACP,OAAAG,EACA,cAAe,SAAS,eAAe,iBAAiB,EACxD,QAAS,CAAE,aAAc,EAAK,CAChC,CAAC,CACH,EAEMC,EAA6B,SAAY,CAC7C,MAAMJ,EAAU,MAAML,EAAgB,EAChCQ,EAAS,CAAC,EAChBN,EAAK,UAAU,CACb,GAAI,iBACJ,IAAK,IAAI,IAAI,wBAAyBG,CAAO,EAAE,KAC/C,MAAO,+BACP,OAAAG,EACA,cAAe,SAAS,eAAe,kBAAkB,EACzD,QAAS,CAAE,aAAc,EAAK,CAChC,CAAC,CACH,EAEME,EAAoB,SAAY,CACpC,MAAML,EAAU,MAAML,EAAgB,EAChCQ,EAAS,CAAC,EAChBN,EAAK,UAAU,CACb,GAAI,eACJ,IAAK,IAAI,IAAI,sBAAuBG,CAAO,EAAE,KAC7C,MAAO,qBACP,OAAAG,EACA,cAAe,SAAS,eAAe,iBAAiB,EACxD,QAAS,CAAE,SAAU,IAAI,KAAK,SAAS,KAAM,CAC/C,CAAC,CACH,EAEMG,EAAe,IAAM,CACzBR,EAAU,IAAIN,EACdK,EAAK,mBAAmBC,CAAO,EAC/B,MAAMS,EAAS,IAAIb,EACnBG,EAAK,mBAAmBU,CAAM,CAChC,EAEMC,EAAW,SAAY,CAC3B,MAAMC,EAAcX,EAAQ,eAAe,GAC3B,MAAMD,EAAK,cAAc,CACvC,MAAOC,EAAQ,UACf,YAAaW,EACb,aAAc,CACZ,QAAS,GACX,CACF,CAAC,GACW,KAAMC,GAAWA,IAAW,EAAK,EACrB,SAAS,eAAe,eAAe,EAC/C,UAAU,OAAO,QAAQ,EAEf,SAAS,eAAe,iBAAiB,EACjD,UAAU,OAAO,QAAQ,CAE7C,EAEMC,EAAO,IAAM,CAEjB,MAAMC,EAAe,IAAInB,EACzBI,EAAOD,EAAQgB,CAAY,EAC3BN,EAAa,EACb,MAAMO,EAAiB,SAAS,eAAe,UAAU,EACrDA,GAAgBA,EAAe,iBAAiB,QAASL,CAAQ,EACrET,EAAmB,EACnBG,EAAoB,EACpBE,EAA2B,EAC3B,SACG,eAAe,OAAO,GACrB,mBAAmB,QAASC,CAAiB,CACnD,EAEA,OAAO,iBAAiB,mBAAoBM,CAAI","names":["Loan","Analytics","Application","getGuestBaseUrl","getHost","host","loanObj","setupCreditService","baseUrl","id","setupPricingService","params","setupLoanValidationService","setupTitleService","setupObjects","appObj","saveLoan","loanDetails","result","init","analyticsObj","saveLoanButton"],"sourceRoot":"","file":"init.js"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
(function(I,O){typeof exports=="object"&&typeof module=="object"?module.exports=O():typeof define=="function"&&define.amd?define([],O):typeof exports=="object"?exports.ice=O():(I.ice=I.ice||{},I.ice.host=O())})(globalThis,()=>(()=>{"use strict";var j={};j.d=(n,e)=>{for(var t in e)j.o(e,t)&&!j.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:e[t]})},j.o=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),j.r=n=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})};var I={};j.r(I),j.d(I,{Event:()=>O,Guest:()=>q,IFrameSandboxValues:()=>S,OpenMode:()=>f,SANDBOX_DEFAULT:()=>N,SSFHost:()=>ie,ScriptingObject:()=>U});class O{name;objectId;id;constructor(e){const{name:t,objectId:i}=e;if(!t)throw new Error("Event name is required");if(!i)throw new Error("Scripting object id is required");this.objectId=i,this.name=t,this.id=`${this.objectId}.${this.name}`.toLowerCase()}}class A{static[Symbol.hasInstance](e){return typeof e=="object"&&e!==null&&"getType"in e&&typeof e.getType=="function"&&e.getType()==="ProxyEvent"}#t;objectId;name;id;getType(){return"ProxyEvent"}constructor(e){const{name:t,objectId:i,eventSrc:s}=e;if(!t)throw new Error("Event name is required");if(!i)throw new Error("Scripting object id is required");if(!s)throw new Error("Event source is required");this.objectId=i,this.name=t,this.#t=s,this.id=`${this.objectId}.${this.name}`.toLowerCase()}subscribe=e=>this.#t.subscribe({eventId:this.id,callback:e});unsubscribe=e=>{this.#t.unsubscribe({eventId:this.id,token:e})}}const W=n=>n instanceof O,se=(n,e)=>`${n.toLowerCase()}.${e.toLowerCase()}`,H="function",F=(n,e)=>typeof n===H&&!!e&&!e.startsWith("_");class U{#t;#i="Object";constructor(e,t){this.#t=e,this.#i=t||this.#i}get id(){return this.#t}get objectType(){return this.#i}_toJSON=()=>{const e=[],t=[];return Object.keys(this).forEach(i=>{const s=this[i];W(s)?t.push(i):F(s,i)&&e.push(i)}),{objectId:this.#t,objectType:this.#i,functions:e,events:t}};_dispose=()=>{};dispose=()=>{}}var l=(n=>(n.GuestClose="guest:close",n.GuestEventSubscribe="guest:eventSubscribe",n.GuestEventUnsubscribe="guest:eventUnsubscribe",n.GuestFocus="guest:focus",n.GuestReady="guest:ready",n.GuestReadyComplete="guest:readyComplete",n.GuestResize="guest:resize",n.HandShake="handshake",n.HandShakeAck="handshake:ack",n.HostClose="host:close",n.HostConfig="host:config",n.ListObjects="list:objects",n.ObjectEvent="object:event",n.ObjectGet="object:get",n.ObjectInvoke="object:invoke",n))(l||{}),f=(n=>(n.Popup="popup",n.Embed="embed",n))(f||{}),S=(n=>(n.AllowDownloadsWithoutUserActivation="allow-downloads-without-user-activation",n.AllowDownloads="allow-downloads",n.AllowForms="allow-forms",n.AllowModals="allow-modals",n.AllowOrientationLock="allow-orientation-lock",n.AllowPointerLock="allow-pointer-lock",n.AllowPopups="allow-popups",n.AllowPopupsToEscapeSandbox="allow-popups-to-escape-sandbox",n.AllowPresentation="allow-presentation",n.AllowSameOrigin="allow-same-origin",n.AllowScripts="allow-scripts",n.AllowStorageAccessByUserActivation="allow-storage-access-by-user-activation",n.AllowTopNavigation="allow-top-navigation",n.AllowTopNavigationByUserActivation="allow-top-navigation-by-user-activation",n))(S||{});const J=n=>{if(n==="about:blank")return"*";try{const{origin:e}=new URL(n);return e==="null"||!e?n:e}catch{const{origin:t}=new URL(n,document.baseURI);return t}},Y=n=>n.flat(1/0).filter(e=>e!==void 0);function R(n){return typeof n=="function"}class q{id;title;url;searchParams;domElement;window;openMode;origin;initialized=!1;ready=!1;capabilities;#t;#i;constructor(e){const{guestId:t,domElement:i=null,title:s,url:o,window:r,searchParams:c={},openMode:a=f.Embed,remoting:d,analyticsObj:u}=e;this.id=t,this.title=s,this.url=o,this.origin=J(o),this.searchParams=c,this.domElement=i,this.window=r,this.openMode=a,this.capabilities={},this.#i=u,this.#t=d}dispose=()=>{if(this.openMode===f.Popup&&!this.window.closed)try{this.window.document,this.window.close()}catch{this.#t.send({targetWin:this.window,targetOrigin:this.origin,messageType:l.HostClose,messageBody:{}})}else this.domElement?.remove?.();this.#t.removeSender({origin:this.origin,window:this.window})};getInfo=()=>({guestId:this.id,guestTitle:this.title,guestUrl:this.url});handShake=()=>new Promise(e=>{let t=0;const i=5;let s;const o=()=>{clearInterval(s),this.#t.unlisten({messageType:l.HandShakeAck,callback:o}),e(!0)};s=setInterval(()=>{t>=i?(clearInterval(s),this.#t.unlisten({messageType:l.HandShakeAck,callback:o}),e(!1)):(this.#t.send({targetWin:this.window,targetOrigin:this.origin,messageType:l.HandShake,messageBody:{}}),t+=1)},1e3),this.#t.listen({messageType:l.HandShakeAck,callback:o})});init=()=>{this.#t.addSender({origin:this.origin,window:this.window}),this.openMode===f.Popup&&this.handShake().catch(()=>{})};dispatchEvent=(e,t)=>(this.#i.startTiming(`ScriptingObject.Event.${e.object.objectId}.${e.eventName}`,{appId:this.id,appUrl:this.url}).catch(()=>{}),this.#t.invoke({targetWin:this.window,targetOrigin:this.origin,messageType:l.ObjectEvent,messageBody:e,responseTimeoutMs:t}).finally(()=>{this.#i.endTiming(`ScriptingObject.Event.${e.object.objectId}.${e.eventName}`,{appId:this.id,appUrl:this.url}).catch(()=>{})}));send=e=>{this.#t.send({targetWin:this.window,targetOrigin:this.origin,...e})}}const _={randomUUID:typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};let P;const X=new Uint8Array(16);function K(){if(!P&&(P=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!P))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return P(X)}var Q;const h=[];for(let n=0;n<256;++n)h.push((n+256).toString(16).slice(1));function L(n,e=0){return h[n[e+0]]+h[n[e+1]]+h[n[e+2]]+h[n[e+3]]+"-"+h[n[e+4]]+h[n[e+5]]+"-"+h[n[e+6]]+h[n[e+7]]+"-"+h[n[e+8]]+h[n[e+9]]+"-"+h[n[e+10]]+h[n[e+11]]+h[n[e+12]]+h[n[e+13]]+h[n[e+14]]+h[n[e+15]]}function oe(n,e=0){const t=L(n,e);if(!Q(t))throw TypeError("Stringified UUID is invalid");return t}const re=null;function Z(n,e,t){if(_.randomUUID&&!e&&!n)return _.randomUUID();n=n||{};const i=n.random||(n.rng||K)();if(i[6]=i[6]&15|64,i[8]=i[8]&63|128,e){t=t||0;for(let s=0;s<16;++s)e[t+s]=i[s];return e}return L(i)}const M=Z,C="elli:remoting",x="elli:remoting:response",D="elli:remoting:exception",$=({messageType:n,messageBody:e,requestId:t,onewayMsg:i=!1})=>({requestId:t??(i?null:M()),source:C,type:n,body:e}),ce=n=>{const{targetWin:e,targetOrigin:t,messageType:i,messageBody:s}=n,o=$({messageType:i,messageBody:s});e.postMessage(o,t)};class V{#t;#i;#e=new Map;#n=new Map;#s=null;#o=null;#r=new Map;constructor(e,t){if(!e)throw new Error("logger is required");if(!t)throw new Error("correlationId is required");this.#t=t,this.#i=e}#l=()=>{this.#s=null;const e=Date.now(),t=[];let i=null;if(this.#n.forEach((s,o)=>{const{requestId:r,cancelTime:c}=s;c&&c<=e?(this.#i.debug(`Detected response timeout for requestId: ${r}...`),t.push(o),s.resolve(void 0)):c&&(i=i===null?c:Math.min(i,c))}),t.forEach(s=>{this.#n.delete(s)}),i!==null){const s=Math.max(i-Date.now(),0);this.#c(s)}};#c=e=>{this.#s===null&&(this.#s=window.setTimeout(this.#l,e))};#h=()=>{this.#s!==null&&(window.clearTimeout(this.#s),this.#s=null)};#a=e=>{const t=this.#n.get(e);return this.#i.debug(`serving requestId: ${e}`),this.#n.delete(e),t};#g=e=>{const{requestId:t}=e;this.#i.debug(`Response received for invocation requestId: ${t}`);const i=this.#a(t);return i?(i.resolve(e.body),!0):(this.#i.debug(`Received response to stale/invalid request with requestId: ${t}`),!1)};#p=e=>{this.#i.debug(`Exception received for invocation (requestId = ${e.requestId})`);const t=this.#a(e.requestId);return t?(t.reject(new Error(e.body)),!0):(this.#i.warn(`Received exception for stale/invalid request (requestId = ${e.requestId})`),!1)};#m=({sourceWin:e,sourceOrigin:t,message:i})=>{this.#i.debug(`Received message of type "${i.type}"`);const s=this.#e.get(i.type);return s?(s.forEach(o=>{this.#i.debug(`Invoking message handler ${o.name}`),o({sourceWin:e,sourceOrigin:t,requestId:i.requestId,type:i.type,body:i.body})}),!0):!1};#u=e=>{if(this.#r.size===0||!e.source)return!1;const t=this.#r.get(e.source);return!t||e?.data?.source!==C?!1:(this.#i.debug(`Remoting: Received message of type "${e.data.type}"`),e.data.type===x?this.#g(e.data):e.data.type===D?this.#p(e.data):this.#m({sourceWin:e.source,sourceOrigin:t,message:e.data}),!0)};addSender=e=>{const{origin:t,window:i}=e;if(!t)throw new Error("origin is required");if(!i)throw new Error("window is required");this.#r.set(i,t)};initialize=e=>{this.#o&&this.#o.removeEventListener("message",this.#u),e.addEventListener("message",this.#u),this.#o=e,this.#i.debug(`initialized remoting id: ${this.#t}`)};close=()=>{this.#o&&(this.#o.removeEventListener("message",this.#u),this.#o=null),this.#h(),this.#i.debug(`closed remoting id: ${this.#t}`)};invoke=e=>{const{targetWin:t,targetOrigin:i,messageType:s,messageBody:o,responseTimeoutMs:r}=e;return new Promise((c,a)=>{const d=$({messageType:s,messageBody:o});this.#n.set(d.requestId,{requestId:d.requestId,resolve:c,reject:a,cancelTime:r?Date.now()+r:null}),t.postMessage(d,i);const{requestId:u}=d;this.#i.debug(`Posted invocation message of type ${s} requestId: ${u||""}`),r&&(this.#i.debug(`scheduling timeout check for requestId: ${u||""} in ${r} ms`),this.#c(r))})};listen=e=>{const{messageType:t,callback:i}=e,s=this.#e.get(t)||[];s.push(i),this.#e.set(t,s)};unlisten=e=>{const{messageType:t,callback:i}=e,s=this.#e.get(t);if(!s)return;const o=s.indexOf(i);o!==-1&&s.splice(o,1)};send=e=>{const{targetWin:t,targetOrigin:i,messageType:s,messageBody:o}=e,r=$({messageType:s,messageBody:o,onewayMsg:!0});t.postMessage(r,i),this.#i.debug(`Posted one-way message of type "${s}"`)};removeSender=e=>{const{window:t}=e;t&&this.#r.delete(t)};respond=e=>{const{targetWin:t,targetOrigin:i,requestId:s,response:o}=e,r=$({messageType:x,messageBody:o,requestId:s});t.postMessage(r,i),this.#i.debug(`Response sent to caller for invocation requestId: ${s}`)};raiseException=e=>{const{targetWin:t,targetOrigin:i,requestId:s,ex:o}=e,r=o instanceof Error?o.message:o,c=$({messageType:D,messageBody:r,requestId:s});t.postMessage(c,i),this.#i.debug(`Exception sent to caller for invocation. requestId: ${s}`)}}const z="module";var ee=(n=>(n.USER="USER",n.PARTNER="PARTNER",n))(ee||{});class te{#t=e=>e.trim().toLowerCase();#i=new Map;#e=new Map;#n=e=>{const{so:t,guestId:i}=e,s=this.#t(t.id),o=this.#e.get(i);if(!o)this.#e.set(i,new Map([[s,e]]));else{if(o.has(s))throw new Error(`Scripting Object ${t.id} already exists for guest ${i}`);o.set(s,e)}};#s=({so:e})=>{if(e._dispose&&typeof e._dispose=="function")try{e._dispose()}catch{}};#o=({objectId:e,guestId:t})=>{if(e===z&&!t)for(const[,s]of this.#e){const o=s.get(e);if(o)return o}const i=t?this.#e.get(t):null;return i?i.get(e)??null:null};#r=({objectId:e,guestId:t}={})=>{if(t){if(!e){const s=this.#e.get(t);s&&s.forEach(this.#s),this.#e.delete(t);return}const i=this.#e.get(t);if(i){const s=i.get(e);s&&this.#s(s),i.delete(e)}}else e&&this.#e.forEach(i=>{const s=i.get(e);s&&this.#s(s),i.delete(e)})};addScriptingObject=(e,t)=>{const{guestId:i}=t||{};if(!e?.id||!e?._toJSON)throw new Error("Object is not derived from ScriptingObject");const s=this.#t(e.id);if(s===z&&!i)throw new Error("Guest id is required to add Module scripting object");if(i){this.#n({so:e,...t,guestId:i});return}if(this.#i.has(s))throw new Error(`Scripting Object ${e.id} already exists`);this.#i.set(s,{so:e,...t})};getObject=(e,t)=>{const i=this.#t(e);let s=this.#o({objectId:i,guestId:t?.id});s=s??this.#i.get(i)??null;const{so:o}=s||{};return o||null};has=(e,t)=>this.getObject(e,t)!==null;listScriptingObjects=e=>{const t=new Set(this.#i.keys()),i=this.#e.get(e);if(i)for(const s of i.keys())t.add(s);return Array.from(t)};removeScriptingObject=(e,t)=>{const i=this.#t(e);if(t)this.#r({objectId:i,guestId:t});else{this.#r({objectId:i});const s=this.#i.get(i);s&&this.#s(s),this.#i.delete(i)}};removeAllScriptingObjects=e=>{e?this.#r({guestId:e}):(this.#i.forEach(this.#s),this.#i.clear())}}class ae{__TYPE__="Proxy";id;objectType;constructor(e,t){this.id=e,this.objectType=t}}const B=n=>n?.constructor?.name==="Proxy"||n?.constructor?.name==="ScriptingObjectProxy"||n?.__TYPE__==="Proxy",N=[S.AllowScripts,S.AllowPopups,S.AllowModals,S.AllowForms,S.AllowDownloads,S.AllowSameOrigin];class ie{hostId;#t;#i;#e;#n;#s=new Map;#o=new Map;#r=new Map;#l=new Map;#c;#h=null;#a=null;#g=null;#p=null;constructor(e,t){if(this.hostId=e,!t?.logger)throw new Error("Logger is required");if(!t?.analyticsObj)throw new Error("Analytics object is required");if(this.#e=t.logger,this.#n=t.analyticsObj,this.#i=M(),this.#t=new V(this.#e,this.#i),t?.readyStateCallback&&typeof t?.readyStateCallback!="function")throw new Error("readyStateCallback must be a function");this.#h=t?.readyStateCallback||null,this.#g=t?.onGuestEventSubscribe||null,this.#p=t?.onGuestEventUnsubscribe||null,this.#c=new te,this.#t.initialize(window),this.#_(),window.addEventListener("beforeunload",this.#f),this.#e.debug(`host is initialized. hostId: ${this.hostId}, correlationId: ${this.#i}`)}#m=(e,t)=>{const i={event:e,...t};this.#n.sendBAEvent(i).catch(s=>{this.#e.debug(`Analytics sendBAEvent failed: ${s.message}`)})};#u=(e,t)=>{this.#n.startTiming(e,t).catch(i=>{this.#e.debug(`Analytics startTiming failed: ${i.message}`)})};#b=(e,t)=>{this.#n.endTiming(e,t).catch(i=>{this.#e.debug(`Analytics endTiming failed: ${i.message}`)})};#f=()=>{Array.from(this.#s.values()).filter(t=>t.openMode===f.Popup).map(t=>t.id).forEach(t=>this.unloadGuest(t))};#d=e=>this.#o.get(e);#O=e=>this.#r.get(e)??null;#S=e=>typeof e?._toJSON=="function";#v=(e,t)=>this.#S(e)?(this.#c.has(e?.id,t)||this.#c.addScriptingObject(e,t?{guestId:t?.id}:{}),{type:"object",object:e._toJSON()}):{type:"value",value:e};#B=e=>typeof e=="string"?e:e instanceof Error?e.message:"An unexpected error occurred in the host application";#y=e=>{e.ready&&this.#t.send({targetWin:e.window,targetOrigin:e.origin,messageType:l.HostConfig,messageBody:{logLevel:this.#e.getLogLevel(),...e.getInfo()}})};#I=({guest:e,obj:t,functionName:i,functionParams:s})=>{const o=t[i];return R(o)?(this.#e.debug(`Invoking host implementation of ${t.id}.${String(i)}()`),new Promise(r=>{Object.defineProperty(o,"callContext",{value:{guest:e},configurable:!0,enumerable:!0,writable:!0}),r(o(...s))})):(this.#e.warn(`Attempt to call invalid function on object type ${t.objectType}: ${String(i)}`),Promise.reject(new Error(`Method '${i}' not found in Scripting Object '${t.id}'`)))};#E=({sourceWin:e,sourceOrigin:t,requestId:i})=>{const s=this.#d(e);if(!s){this.#e.warn(`Received ready event for unknown guest. requestId: ${i}`);return}if(!s.initialized){this.#e.warn("Guest must be initialized before it is marked as ready"),this.#t.raiseException({targetWin:e,targetOrigin:t,requestId:i,ex:"Guest must be initialized before it is marked as ready"});return}if(!s.ready){s.ready=!0;const o=s.getInfo();this.#b("SSF.Guest.Load",{appId:o.guestId,appUrl:o.guestUrl}),this.#y(s),this.#h?.(s),this.#e.audit({message:"Guest is ready",...o})}};#$=({sourceWin:e,sourceOrigin:t,requestId:i,body:s})=>{const o=this.#d(e);if(!o){this.#e.warn(`Received ready event for unknown guest. requestid = ${i}`);return}o.initialized||(o.initialized=!0,o.capabilities=s||{},this.#e.audit({message:"Guest is initialized",...o.getInfo()})),(!s||!s.onReady)&&this.#E({sourceWin:e,sourceOrigin:t,requestId:i,type:"",body:null})};#k=async({sourceWin:e})=>{if(e?.window){const t=this.#w(e);t&&!await t.handShake()&&this.unloadGuest(e)}};#P=({sourceWin:e,sourceOrigin:t,requestId:i})=>{this.#e.debug(`Processing listObjects request. requestId = ${i}`);const s=this.#d(e);if(!s)return this.#e.warn("Rejected object request from unknown guest window"),!1;const o=this.#c.listScriptingObjects(s.id);return this.#t.respond({targetWin:e,targetOrigin:t,requestId:i,response:o}),this.#e.audit({message:"name of scripting objects returned",requestId:i,objects:o,...s.getInfo()}),!0};#T=({sourceWin:e,sourceOrigin:t,requestId:i,body:s})=>{const{objectId:o}=s;this.#e.debug(`Processing getObject request for object ${o}. requestId = ${i}`);const r=this.#d(e);if(!r)return this.#e.warn("Rejected object request from unknown guest window"),!1;const c=this.getScriptingObject(o,{guest:r});return c?(this.#t.respond({targetWin:e,targetOrigin:t,requestId:i,response:this.#v(c,r)}),this.#e.audit({message:"Scripting Object returned",requestId:i,scriptingObject:o,...r.getInfo()}),!0):(this.#e.warn(`unknown or unauthorized object ${o} from guest ${r.id}`),this.#t.raiseException({targetWin:e,targetOrigin:t,requestId:i,ex:`The requested object (${o}) is not available`}),!1)};#G=({sourceWin:e,requestId:t,body:i})=>{const{eventId:s,criteria:o,token:r}=i;this.#e.debug(`Processing guest event subscribe request for event ${s}. requestId = ${t}`);const c=this.#d(e);if(!c){this.#e.warn("Rejected event subscribe request from unknown guest window");return}setTimeout(()=>{try{this.#g?.({guestId:c.id,eventId:s,criteria:o,token:r})}catch(a){this.#e.warn(`Error in onGuestEventSubscribe callback for event ${s}: ${a.message}`)}},0)};#A=({sourceWin:e,requestId:t,body:i})=>{const{eventId:s,token:o}=i;this.#e.debug(`Processing guest event unsubscribe request for event ${s}. requestId = ${t}`);const r=this.#d(e);if(!r){this.#e.warn("Rejected event unsubscribe request from unknown guest window");return}setTimeout(()=>{try{this.#p?.({guestId:r.id,eventId:s,token:o})}catch(c){this.#e.warn(`Error in onGuestEventUnsubscribe callback for event ${s}: ${c.message}`)}},0)};#U=({sourceWin:e,requestId:t,body:i})=>{const s=this.#d(e);if(!s){this.#e.warn(`Received resize event from unknown guest. requestid = ${t}`);return}s.domElement&&(s.domElement.style.height=`${i.height}px`),this.#e.debug(`Guest ${s.id} resized to ${i.width}x${i.height}`)};#R=({sourceWin:e,sourceOrigin:t,requestId:i,body:s})=>{const{objectId:o}=s,r=this.#d(e);if(!r)return this.#e.warn("Rejected method invocation request from unknown guest window"),!1;this.#e.debug(`Function ${o}.${String(s.functionName)}() called from guest "${r.id}" (requestId = ${i})`);const c=this.getScriptingObject(o,{guest:r});if(!c)return this.#e.warn(`Invocation of unknown or unauthorized object ${o} from guest ${r.id}`),this.#t.raiseException({targetWin:e,targetOrigin:t,requestId:i,ex:`The requested object (${o}) is not available`}),!1;const a=r.getInfo();return this.#u(`ScriptingObject.API.${o}.${s.functionName}`,{appId:a.guestId,appUrl:a.guestUrl}),this.#I({guest:r,obj:c,functionName:s.functionName,functionParams:s.functionParams}).then(d=>{this.#t.respond({targetWin:e,targetOrigin:t,requestId:i,response:this.#v(d,r)}),this.#e.audit({message:"Value returned for Scripting Object method call",requestId:i,scriptingObject:o,scriptingMethod:s.functionName,...a})}).catch(d=>{this.#t.raiseException({targetWin:e,targetOrigin:r.origin,requestId:i,ex:d}),this.#e.audit({message:"Exception thrown for Scripting Object method call",requestId:i,scriptingObject:o,scriptingMethod:s.functionName,...a})}).finally(()=>{this.#b(`ScriptingObject.API.${o}.${s.functionName}`,{appId:a.guestId,appUrl:a.guestUrl})}),!0};#q=()=>{this.#t.listen({messageType:l.GuestResize,callback:this.#U})};#_=()=>{this.#t.listen({messageType:l.GuestReady,callback:this.#$}),this.#t.listen({messageType:l.GuestReadyComplete,callback:this.#E}),this.#t.listen({messageType:l.GuestClose,callback:this.#k}),this.#t.listen({messageType:l.ListObjects,callback:this.#P}),this.#t.listen({messageType:l.ObjectGet,callback:this.#T}),this.#t.listen({messageType:l.ObjectInvoke,callback:this.#R}),this.#t.listen({messageType:l.GuestEventSubscribe,callback:this.#G}),this.#t.listen({messageType:l.GuestEventUnsubscribe,callback:this.#A})};#L=e=>e instanceof A||typeof e?.subscribe=="function";#j=e=>{const t=new q({...e,remoting:this.#t,analyticsObj:this.#n});return t.init(),this.#s.set(e.guestId,t),this.#o.set(t.window,t),this.#r.set(t.url,t),t};#w=e=>{if(typeof e=="string")return this.#s.get(e);const t=this.#o.get(e);return t||Array.from(this.#s.values()).find(i=>i.domElement===e)};#M=()=>{this.#a||(this.#a=setInterval(()=>{const e=[];this.#s.forEach(t=>{t.openMode===f.Popup&&t.window.closed&&e.push(t)}),e.forEach(t=>{const{id:i}=t;this.unloadGuest(i),this.#l.get(i)?.forEach(o=>{Promise.resolve(o({id:i})).catch(()=>{})})})},1e3))};#C=()=>{if(!this.#a)return;Array.from(this.#s.values()).some(t=>t.openMode===f.Popup)||(clearInterval(this.#a),this.#a=null)};#x=e=>{const{url:t,title:i,popupWindowFeatures:s={},searchParams:o,guestId:r,onLoad:c,onError:a}=e,{width:d=800,height:u=600,top:y=100,left:E=100}=s;let g=this.#O(t);if(g)g.window.closed||g.send({messageType:l.GuestFocus,messageBody:{}});else{const w=Object.entries({width:d,height:u,top:y,left:E}).filter(([,b])=>b).map(([b,p])=>`${b}=${p}`).join(","),m=window.open(t,i,`popup, ${w}`);if(m)setTimeout(()=>{try{c?.(r)}catch(b){this.#e.debug(`Error occurred in onLoad for guest with id '${r}': ${b.message}`)}},0);else throw setTimeout(()=>{try{a?.(r)}catch(b){this.#e.debug(`Error occurred in onError for guest with id '${r}': ${b.message}`)}},0),new Error("Failed to open guest application in popup window");m.opener=null,g=this.#j({guestId:r,window:m,title:i,url:t,searchParams:o,openMode:f.Popup}),this.#M()}return g};#D=e=>{const{url:t,title:i,targetElement:s,searchParams:o,guestId:r,onLoad:c,onError:a,options:d={}}=e,u=s.ownerDocument??document,{fitToContent:y=!1,disableSandbox:E=!1,sandboxValues:g=[],customSandboxValues:w=[],style:m="",permissionPolicy:b=""}=d;if(!i)throw new Error("title is required");y&&this.#q();const p=u.createElement("iframe");p.setAttribute("id",r);const T=()=>{setTimeout(()=>{try{c?.(r)}catch(G){this.#e.debug(`Error occurred in onLoad for guest with id '${r}': ${G.message}`)}},0),this.#e.debug(`frame loaded for guest with id '${r}'`),p.removeEventListener("load",T)},v=()=>{setTimeout(()=>{try{a?.(r)}catch(G){this.#e.debug(`Error occurred in onError for guest with id '${r}': ${G.message}`)}},0),this.#e.error(`frame load failed for guest with id '${r}'`),p.removeEventListener("error",v)};p.addEventListener("load",T),p.addEventListener("error",v),p.setAttribute("style",`min-width: 100%; height: 100%; border: 0px; ${m}`),E||p.setAttribute("sandbox",w.length>0?w.join(" "):[...N,...g].join(" ")),p.setAttribute("title",i),p.setAttribute("src",t),b&&p.setAttribute("allow",b),s.appendChild(p);const k=u.getElementById(r);return this.#j({guestId:r,domElement:k,window:k.contentWindow,title:i,url:t,searchParams:o,openMode:f.Embed})};#z=(e,t)=>{let i="";return Object.keys(t).forEach(s=>{i+=`${(i.length?"&":"")+encodeURIComponent(s)}=${encodeURIComponent(t[s])}`}),e+(i?(e.indexOf("?")>=0?"&":"?")+i:"")};addScriptingObject=(e,t)=>{if(B(e)){const i=this.cloneScriptingObject(e);this.#c.addScriptingObject(i,t)}else this.#c.addScriptingObject(e,t)};cloneScriptingObject=e=>{if(!e)throw new Error("proxy is required");const t=new U(e.id,e.objectType);let i=[];return Object.keys(e).forEach(s=>{const o=e[s];if(this.#L(o)){const r=new O({name:o.name||s,objectId:t.id});if(Object.defineProperty(t,s,{value:r,enumerable:!0}),o instanceof A){const c=({eventParams:d,eventOptions:u})=>this.dispatchEvent({event:r,eventParams:d,eventOptions:u}),a=o.subscribe(c);i.push(()=>{o.unsubscribe(a)})}else{const c=o.subscribe?.((a,d,u)=>this.dispatchEvent({event:r,eventParams:d,eventOptions:u}));i.push(()=>{o.unsubscribe?.(c)})}}else if(R(o)&&(Object.defineProperty(t,s,{value:async(...r)=>{const c=await o(...r);return B(c)?this.cloneScriptingObject(c):c},enumerable:!0}),s==="dispose")){const r=t.dispose;Object.defineProperty(t,s,{value:()=>(t._dispose(),r.apply(t)),enumerable:!0})}}),t._dispose=()=>{i.forEach(s=>{s?.()}),i=[]},t};close=()=>{this.#a&&(clearInterval(this.#a),this.#a=null),this.#f(),this.#t.close(),window.removeEventListener("beforeunload",this.#f),this.#e.debug(`host is closed. hostId: ${this.hostId}, correlationId: ${this.#i}`)};dispatchEvent=async e=>{const{event:{id:t,name:i},eventParams:s,eventOptions:o={}}=e,{eventHandler:r=null,timeout:c=null,window:a=null,guestId:d}=o,u=t.split(".")[0],y=d||a,E=y?this.#w(y):null,g=E?this.getScriptingObject(u,{guest:E}):this.getScriptingObject(u);if(!g)return this.#e.warn(`Attempt to dispatch event ${i} on unknown object ${u}`),Promise.resolve([]);const w={object:g._toJSON(),eventName:i,eventParams:s,eventHandler:r,eventOptions:{allowsFeedback:!1}};c&&!Number.isNaN(c)&&(w.eventOptions={allowsFeedback:!0,timeout:Number(c)});const m=[];let b=!1;const p=v=>{const k=v.getInfo();c&&v?.capabilities?.eventFeedback?(m.push(v.dispatchEvent(w,c)),b||(this.#u(`ScriptingObject.Event.${g.id}.${i}`,{appId:this.hostId,appUrl:window.location.href}),b=!0),this.#e.audit({message:"Event dispatched and awaiting feedback",scriptingEventId:t,...k})):(v.send({messageType:l.ObjectEvent,messageBody:w}),this.#e.audit({message:"Event dispatched",scriptingEventId:t,...k}))};return E?p(E):this.#s.forEach(p),await Promise.all(m).then(v=>(this.#e.audit({message:"Event feedback received",scriptingEventId:t}),Y(v))).catch(v=>{throw this.#e.error({message:"Error processing event",eventId:t,exception:v}),v}).finally(()=>{b&&this.#b(`ScriptingObject.Event.${g.id}.${i}`,{appId:this.hostId,appUrl:window.location.href})})};getGuests=()=>Array.from(this.#s.values());getScriptingObject=(e,t)=>this.#c.getObject(e,t?.guest);loadGuest=e=>{const{id:t,url:i,targetElement:s,title:o,searchParams:r={},onLoad:c,onError:a,options:d={}}=e;if(!t)throw new Error("id for guest application is required");let u=t;if(this.#s.has(u)){let m=1;for(;this.#s.has(`${t}-${m}`);)m+=1;u=`${t}-${m}`}const{openMode:y=f.Embed,popupWindowFeatures:E={}}=d,g=this.#z(i,r);let w=null;if(this.#u("SSF.Guest.Load",{appId:u,appUrl:g}),y===f.Popup)w=this.#x({guestId:u,url:g,title:o,searchParams:r,popupWindowFeatures:E,onLoad:c,onError:a});else if(y===f.Embed)w=this.#D({guestId:u,url:g,title:o,targetElement:s,searchParams:r,onLoad:c,onError:a,options:d});else throw new Error(`Invalid openMode: ${y}`);return this.#e.audit({message:"Guest loaded",...w.getInfo()}),w};loadGuests=e=>{const{id:t,url:i,targetElement:s,title:o,searchParamsList:r=[],options:c={}}=e;r.forEach((a,d)=>{this.loadGuest({id:`${t}-${d}`,url:i,title:o,targetElement:s,searchParams:a,options:c})},this)};removeAllScriptingObjects=e=>{this.#c.removeAllScriptingObjects(e)};removeScriptingObject=(e,t)=>{this.#c.removeScriptingObject(e,t)};setLogLevel=e=>{this.#e.setLogLevel(e),this.#s.forEach(this.#y),this.#e.debug("Dispatched config events to all guests")};unloadGuest=e=>{const t=this.#w(e);t&&(t.dispose(),this.#o.delete(t.window),this.#r.delete(t.url),this.#s.delete(t.id),this.#e.audit({message:"Guest is removed from host",...t.getInfo()}),this.#C())};onGuestClose=e=>{const{id:t,guestCloseCallback:i}=e,s=this.#l.get(t)||[];s.push(i),this.#l.set(t,s)}}return I})());
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=emuiSsfHost.a4526c5eda64df08190f.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js/emuiSsfHost.a4526c5eda64df08190f.js","mappings":"CAAC,SAA0CA,EAAMC,EAAS,CACtD,OAAO,SAAY,UAAY,OAAO,QAAW,SACnD,OAAO,QAAUA,EAAQ,EAClB,OAAO,QAAW,YAAc,OAAO,IAC9C,OAAO,CAAC,EAAGA,CAAO,EACX,OAAO,SAAY,SAC1B,QAAQ,IAASA,EAAQ,GAEzBD,EAAK,IAASA,EAAK,KAAU,CAAC,EAAGA,EAAK,IAAO,KAAUC,EAAQ,EACjE,GAAG,WAAY,K,kBCRf,IAAIC,EAAsB,CAAC,ECA3BA,EAAoB,EAAI,CAACC,EAASC,IAAe,CAChD,QAAQC,KAAOD,EACXF,EAAoB,EAAEE,EAAYC,CAAG,GAAK,CAACH,EAAoB,EAAEC,EAASE,CAAG,GAC/E,OAAO,eAAeF,EAASE,EAAK,CAAE,WAAY,GAAM,IAAKD,EAAWC,CAAG,CAAE,CAAC,CAGjF,ECPAH,EAAoB,EAAI,CAACI,EAAKC,IAAU,OAAO,UAAU,eAAe,KAAKD,EAAKC,CAAI,ECCtFL,EAAoB,EAAKC,GAAY,CACjC,OAAO,OAAW,KAAe,OAAO,aAC1C,OAAO,eAAeA,EAAS,OAAO,YAAa,CAAE,MAAO,QAAS,CAAC,EAEvE,OAAO,eAAeA,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,CAC7D,E,qJCNA,MAAMK,CAAM,CAKV,KAIA,SAIA,GAKA,YAAYC,EAAO,CACjB,KAAM,CAAE,KAAAC,EAAM,SAAAC,CAAS,EAAIF,EAC3B,GAAI,CAACC,EAAM,MAAM,IAAI,MAAM,wBAAwB,EACnD,GAAI,CAACC,EAAU,MAAM,IAAI,MAAM,iCAAiC,EAChE,KAAK,SAAWA,EAChB,KAAK,KAAOD,EACZ,KAAK,GAAK,GAAG,KAAK,QAAQ,IAAI,KAAK,IAAI,GAAG,YAAY,CACxD,CACF,CACA,MAAME,CAAW,CAMf,OAAQ,OAAO,WAAW,EAAEN,EAAK,CAC/B,OAAO,OAAOA,GAAQ,UAAYA,IAAQ,MAAQ,YAAaA,GAAO,OAAOA,EAAI,SAAY,YAAcA,EAAI,QAAQ,IAAM,YAC/H,CAKAO,GAIA,SAIA,KAIA,GAKA,SAAU,CACR,MAAO,YACT,CAKA,YAAYJ,EAAO,CACjB,KAAM,CAAE,KAAAC,EAAM,SAAAC,EAAU,SAAAG,CAAS,EAAIL,EACrC,GAAI,CAACC,EAAM,MAAM,IAAI,MAAM,wBAAwB,EACnD,GAAI,CAACC,EAAU,MAAM,IAAI,MAAM,iCAAiC,EAChE,GAAI,CAACG,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,KAAK,SAAWH,EAChB,KAAK,KAAOD,EACZ,KAAKG,GAAYC,EACjB,KAAK,GAAK,GAAG,KAAK,QAAQ,IAAI,KAAK,IAAI,GAAG,YAAY,CACxD,CAMA,UAAaC,GAAa,KAAKF,GAAU,UAAU,CACjD,QAAS,KAAK,GACd,SAAAE,CACF,CAAC,EAKD,YAAeC,GAAU,CACvB,KAAKH,GAAU,YAAY,CACzB,QAAS,KAAK,GACd,MAAAG,CACF,CAAC,CACH,CACF,CACA,MAAMC,EAAWC,GAAUA,aAAiBV,EACtCW,GAAa,CAACR,EAAUS,IAAc,GAAGT,EAAS,YAAY,CAAC,IAAIS,EAAU,YAAY,CAAC,GC9F1FC,EAAW,WACXC,EAAmB,CAACJ,EAAOK,IAAW,OAAOL,IAAUG,GAAY,CAAC,CAACE,GAAU,CAACA,EAAO,WAAW,GAAG,EAC3G,MAAMC,CAAgB,CAIpBC,GAIAC,GAAc,SAMd,YAAYf,EAAUgB,EAAY,CAChC,KAAKF,GAAMd,EACX,KAAKe,GAAcC,GAAc,KAAKD,EACxC,CAIA,IAAI,IAAK,CACP,OAAO,KAAKD,EACd,CAIA,IAAI,YAAa,CACf,OAAO,KAAKC,EACd,CAMA,QAAU,IAAM,CACd,MAAME,EAAY,CAAC,EACbC,EAAS,CAAC,EAChB,cAAO,KAAK,IAAI,EAAE,QAASC,GAAa,CACtC,MAAMZ,EAAQ,KAAKY,CAAQ,EACvBb,EAAQC,CAAK,EACfW,EAAO,KAAKC,CAAQ,EACXR,EAAiBJ,EAAOY,CAAQ,GACzCF,EAAU,KAAKE,CAAQ,CAE3B,CAAC,EACM,CACL,SAAU,KAAKL,GACf,WAAY,KAAKC,GACjB,UAAAE,EACA,OAAAC,CACF,CACF,EAKA,SAAW,IAAM,CACjB,EAIA,QAAU,IAAM,CAChB,CACF,CCnEA,IAAIE,GAAgCC,IAClCA,EAAa,WAAgB,cAC7BA,EAAa,oBAAyB,uBACtCA,EAAa,sBAA2B,yBACxCA,EAAa,WAAgB,cAC7BA,EAAa,WAAgB,cAC7BA,EAAa,mBAAwB,sBACrCA,EAAa,YAAiB,eAC9BA,EAAa,UAAe,YAC5BA,EAAa,aAAkB,gBAC/BA,EAAa,UAAe,aAC5BA,EAAa,WAAgB,cAC7BA,EAAa,YAAiB,eAC9BA,EAAa,YAAiB,eAC9BA,EAAa,UAAe,aAC5BA,EAAa,aAAkB,gBACxBA,IACND,GAAe,CAAC,CAAC,ECZRE,GAAAA,IAIVA,EAAA,MAAQ,QAIRA,EAAA,MAAQ,QAREA,IAAAA,GAAA,IAgBAC,GAAAA,IACVA,EAAA,oCAAsC,0CACtCA,EAAA,eAAiB,kBACjBA,EAAA,WAAa,cACbA,EAAA,YAAc,eACdA,EAAA,qBAAuB,yBACvBA,EAAA,iBAAmB,qBACnBA,EAAA,YAAc,eACdA,EAAA,2BAA6B,iCAC7BA,EAAA,kBAAoB,qBACpBA,EAAA,gBAAkB,oBAClBA,EAAA,aAAe,gBACfA,EAAA,mCAAqC,0CACrCA,EAAA,mBAAqB,uBACrBA,EAAA,mCAAqC,0CAd3BA,IAAAA,GAAA,ICnBL,MAAMC,EAAaC,GAAgB,CACxC,GAAIA,IAAQ,cAAe,MAAO,IAClC,GAAI,CACF,KAAM,CAAE,OAAAC,CAAO,EAAI,IAAI,IAAID,CAAG,EAC9B,OAAOC,IAAW,QAAU,CAACA,EAASD,EAAMC,CAC9C,MAAY,CACV,KAAM,CAAE,OAAAA,CAAO,EAAI,IAAI,IAAID,EAAK,SAAS,OAAO,EAChD,OAAOC,CACT,CACF,EAEaC,EAAWC,GACtBA,EAAO,KAAK,GAAQ,EAAE,OAAQC,GAAMA,IAAM,MAAS,EAE9C,SAASC,EAAWvB,EAAsC,CAC/D,OAAO,OAAOA,GAAU,UAC1B,CC8CO,MAAMwB,CAAM,CAID,GAKA,MAKA,IAKA,aAKA,WAKA,OAKA,SAKA,OAKT,YAAc,GAKd,MAAQ,GAKR,aAKPC,GAKAC,GAMA,YAAYC,EAAqB,CAC/B,KAAM,CACJ,QAAAC,EACA,WAAAC,EAAa,KACb,MAAAC,EACA,IAAAZ,EACA,OAAAa,EACA,aAAAC,EAAe,CAAC,EAChB,SAAAC,EAAWlB,EAAS,MACpB,SAAAmB,EACA,aAAAC,CACF,EAAIR,EACJ,KAAK,GAAKC,EACV,KAAK,MAAQE,EACb,KAAK,IAAMZ,EACX,KAAK,OAASD,EAAUC,CAAG,EAC3B,KAAK,aAAec,EACpB,KAAK,WAAaH,EAClB,KAAK,OAASE,EACd,KAAK,SAAWE,EAChB,KAAK,aAAe,CAAC,EACrB,KAAKP,GAAgBS,EACrB,KAAKV,GAAYS,CACnB,CAKA,QAAU,IAAM,CACd,GAAI,KAAK,WAAanB,EAAS,OAAS,CAAC,KAAK,OAAO,OACnD,GAAI,CAEF,KAAK,OAAO,SACZ,KAAK,OAAO,MAAM,CACpB,MAAY,CACV,KAAKU,GAAU,KAAK,CAClB,UAAW,KAAK,OAChB,aAAc,KAAK,OACnB,YAAaZ,EAAY,UACzB,YAAa,CAAC,CAChB,CAAC,CACH,MAEA,KAAK,YAAY,SAAS,EAG5B,KAAKY,GAAU,aAAa,CAAE,OAAQ,KAAK,OAAQ,OAAQ,KAAK,MAAO,CAAC,CAC1E,EAMA,QAAU,KAAO,CACf,QAAS,KAAK,GACd,WAAY,KAAK,MACjB,SAAU,KAAK,GACjB,GAMA,UAAY,IACV,IAAI,QAAkBW,GAAY,CAChC,IAAIC,EAAiB,EACrB,MAAMC,EAAmB,EACzB,IAAIC,EACJ,MAAMC,EAAQ,IAAM,CAClB,cAAcD,CAAe,EAC7B,KAAKd,GAAU,SAAS,CACtB,YAAaZ,EAAY,aACzB,SAAU2B,CACZ,CAAC,EACDJ,EAAQ,EAAI,CACd,EACAG,EAAkB,YAAY,IAAM,CAC9BF,GAAkBC,GACpB,cAAcC,CAAe,EAC7B,KAAKd,GAAU,SAAS,CACtB,YAAaZ,EAAY,aACzB,SAAU2B,CACZ,CAAC,EACDJ,EAAQ,EAAK,IAEb,KAAKX,GAAU,KAAK,CAClB,UAAW,KAAK,OAChB,aAAc,KAAK,OACnB,YAAaZ,EAAY,UACzB,YAAa,CAAC,CAChB,CAAC,EACDwB,GAAkB,EAEtB,EAAG,GAAI,EACP,KAAKZ,GAAU,OAAO,CACpB,YAAaZ,EAAY,aACzB,SAAU2B,CACZ,CAAC,CACH,CAAC,EAKH,KAAO,IAAM,CAEX,KAAKf,GAAU,UAAU,CAAE,OAAQ,KAAK,OAAQ,OAAQ,KAAK,MAAO,CAAC,EAEjE,KAAK,WAAaV,EAAS,OAC7B,KAAK,UAAU,EAAE,MAAM,IAAM,CAAC,CAAC,CAEnC,EAOA,cAAgB,CAAC0B,EAAoBC,KACnC,KAAKhB,GACF,YACC,yBAAyBe,EAAM,OAAO,QAAQ,IAAIA,EAAM,SAAS,GACjE,CACE,MAAO,KAAK,GACZ,OAAQ,KAAK,GACf,CACF,EACC,MAAM,IAAM,CAAC,CAAC,EACV,KAAKhB,GACT,OAAO,CACN,UAAW,KAAK,OAChB,aAAc,KAAK,OACnB,YAAaZ,EAAY,YACzB,YAAa4B,EACb,kBAAmBC,CACrB,CAAC,EACA,QAAQ,IAAM,CACb,KAAKhB,GACF,UACC,yBAAyBe,EAAM,OAAO,QAAQ,IAAIA,EAAM,SAAS,GACjE,CACE,MAAO,KAAK,GACZ,OAAQ,KAAK,GACf,CACF,EACC,MAAM,IAAM,CAAC,CAAC,CACnB,CAAC,GAOL,KAAQlD,GAAwB,CAC9B,KAAKkC,GAAU,KAAK,CAClB,UAAW,KAAK,OAChB,aAAc,KAAK,OACnB,GAAGlC,CACL,CAAC,CACH,CACF,CCpSA,QAAe,CACb,WAFiB,OAAO,OAAW,KAAe,OAAO,YAAc,OAAO,WAAW,KAAK,MAAM,CAGtG,ECAA,IAAIoD,EACJ,MAAMC,EAAQ,IAAI,WAAW,EAAE,EAChB,SAASC,GAAM,CAE5B,GAAI,CAACF,IAEHA,EAAkB,OAAO,OAAW,KAAe,OAAO,iBAAmB,OAAO,gBAAgB,KAAK,MAAM,EAE3G,CAACA,GACH,MAAM,IAAI,MAAM,0GAA0G,EAI9H,OAAOA,EAAgBC,CAAK,CAC9B,C,MCXA,MAAME,EAAY,CAAC,EAEnB,QAASC,EAAI,EAAGA,EAAI,IAAK,EAAEA,EACzBD,EAAU,MAAMC,EAAI,KAAO,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,EAG3C,SAASC,EAAgBC,EAAKC,EAAS,EAAG,CAG/C,OAAOJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,CACnf,CAEA,SAASC,GAAUF,EAAKC,EAAS,EAAG,CAClC,MAAME,EAAOJ,EAAgBC,EAAKC,CAAM,EAMxC,GAAI,CAACG,EAASD,CAAI,EAChB,MAAM,UAAU,6BAA6B,EAG/C,OAAOA,CACT,CAEA,SAAe,KC5Bf,SAASE,EAAGC,EAASC,EAAKN,EAAQ,CAChC,GAAI,EAAO,YAAc,CAACM,GAAO,CAACD,EAChC,OAAO,EAAO,WAAW,EAG3BA,EAAUA,GAAW,CAAC,EACtB,MAAME,EAAOF,EAAQ,SAAWA,EAAQ,KAAOV,GAAK,EAKpD,GAHAY,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAI,GAAO,GAC3BA,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAI,GAAO,IAEvBD,EAAK,CACPN,EAASA,GAAU,EAEnB,QAASH,EAAI,EAAGA,EAAI,GAAI,EAAEA,EACxBS,EAAIN,EAASH,CAAC,EAAIU,EAAKV,CAAC,EAG1B,OAAOS,CACT,CAEA,OAAOR,EAAgBS,CAAI,CAC7B,CAEA,QAAeH,EC3BTI,EAAiB,gBACjBC,EAAwB,yBACxBC,EAAyB,0BACzBC,EAAgB,CAAC,CACrB,YAAAC,EACA,YAAAC,EACA,UAAAC,EACA,UAAAC,EAAY,EACd,KAAO,CACL,UAAWD,IAAeC,EAAuB,KAAX,EAAO,GAC7C,OAAQP,EACR,KAAMI,EAEN,KAAMC,CACR,GACMG,GAAe3E,GAAU,CAC7B,KAAM,CAAE,UAAA4E,EAAW,aAAAC,EAAc,YAAAN,EAAa,YAAAC,CAAY,EAAIxE,EACxD8E,EAAMR,EAAc,CAAE,YAAAC,EAAa,YAAAC,CAAY,CAAC,EACtDI,EAAU,YAAYE,EAAKD,CAAY,CACzC,EACA,MAAME,CAAS,CACbC,GACAC,GAIAC,GAA6B,IAAI,IAIjCC,GAA+B,IAAI,IAInCC,GAAwB,KAIxBC,GAAqB,KAIrBC,GAAkC,IAAI,IAMtC,YAAYC,EAAQC,EAAe,CACjC,GAAI,CAACD,EAAQ,MAAM,IAAI,MAAM,oBAAoB,EACjD,GAAI,CAACC,EAAe,MAAM,IAAI,MAAM,2BAA2B,EAC/D,KAAKR,GAAiBQ,EACtB,KAAKP,GAAUM,CACjB,CAEAE,GAAoB,IAAM,CACxB,KAAKL,GAAwB,KAC7B,MAAMM,EAAK,KAAK,IAAI,EACdC,EAAgB,CAAC,EACvB,IAAIC,EAAiB,KAgBrB,GAfA,KAAKT,GAAa,QAAQ,CAACU,EAAWjG,IAAQ,CAC5C,KAAM,CAAE,UAAA6E,EAAW,WAAAqB,CAAW,EAAID,EAC9BC,GAAcA,GAAcJ,GAC9B,KAAKT,GAAQ,MACX,4CAA4CR,CAAS,KACvD,EACAkB,EAAc,KAAK/F,CAAG,EACtBiG,EAAU,QAAQ,MAAM,GACfC,IACTF,EAAiBA,IAAmB,KAAOE,EAAa,KAAK,IAAIF,EAAgBE,CAAU,EAE/F,CAAC,EACDH,EAAc,QAAS/F,GAAQ,CAC7B,KAAKuF,GAAa,OAAOvF,CAAG,CAC9B,CAAC,EACGgG,IAAmB,KAAM,CAC3B,MAAMG,EAAQ,KAAK,IAAIH,EAAiB,KAAK,IAAI,EAAG,CAAC,EACrD,KAAKI,GAAsBD,CAAK,CAClC,CACF,EAEAC,GAAyBC,GAAY,CAC/B,KAAKb,KAA0B,OACnC,KAAKA,GAAwB,OAAO,WAClC,KAAKK,GACLQ,CACF,EACF,EAEAC,GAAuB,IAAM,CACvB,KAAKd,KAA0B,OACjC,OAAO,aAAa,KAAKA,EAAqB,EAC9C,KAAKA,GAAwB,KAEjC,EAEAe,GAAkB1B,GAAc,CAC9B,MAAM2B,EAAI,KAAKjB,GAAa,IAAIV,CAAS,EACzC,YAAKQ,GAAQ,MAAM,sBAAsBR,CAAS,EAAE,EACpD,KAAKU,GAAa,OAAOV,CAAS,EAC3B2B,CACT,EAEAC,GAAoBC,GAAY,CAC9B,KAAM,CAAE,UAAA7B,CAAU,EAAI6B,EACtB,KAAKrB,GAAQ,MACX,+CAA+CR,CAAS,EAC1D,EACA,MAAMoB,EAAY,KAAKM,GAAe1B,CAAS,EAC/C,OAAKoB,GAMLA,EAAU,QAAQS,EAAQ,IAAI,EACvB,KANL,KAAKrB,GAAQ,MACX,8DAA8DR,CAAS,EACzE,EACO,GAIX,EAEA8B,GAAqBD,GAAY,CAC/B,KAAKrB,GAAQ,MACX,kDAAkDqB,EAAQ,SAAS,GACrE,EACA,MAAMT,EAAY,KAAKM,GAAeG,EAAQ,SAAS,EACvD,OAAKT,GAMLA,EAAU,OAAO,IAAI,MAAMS,EAAQ,IAAI,CAAC,EACjC,KANL,KAAKrB,GAAQ,KACX,6DAA6DqB,EAAQ,SAAS,GAChF,EACO,GAIX,EAEAE,GAAW,CAAC,CACV,UAAAC,EACA,aAAAC,EACA,QAAAJ,CACF,IAAM,CACJ,KAAKrB,GAAQ,MAAM,6BAA6BqB,EAAQ,IAAI,GAAG,EAC/D,MAAMK,EAAY,KAAKzB,GAAW,IAAIoB,EAAQ,IAAI,EAClD,OAAKK,GACLA,EAAU,QAASrG,GAAa,CAC9B,KAAK2E,GAAQ,MAAM,4BAA4B3E,EAAS,IAAI,EAAE,EAC9DA,EAAS,CACP,UAAAmG,EACA,aAAAC,EACA,UAAWJ,EAAQ,UACnB,KAAMA,EAAQ,KACd,KAAMA,EAAQ,IAChB,CAAC,CACH,CAAC,EACM,IAXgB,EAYzB,EAEAM,GAAmBN,GAAY,CAE7B,GADI,KAAKhB,GAAgB,OAAS,GAC9B,CAACgB,EAAQ,OAAQ,MAAO,GAC5B,MAAMO,EAAe,KAAKvB,GAAgB,IAAIgB,EAAQ,MAAM,EAE5D,MADI,CAACO,GACDP,GAAS,MAAM,SAAWnC,EAAuB,IACrD,KAAKc,GAAQ,MACX,uCAAuCqB,EAAQ,KAAK,IAAI,GAC1D,EACIA,EAAQ,KAAK,OAASlC,EACxB,KAAKiC,GAAiBC,EAAQ,IAAI,EAC3BA,EAAQ,KAAK,OAASjC,EAC7B,KAAKkC,GAAkBD,EAAQ,IAAI,EAEnC,KAAKE,GAAS,CACZ,UAAWF,EAAQ,OACnB,aAAcO,EACd,QAASP,EAAQ,IACnB,CAAC,EACI,GACT,EAKA,UAAatG,GAAU,CACrB,KAAM,CAAE,OAAA4B,EAAQ,OAAQkF,CAAQ,EAAI9G,EACpC,GAAI,CAAC4B,EAAQ,MAAM,IAAI,MAAM,oBAAoB,EACjD,GAAI,CAACkF,EAAS,MAAM,IAAI,MAAM,oBAAoB,EAClD,KAAKxB,GAAgB,IAAIwB,EAASlF,CAAM,CAC1C,EAKA,WAAcmF,GAAQ,CAChB,KAAK1B,IACP,KAAKA,GAAmB,oBACtB,UACA,KAAKuB,EACP,EAEFG,EAAI,iBAAiB,UAAW,KAAKH,EAAe,EACpD,KAAKvB,GAAqB0B,EAC1B,KAAK9B,GAAQ,MAAM,4BAA4B,KAAKD,EAAc,EAAE,CACtE,EAIA,MAAQ,IAAM,CACR,KAAKK,KACP,KAAKA,GAAmB,oBACtB,UACA,KAAKuB,EACP,EACA,KAAKvB,GAAqB,MAE5B,KAAKa,GAAqB,EAC1B,KAAKjB,GAAQ,MAAM,uBAAuB,KAAKD,EAAc,EAAE,CACjE,EAMA,OAAUhF,GAAU,CAClB,KAAM,CACJ,UAAA4E,EACA,aAAAC,EACA,YAAAN,EACA,YAAAC,EACA,kBAAAwC,CACF,EAAIhH,EACJ,OAAO,IAAI,QAAQ,CAAC6C,EAASoE,IAAW,CACtC,MAAMnC,EAAMR,EAAc,CAAE,YAAAC,EAAa,YAAAC,CAAY,CAAC,EACtD,KAAKW,GAAa,IAAIL,EAAI,UAAW,CACnC,UAAWA,EAAI,UACf,QAAAjC,EACA,OAAAoE,EACA,WAAYD,EAAoB,KAAK,IAAI,EAAIA,EAAoB,IACnE,CAAC,EACDpC,EAAU,YAAYE,EAAKD,CAAY,EACvC,KAAM,CAAE,UAAAJ,CAAU,EAAIK,EACtB,KAAKG,GAAQ,MACX,qCAAqCV,CAAW,eAAeE,GAAa,EAAE,EAChF,EACIuC,IACF,KAAK/B,GAAQ,MACX,2CAA2CR,GAAa,EAAE,OAAOuC,CAAiB,KACpF,EACA,KAAKhB,GAAsBgB,CAAiB,EAEhD,CAAC,CACH,EAKA,OAAUhH,GAAU,CAClB,KAAM,CAAE,YAAAuE,EAAa,SAAAjE,CAAS,EAAIN,EAC5BkH,EAAQ,KAAKhC,GAAW,IAAIX,CAAW,GAAK,CAAC,EACnD2C,EAAM,KAAK5G,CAAQ,EACnB,KAAK4E,GAAW,IAAIX,EAAa2C,CAAK,CACxC,EAKA,SAAYlH,GAAU,CACpB,KAAM,CAAE,YAAAuE,EAAa,SAAAjE,CAAS,EAAIN,EAC5BkH,EAAQ,KAAKhC,GAAW,IAAIX,CAAW,EAC7C,GAAI,CAAC2C,EAAO,OACZ,MAAMC,EAAQD,EAAM,QAAQ5G,CAAQ,EAChC6G,IAAU,IACZD,EAAM,OAAOC,EAAO,CAAC,CAEzB,EAKA,KAAQnH,GAAU,CAChB,KAAM,CAAE,UAAA4E,EAAW,aAAAC,EAAc,YAAAN,EAAa,YAAAC,CAAY,EAAIxE,EACxD8E,EAAMR,EAAc,CACxB,YAAAC,EACA,YAAAC,EACA,UAAW,EACb,CAAC,EACDI,EAAU,YAAYE,EAAKD,CAAY,EACvC,KAAKI,GAAQ,MAAM,mCAAmCV,CAAW,GAAG,CACtE,EAKA,aAAgBvE,GAAU,CACxB,KAAM,CAAE,OAAQ8G,CAAQ,EAAI9G,EACxB8G,GAAS,KAAKxB,GAAgB,OAAOwB,CAAO,CAClD,EAKA,QAAW9G,GAAU,CACnB,KAAM,CAAE,UAAA4E,EAAW,aAAAC,EAAc,UAAAJ,EAAW,SAAA2C,CAAS,EAAIpH,EACnD8E,EAAMR,EAAc,CACxB,YAAaF,EACb,YAAagD,EACb,UAAA3C,CACF,CAAC,EACDG,EAAU,YAAYE,EAAKD,CAAY,EACvC,KAAKI,GAAQ,MACX,qDAAqDR,CAAS,EAChE,CACF,EAKA,eAAkBzE,GAAU,CAC1B,KAAM,CAAE,UAAA4E,EAAW,aAAAC,EAAc,UAAAJ,EAAW,GAAA4C,CAAG,EAAIrH,EAC7CwE,EAAc6C,aAAc,MAAQA,EAAG,QAAUA,EACjDvC,EAAMR,EAAc,CACxB,YAAaD,EACb,YAAAG,EACA,UAAAC,CACF,CAAC,EACDG,EAAU,YAAYE,EAAKD,CAAY,EACvC,KAAKI,GAAQ,MACX,uDAAuDR,CAAS,EAClE,CACF,CACF,CCxUA,MAAM6C,EAAgB,SACtB,IAAIC,IAAoCC,IACtCA,EAAiB,KAAU,OAC3BA,EAAiB,QAAa,UACvBA,IACND,IAAmB,CAAC,CAAC,EACxB,MAAME,EAAuB,CAC3BC,GAAgBC,GAAOA,EAAG,KAAK,EAAE,YAAY,EAI7CC,GAAoC,IAAI,IAIxCC,GAAyC,IAAI,IAC7CC,GAA4BC,GAAW,CACrC,KAAM,CAAE,GAAAC,EAAI,QAAA3F,CAAQ,EAAI0F,EAClB7H,EAAW,KAAKwH,GAAaM,EAAG,EAAE,EAClCC,EAAW,KAAKJ,GAAuB,IAAIxF,CAAO,EACxD,GAAI,CAAC4F,EACH,KAAKJ,GAAuB,IAAIxF,EAAyB,IAAI,IAAI,CAAC,CAACnC,EAAU6H,CAAM,CAAC,CAAC,CAAC,MACjF,CACL,GAAIE,EAAS,IAAI/H,CAAQ,EACvB,MAAM,IAAI,MACR,oBAAoB8H,EAAG,EAAE,6BAA6B3F,CAAO,EAC/D,EACF4F,EAAS,IAAI/H,EAAU6H,CAAM,CAC/B,CACF,EACAG,GAAa,CAAC,CAAE,GAAAF,CAAG,IAAM,CACvB,GAAIA,EAAG,UAAY,OAAOA,EAAG,UAAa,WACxC,GAAI,CACFA,EAAG,SAAS,CACd,MAAQ,CACR,CAEJ,EASAG,GAA2B,CAAC,CAC1B,SAAAjI,EACA,QAAAmC,CACF,IAAM,CACJ,GAAInC,IAAaoH,GAAiB,CAACjF,EACjC,SAAW,CAAC,CAAE+F,CAAI,IAAK,KAAKP,GAAwB,CAClD,MAAMQ,EAAMD,EAAK,IAAIlI,CAAQ,EAC7B,GAAImI,EAAK,OAAOA,CAClB,CAEF,MAAMC,EAAMjG,EAAU,KAAKwF,GAAuB,IAAIxF,CAAO,EAAI,KACjE,OAAIiG,EACKA,EAAI,IAAIpI,CAAQ,GAAK,KAEvB,IACT,EACAqI,GAA8B,CAAC,CAC7B,SAAArI,EACA,QAAAmC,CACF,EAAI,CAAC,IAAM,CACT,GAAIA,EAAS,CACX,GAAI,CAACnC,EAAU,CACb,MAAMsI,EAAU,KAAKX,GAAuB,IAAIxF,CAAO,EACnDmG,GACFA,EAAQ,QAAQ,KAAKN,EAAU,EAEjC,KAAKL,GAAuB,OAAOxF,CAAO,EAC1C,MACF,CACA,MAAMoG,EAAY,KAAKZ,GAAuB,IAAIxF,CAAO,EACzD,GAAIoG,EAAW,CACb,MAAMC,EAASD,EAAU,IAAIvI,CAAQ,EACjCwI,GAAQ,KAAKR,GAAWQ,CAAM,EAClCD,EAAU,OAAOvI,CAAQ,CAC3B,CACF,MAAWA,GACT,KAAK2H,GAAuB,QAASY,GAAc,CACjD,MAAMC,EAASD,EAAU,IAAIvI,CAAQ,EACjCwI,GAAQ,KAAKR,GAAWQ,CAAM,EAClCD,EAAU,OAAOvI,CAAQ,CAC3B,CAAC,CAEL,EAOA,mBAAqB,CAAC8H,EAAID,IAAW,CACnC,KAAM,CAAE,QAAA1F,CAAQ,EAAI0F,GAAU,CAAC,EAC/B,GAAI,CAACC,GAAI,IAAM,CAACA,GAAI,QAClB,MAAM,IAAI,MAAM,4CAA4C,EAE9D,MAAM9H,EAAW,KAAKwH,GAAaM,EAAG,EAAE,EACxC,GAAI9H,IAAaoH,GAAiB,CAACjF,EACjC,MAAM,IAAI,MAAM,qDAAqD,EAEvE,GAAIA,EAAS,CACX,KAAKyF,GAAyB,CAAE,GAAAE,EAAI,GAAGD,EAAQ,QAAA1F,CAAQ,CAAC,EACxD,MACF,CACA,GAAI,KAAKuF,GAAkB,IAAI1H,CAAQ,EACrC,MAAM,IAAI,MAAM,oBAAoB8H,EAAG,EAAE,iBAAiB,EAC5D,KAAKJ,GAAkB,IAAI1H,EAAU,CAAE,GAAA8H,EAAI,GAAGD,CAAO,CAAC,CACxD,EAOA,UAAY,CAAC7H,EAAUyI,IAAU,CAC/B,MAAMhB,EAAK,KAAKD,GAAaxH,CAAQ,EACrC,IAAIwI,EAAS,KAAKP,GAAyB,CACzC,SAAUR,EACV,QAASgB,GAAO,EAClB,CAAC,EACDD,EAASA,GAAU,KAAKd,GAAkB,IAAID,CAAE,GAAK,KACrD,KAAM,CAAE,GAAAK,CAAG,EAAIU,GAAU,CAAC,EAC1B,OAAKV,GAAW,IAElB,EAOA,IAAM,CAAC9H,EAAUyI,IAAU,KAAK,UAAUzI,EAAUyI,CAAK,IAAM,KAM/D,qBAAwBtG,GAAY,CAClC,MAAMuG,EAAU,IAAI,IAAI,KAAKhB,GAAkB,KAAK,CAAC,EAC/CK,EAAW,KAAKJ,GAAuB,IAAIxF,CAAO,EACxD,GAAI4F,EACF,UAAWrI,KAAOqI,EAAS,KAAK,EAAGW,EAAQ,IAAIhJ,CAAG,EAEpD,OAAO,MAAM,KAAKgJ,CAAO,CAC3B,EAMA,sBAAwB,CAAC1I,EAAUmC,IAAY,CAC7C,MAAMsF,EAAK,KAAKD,GAAaxH,CAAQ,EACrC,GAAImC,EACF,KAAKkG,GAA4B,CAAE,SAAUZ,EAAI,QAAAtF,CAAQ,CAAC,MACrD,CACL,KAAKkG,GAA4B,CAAE,SAAUZ,CAAG,CAAC,EACjD,MAAMe,EAAS,KAAKd,GAAkB,IAAID,CAAE,EACxCe,GAAQ,KAAKR,GAAWQ,CAAM,EAClC,KAAKd,GAAkB,OAAOD,CAAE,CAClC,CACF,EAKA,0BAA6BtF,GAAY,CAClCA,EAIH,KAAKkG,GAA4B,CAAE,QAAAlG,CAAQ,CAAC,GAH5C,KAAKuF,GAAkB,QAAQ,KAAKM,EAAU,EAC9C,KAAKN,GAAkB,MAAM,EAIjC,CACF,CCjLA,MAAMiB,EAAqB,CAIzB,SAAW,QAIX,GAIA,WAMA,YAAY3I,EAAUgB,EAAY,CAChC,KAAK,GAAKhB,EACV,KAAK,WAAagB,CACpB,CACF,CACA,MAAM4H,EAA0BrI,GAE9BA,GAAO,aAAa,OAAS,SAC7BA,GAAO,aAAa,OAAS,wBAC7BA,GAAO,WAAa,QC2BTsI,EAAkB,CAC7BtH,EAAoB,aACpBA,EAAoB,YACpBA,EAAoB,YACpBA,EAAoB,WACpBA,EAAoB,eACpBA,EAAoB,eACtB,EAaO,MAAMuH,EAIb,CAKS,OAKP9G,GAKA8C,GAKAC,GAKA9C,GAKA8G,GAAU,IAAI,IAKdC,GAAkB,IAAI,IAKtBC,GAAe,IAAI,IAKnBC,GAA0B,IAAI,IAQ9BC,GAKAC,GAAuD,KAKvDC,GAA4D,KAK5DC,GAA6D,KAK7DC,GAAiE,KAOjE,YAAYC,EAAgBtH,EAAoB,CAG9C,GADA,KAAK,OAASsH,EACV,CAACtH,GAAQ,OAAQ,MAAM,IAAI,MAAM,oBAAoB,EACzD,GAAI,CAACA,GAAQ,aAAc,MAAM,IAAI,MAAM,8BAA8B,EAKzE,GAJA,KAAK6C,GAAU7C,EAAO,OACtB,KAAKD,GAAgBC,EAAO,aAC5B,KAAK4C,GAAiB,EAAO,EAC7B,KAAK9C,GAAY,IAAI6C,EAAS,KAAKE,GAAS,KAAKD,EAAc,EAE7D5C,GAAQ,oBACR,OAAOA,GAAQ,oBAAuB,WAEtC,MAAM,IAAI,MAAM,uCAAuC,EACzD,KAAKkH,GAAsBlH,GAAQ,oBAAsB,KACzD,KAAKoH,GAAyBpH,GAAQ,uBAAyB,KAC/D,KAAKqH,GAA2BrH,GAAQ,yBAA2B,KACnE,KAAKiH,GAAa,IAAI5B,GAEtB,KAAKvF,GAAU,WAAW,MAAM,EAChC,KAAKyH,GAAS,EAEd,OAAO,iBAAiB,eAAgB,KAAKC,EAAoB,EACjE,KAAK3E,GAAQ,MACX,gCAAgC,KAAK,MAAM,oBACzC,KAAKD,EACP,EACF,CACF,CAEA6E,GAAe,CAAC3G,EAAe4G,IAAkC,CAC/D,MAAMC,EAAU,CAAE,MAAA7G,EAAO,GAAG4G,CAAK,EACjC,KAAK3H,GAAc,YAAY4H,CAAO,EAAE,MAAO3D,GAAM,CACnD,KAAKnB,GAAQ,MACX,iCAAkCmB,EAAY,OAAO,EACvD,CACF,CAAC,CACH,EAEA4D,GAAe,CAAC/J,EAAc+D,IAA2B,CACvD,KAAK7B,GAAc,YAAYlC,EAAM+D,CAAO,EAAE,MAAOoC,GAAM,CACzD,KAAKnB,GAAQ,MACX,iCAAkCmB,EAAY,OAAO,EACvD,CACF,CAAC,CACH,EAEA6D,GAAa,CAACC,EAAelG,IAA2B,CACtD,KAAK7B,GAAc,UAAU+H,EAAOlG,CAAO,EAAE,MAAOoC,GAAM,CACxD,KAAKnB,GAAQ,MAAM,+BAAgCmB,EAAY,OAAO,EAAE,CAC1E,CAAC,CACH,EAEAwD,GAAuB,IAAM,CACV,MAAM,KAAK,KAAKX,GAAQ,OAAO,CAAC,EAC9C,OAAQN,GAAUA,EAAM,WAAanH,EAAS,KAAK,EACnD,IAAKmH,GAAUA,EAAM,EAAE,EACjB,QAAShB,GAAO,KAAK,YAAYA,CAAE,CAAC,CAC/C,EAOAwC,GAAsBC,GACpB,KAAKlB,GAAgB,IAAIkB,CAAW,EAOtCC,GAAmB1I,GAAgB,KAAKwH,GAAa,IAAIxH,CAAG,GAAK,KAOjE2I,GAAsB7J,GAEpB,OAAOA,GAAO,SAAY,WAE5B8J,GAAkB,CAACC,EAAc7B,IAC3B,KAAK2B,GAAmBE,CAAG,GAG1B,KAAKnB,GAAW,IACfmB,GAAK,GACL7B,CACF,GAEA,KAAKU,GAAW,mBACdmB,EACA7B,EAAQ,CAAE,QAASA,GAAO,EAAG,EAAI,CAAC,CACpC,EAEK,CAAE,KAAM,SAAU,OAAQ6B,EAAI,QAAQ,CAAE,GAE1C,CAAE,KAAM,QAAS,MAAOA,CAAI,EAGrCC,GAAoBpD,GACd,OAAOA,GAAO,SACTA,EAELA,aAAc,MACTA,EAAG,QAEL,uDAGTqD,GAAwB/B,GAAiB,CACnCA,EAAM,OACR,KAAKzG,GAAU,KAAK,CAClB,UAAWyG,EAAM,OACjB,aAAcA,EAAM,OACpB,YAAarH,EAAY,WACzB,YAAa,CACX,SAAU,KAAK2D,GAAQ,YAAY,EACnC,GAAG0D,EAAM,QAAQ,CACnB,CACF,CAAC,CAEL,EAEAgC,GAAU,CAA6B,CACrC,MAAAhC,EACA,IAAA9I,EACA,aAAA+K,EACA,eAAAC,CACF,IAKM,CACJ,MAAMC,EAAOjL,EAAI+K,CAAY,EAE7B,OAAK5I,EAAW8I,CAAI,GAcpB,KAAK7F,GAAQ,MACX,mCAAmCpF,EAAI,EAAE,IAAI,OAAO+K,CAAY,CAAC,IACnE,EACO,IAAI,QAAS/H,GAAY,CAC9B,OAAO,eAAeiI,EAAM,cAAe,CACzC,MAAO,CAAE,MAAAnC,CAAM,EACf,aAAc,GACd,WAAY,GACZ,SAAU,EACZ,CAAC,EAED9F,EAASiI,EAAyB,GAAGD,CAAc,CAAC,CACtD,CAAC,IAzBC,KAAK5F,GAAQ,KACX,mDACEpF,EAAI,UACN,KAAK,OAAO+K,CAAY,CAAC,EAC3B,EACO,QAAQ,OACb,IAAI,MACF,WAAWA,CAAY,oCAAoC/K,EAAI,EAAE,GACnE,CACF,EAiBJ,EAEAkL,GAA4B,CAAC,CAC3B,UAAAtE,EACA,aAAAC,EACA,UAAAjC,CACF,IAAmC,CAEjC,MAAMkE,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EAAO,CACV,KAAK1D,GAAQ,KACX,sDAAsDR,CAAS,EACjE,EACA,MACF,CAGA,GAAI,CAACkE,EAAM,YAAa,CACtB,KAAK1D,GAAQ,KACX,wDACF,EACA,KAAK/C,GAAU,eAAe,CAC5B,UAAWuE,EACX,aAAcC,EACd,UAAAjC,EACA,GAAI,wDACN,CAAC,EACD,MACF,CAEA,GAAI,CAACkE,EAAM,MAAO,CAEhBA,EAAM,MAAQ,GACd,MAAMqC,EAAYrC,EAAM,QAAQ,EAChC,KAAKsB,GAAW,iBAAkB,CAChC,MAAOe,EAAU,QACjB,OAAQA,EAAU,QACpB,CAAC,EAED,KAAKN,GAAqB/B,CAAK,EAE/B,KAAKW,KAAsBX,CAAK,EAChC,KAAK1D,GAAQ,MAAM,CACjB,QAAS,iBACT,GAAG+F,CACL,CAAC,CACH,CACF,EAGAC,GAAoB,CAAC,CACnB,UAAAxE,EACA,aAAAC,EACA,UAAAjC,EACA,KAAAyG,CACF,IAAmD,CAEjD,MAAMvC,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EAAO,CACV,KAAK1D,GAAQ,KACX,uDAAuDR,CAAS,EAClE,EACA,MACF,CACKkE,EAAM,cAETA,EAAM,YAAc,GACpBA,EAAM,aAAeuC,GAAQ,CAAC,EAC9B,KAAKjG,GAAQ,MAAM,CACjB,QAAS,uBACT,GAAG0D,EAAM,QAAQ,CACnB,CAAC,IAIC,CAACuC,GAAQ,CAACA,EAAK,UACjB,KAAKH,GAA0B,CAC7B,UAAAtE,EACA,aAAAC,EACA,UAAAjC,EACA,KAAM,GACN,KAAM,IACR,CAAC,CAEL,EAOA0G,GAAoB,MAAO,CAAE,UAAA1E,CAAU,IAAmC,CACxE,GAAIA,GAAW,OAAQ,CACrB,MAAMkC,EAAQ,KAAKyC,GAAW3E,CAAS,EACnCkC,GAAS,CAAE,MAAMA,EAAM,UAAU,GACnC,KAAK,YAAYlC,CAAS,CAE9B,CACF,EAGA4E,GAAqB,CAAC,CACpB,UAAA5E,EACA,aAAAC,EACA,UAAAjC,CACF,IAEO,CACL,KAAKQ,GAAQ,MACX,+CAA+CR,CAAS,EAC1D,EAGA,MAAMkE,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EACH,YAAK1D,GAAQ,KAAK,mDAAmD,EAC9D,GAIT,MAAM2D,EAAU,KAAKS,GAAW,qBAAqBV,EAAM,EAAE,EAE7D,YAAKzG,GAAU,QAAQ,CACrB,UAAWuE,EACX,aAAcC,EACd,UAAAjC,EACA,SAAUmE,CACZ,CAAC,EAED,KAAK3D,GAAQ,MAAM,CACjB,QAAS,qCACT,UAAAR,EACA,QAAAmE,EACA,GAAGD,EAAM,QAAQ,CACnB,CAAC,EACM,EACT,EAGA2C,GAAmB,CAAC,CAClB,UAAA7E,EACA,aAAAC,EACA,UAAAjC,EACA,KAAAyG,CACF,IAEO,CACL,KAAM,CAAE,SAAAhL,CAAS,EAAIgL,EACrB,KAAKjG,GAAQ,MACX,2CAA2C/E,CAAQ,iBAAiBuE,CAAS,EAC/E,EAGA,MAAMkE,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EACH,YAAK1D,GAAQ,KAAK,mDAAmD,EAC9D,GAIT,MAAMpF,EAAM,KAAK,mBAAmBK,EAAU,CAAE,MAAAyI,CAAM,CAAC,EACvD,OAAK9I,GAaL,KAAKqC,GAAU,QAAQ,CACrB,UAAWuE,EACX,aAAcC,EACd,UAAAjC,EACA,SAAU,KAAK8F,GAAgB1K,EAAK8I,CAAK,CAC3C,CAAC,EAED,KAAK1D,GAAQ,MAAM,CACjB,QAAS,4BACT,UAAAR,EACA,gBAAiBvE,EACjB,GAAGyI,EAAM,QAAQ,CACnB,CAAC,EACM,KAzBL,KAAK1D,GAAQ,KACX,kCAAkC/E,CAAQ,eAAeyI,EAAM,EAAE,EACnE,EACA,KAAKzG,GAAU,eAAe,CAC5B,UAAWuE,EACX,aAAcC,EACd,UAAAjC,EACA,GAAI,yBAAyBvE,CAAQ,oBACvC,CAAC,EACM,GAiBX,EAiBAqL,GAA6B,CAAC,CAC5B,UAAA9E,EACA,UAAAhC,EACA,KAAAyG,CACF,IAIO,CACL,KAAM,CAAE,QAAAM,EAAS,SAAAC,EAAU,MAAAlL,CAAM,EAAI2K,EACrC,KAAKjG,GAAQ,MACX,sDAAsDuG,CAAO,iBAAiB/G,CAAS,EACzF,EAEA,MAAMkE,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EAAO,CACV,KAAK1D,GAAQ,KACX,4DACF,EACA,MACF,CAEA,WAAW,IAAM,CACf,GAAI,CACF,KAAKuE,KAAyB,CAC5B,QAASb,EAAM,GACf,QAAA6C,EACA,SAAAC,EACA,MAAAlL,CACF,CAAC,CACH,OAASmL,EAAO,CACd,KAAKzG,GAAQ,KACX,qDAAqDuG,CAAO,KACzDE,EAAgB,OACnB,EACF,CACF,CACF,EAAG,CAAC,CACN,EAkBAC,GAA+B,CAAC,CAC9B,UAAAlF,EACA,UAAAhC,EACA,KAAAyG,CACF,IAAkE,CAChE,KAAM,CAAE,QAAAM,EAAS,MAAAjL,CAAM,EAAI2K,EAC3B,KAAKjG,GAAQ,MACX,wDAAwDuG,CAAO,iBAAiB/G,CAAS,EAC3F,EAEA,MAAMkE,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EAAO,CACV,KAAK1D,GAAQ,KACX,8DACF,EACA,MACF,CAEA,WAAW,IAAM,CACf,GAAI,CACF,KAAKwE,KAA2B,CAC9B,QAASd,EAAM,GACf,QAAA6C,EACA,MAAAjL,CACF,CAAC,CACH,OAASmL,EAAO,CACd,KAAKzG,GAAQ,KACX,uDAAuDuG,CAAO,KAC3DE,EAAgB,OACnB,EACF,CACF,CACF,EAAG,CAAC,CACN,EAGAE,GAAqB,CAAC,CACpB,UAAAnF,EACA,UAAAhC,EACA,KAAAyG,CACF,IAA+C,CAC7C,MAAMvC,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EAAO,CACV,KAAK1D,GAAQ,KACX,yDAAyDR,CAAS,EACpE,EACA,MACF,CACIkE,EAAM,aACRA,EAAM,WAAW,MAAM,OAAS,GAAGuC,EAAK,MAAM,MAEhD,KAAKjG,GAAQ,MACX,SAAS0D,EAAM,EAAE,eAAeuC,EAAK,KAAK,IAAIA,EAAK,MAAM,EAC3D,CACF,EAGAW,GAAsB,CAAC,CACrB,UAAApF,EACA,aAAAC,EACA,UAAAjC,EACA,KAAAyG,CACF,IAIO,CACL,KAAM,CAAE,SAAAhL,CAAS,EAAIgL,EAGfvC,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EACH,YAAK1D,GAAQ,KACX,8DACF,EAOO,GAGT,KAAKA,GAAQ,MACX,YAAY/E,CAAQ,IAAI,OAAOgL,EAAK,YAAY,CAAC,yBAC/CvC,EAAM,EACR,kBAAkBlE,CAAS,GAC7B,EAGA,MAAM5E,EAAM,KAAK,mBAAmBK,EAAU,CAAE,MAAAyI,CAAM,CAAC,EACvD,GAAI,CAAC9I,EACH,YAAKoF,GAAQ,KACX,gDAAgD/E,CAAQ,eAAeyI,EAAM,EAAE,EACjF,EACA,KAAKzG,GAAU,eAAe,CAC5B,UAAWuE,EACX,aAAcC,EACd,UAAAjC,EACA,GAAI,yBAAyBvE,CAAQ,oBACvC,CAAC,EACM,GAGT,MAAM8K,EAAYrC,EAAM,QAAQ,EAChC,YAAKqB,GAAa,uBAAuB9J,CAAQ,IAAIgL,EAAK,YAAY,GAAI,CACxE,MAAOF,EAAU,QACjB,OAAQA,EAAU,QACpB,CAAC,EAED,KAAKL,GAAQ,CACX,MAAAhC,EACA,IAAA9I,EACA,aAAcqL,EAAK,aACnB,eAAgBA,EAAK,cACvB,CAAC,EACE,KAAMV,GAAQ,CACb,KAAKtI,GAAU,QAAQ,CACrB,UAAWuE,EACX,aAAcC,EACd,UAAAjC,EACA,SAAU,KAAK8F,GAAgBC,EAAK7B,CAAK,CAC3C,CAAC,EACD,KAAK1D,GAAQ,MAAM,CACjB,QAAS,kDACT,UAAAR,EACA,gBAAiBvE,EACjB,gBAAiBgL,EAAK,aACtB,GAAGF,CACL,CAAC,CACH,CAAC,EACA,MAAO3D,GAAO,CACb,KAAKnF,GAAU,eAAe,CAC5B,UAAWuE,EACX,aAAckC,EAAM,OACpB,UAAAlE,EACA,GAAA4C,CACF,CAAC,EACD,KAAKpC,GAAQ,MAAM,CACjB,QAAS,oDACT,UAAAR,EACA,gBAAiBvE,EACjB,gBAAiBgL,EAAK,aACtB,GAAGF,CACL,CAAC,CACH,CAAC,EACA,QAAQ,IAAM,CACb,KAAKf,GACH,uBAAuB/J,CAAQ,IAAIgL,EAAK,YAAY,GACpD,CACE,MAAOF,EAAU,QACjB,OAAQA,EAAU,QACpB,CACF,CACF,CAAC,EACI,EACT,EAKAc,GAA+B,IAAM,CACnC,KAAK5J,GAAU,OAAO,CACpB,YAAaZ,EAAY,YACzB,SAAU,KAAKsK,EACjB,CAAC,CACH,EAKAjC,GAAW,IAAM,CACf,KAAKzH,GAAU,OAAO,CACpB,YAAaZ,EAAY,WACzB,SAAU,KAAK2J,EACjB,CAAC,EACD,KAAK/I,GAAU,OAAO,CACpB,YAAaZ,EAAY,mBACzB,SAAU,KAAKyJ,EACjB,CAAC,EACD,KAAK7I,GAAU,OAAO,CACpB,YAAaZ,EAAY,WAEzB,SAAU,KAAK6J,EACjB,CAAC,EACD,KAAKjJ,GAAU,OAAO,CACpB,YAAaZ,EAAY,YACzB,SAAU,KAAK+J,EACjB,CAAC,EACD,KAAKnJ,GAAU,OAAO,CACpB,YAAaZ,EAAY,UACzB,SAAU,KAAKgK,EACjB,CAAC,EACD,KAAKpJ,GAAU,OAAO,CACpB,YAAaZ,EAAY,aACzB,SAAU,KAAKuK,EACjB,CAAC,EACD,KAAK3J,GAAU,OAAO,CACpB,YAAaZ,EAAY,oBACzB,SAAU,KAAKiK,EACjB,CAAC,EACD,KAAKrJ,GAAU,OAAO,CACpB,YAAaZ,EAAY,sBACzB,SAAU,KAAKqK,EACjB,CAAC,CACH,EAOAI,GACEtL,GAGAA,aAAiBN,GAEjB,OAAOM,GAAO,WAAc,WAO9BuL,GAAgBhM,GAA8B,CAC5C,MAAM2I,EAAQ,IAAI1G,EAAM,CACtB,GAAGjC,EACH,SAAU,KAAKkC,GACf,aAAc,KAAKC,EACrB,CAAC,EAED,OAAAwG,EAAM,KAAK,EAEX,KAAKM,GAAQ,IAAIjJ,EAAM,QAAS2I,CAAK,EACrC,KAAKO,GAAgB,IAAIP,EAAM,OAAQA,CAAK,EAC5C,KAAKQ,GAAa,IAAIR,EAAM,IAAKA,CAAK,EAC/BA,CACT,EAOAyC,GAAca,GAA8D,CAC1E,GAAI,OAAOA,GAAyB,SAClC,OAAO,KAAKhD,GAAQ,IAAIgD,CAAoB,EAG9C,MAAMC,EAAW,KAAKhD,GAAgB,IAAI+C,CAA8B,EACxE,OAAIC,GAEG,MAAM,KAAK,KAAKjD,GAAQ,OAAO,CAAC,EAAE,KACtCxI,GAAUA,EAAM,aAAewL,CAClC,CACF,EAEAE,GAAsB,IAAM,CAEtB,KAAK5C,KACT,KAAKA,GAAqB,YAAY,IAAM,CAC1C,MAAM6C,EAA0B,CAAC,EACjC,KAAKnD,GAAQ,QAASN,GAAU,CAC1BA,EAAM,WAAanH,EAAS,OAASmH,EAAM,OAAO,QACpDyD,EAAe,KAAKzD,CAAK,CAE7B,CAAC,EACDyD,EAAe,QAASzD,GAAU,CAChC,KAAM,CAAE,GAAAhB,CAAG,EAAIgB,EACf,KAAK,YAAYhB,CAAE,EACD,KAAKyB,GAAwB,IAAIzB,CAAE,GAC1C,QAASrH,GAAa,CAE/B,QAAQ,QAAQA,EAAS,CAAE,GAAAqH,CAAG,CAAC,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,CAClD,CAAC,CACH,CAAC,CACH,EAAG,GAAI,EACT,EAEA0E,GAA6B,IAAM,CACjC,GAAI,CAAC,KAAK9C,GAAoB,OACZ,MAAM,KAAK,KAAKN,GAAQ,OAAO,CAAC,EAAE,KACjDN,GAAUA,EAAM,WAAanH,EAAS,KACzC,IAEE,cAAc,KAAK+H,EAAkB,EACrC,KAAKA,GAAqB,KAE9B,EAEA+C,GAEEtM,GAQI,CACJ,KAAM,CACJ,IAAA2B,EACA,MAAAY,EACA,oBAAAgK,EAAsB,CAAC,EACvB,aAAA9J,EACA,QAAAJ,EACA,OAAAmK,EACA,QAAAC,CACF,EAAIzM,EACE,CACJ,MAAA0M,EAAQ,IACR,OAAAC,EAAS,IACT,IAAAC,EAAM,IACN,KAAAC,EAAO,GACT,EAAIN,EACJ,IAAI5D,EAAQ,KAAK0B,GAAgB1I,CAAG,EACpC,GAAIgH,EAEGA,EAAM,OAAO,QAChBA,EAAM,KAAK,CACT,YAAarH,EAAY,WACzB,YAAa,CAAC,CAChB,CAAC,MAEE,CAEL,MAAMwL,EAAiB,OAAO,QAAQ,CAAE,MAAAJ,EAAO,OAAAC,EAAQ,IAAAC,EAAK,KAAAC,CAAK,CAAC,EAC/D,OAAO,CAAC,CAAC,CAAE9K,CAAC,IAAMA,CAAC,EACnB,IAAI,CAAC,CAACgL,EAAGhL,CAAC,IAAM,GAAGgL,CAAC,IAAIhL,CAAC,EAAE,EAC3B,KAAK,GAAG,EAELqI,EAAc,OAAO,KAAKzI,EAAKY,EAAO,UAAUuK,CAAc,EAAE,EACtE,GAAK1C,EAgBH,WAAW,IAAM,CACf,GAAI,CACFoC,IAASnK,CAAO,CAClB,OAASqJ,EAAO,CACd,KAAKzG,GAAQ,MACX,+CAA+C5C,CAAO,MACnDqJ,EAAgB,OACnB,EACF,CACF,CACF,EAAG,CAAC,MAxBJ,kBAAW,IAAM,CACf,GAAI,CACFe,IAAUpK,CAAO,CACnB,OAASqJ,EAAO,CACd,KAAKzG,GAAQ,MACX,gDAAgD5C,CAAO,MACpDqJ,EAAgB,OACnB,EACF,CACF,CACF,EAAG,CAAC,EACE,IAAI,MAAM,kDAAkD,EAgBpEtB,EAAY,OAAS,KACrBzB,EAAQ,KAAKqD,GAAa,CACxB,QAAA3J,EACA,OAAQ+H,EACR,MAAA7H,EACA,IAAAZ,EACA,aAAAc,EACA,SAAUjB,EAAS,KACrB,CAAC,EAED,KAAK2K,GAAoB,CAC3B,CACA,OAAOxD,CACT,EAEAqE,GAEEhN,GASI,CACJ,KAAM,CACJ,IAAA2B,EACA,MAAAY,EACA,cAAA0K,EACA,aAAAxK,EACA,QAAAJ,EACA,OAAAmK,EACA,QAAAC,EACA,QAAAzI,EAAU,CAAC,CACb,EAAIhE,EAEEkN,EAAwBD,EAAc,eAAiB,SACvD,CACJ,aAAAE,EAAe,GACf,eAAAC,EAAiB,GACjB,cAAAC,EAAgB,CAAC,EACjB,oBAAAC,EAAsB,CAAC,EACvB,MAAAC,EAAQ,GACR,iBAAAC,EAAmB,EACrB,EAAIxJ,EACJ,GAAI,CAACzB,EAAO,MAAM,IAAI,MAAM,mBAAmB,EAC3C4K,GAAc,KAAKrB,GAA6B,EAEpD,MAAM2B,EAAQP,EAAsB,cAAc,QAAQ,EAC1DO,EAAM,aAAa,KAAMpL,CAAO,EAEhC,MAAMqL,EAAc,IAAM,CAExB,WAAW,IAAM,CACf,GAAI,CACFlB,IAASnK,CAAO,CAClB,OAASqJ,EAAO,CACd,KAAKzG,GAAQ,MACX,+CAA+C5C,CAAO,MACnDqJ,EAAgB,OACnB,EACF,CACF,CACF,EAAG,CAAC,EACJ,KAAKzG,GAAQ,MAAM,mCAAmC5C,CAAO,GAAG,EAChEoL,EAAM,oBAAoB,OAAQC,CAAW,CAC/C,EACMC,EAAqB,IAAM,CAE/B,WAAW,IAAM,CACf,GAAI,CACFlB,IAAUpK,CAAO,CACnB,OAASqJ,EAAO,CACd,KAAKzG,GAAQ,MACX,gDAAgD5C,CAAO,MACpDqJ,EAAgB,OACnB,EACF,CACF,CACF,EAAG,CAAC,EACJ,KAAKzG,GAAQ,MAAM,wCAAwC5C,CAAO,GAAG,EACrEoL,EAAM,oBAAoB,QAASE,CAAkB,CACvD,EACAF,EAAM,iBAAiB,OAAQC,CAAW,EAC1CD,EAAM,iBAAiB,QAASE,CAAkB,EAClDF,EAAM,aACJ,QACA,+CAA+CF,CAAK,EACtD,EACKH,GACHK,EAAM,aACJ,UACAH,EAAoB,OAAS,EACzBA,EAAoB,KAAK,GAAG,EAC5B,CAAC,GAAGvE,EAAiB,GAAGsE,CAAa,EAAE,KAAK,GAAG,CACrD,EAEFI,EAAM,aAAa,QAASlL,CAAK,EACjCkL,EAAM,aAAa,MAAO9L,CAAG,EACzB6L,GAAkBC,EAAM,aAAa,QAASD,CAAgB,EAClEP,EAAc,YAAYQ,CAAK,EAE/B,MAAMG,EAAgBV,EAAsB,eAC1C7K,CACF,EACA,OAAO,KAAK2J,GAAa,CACvB,QAAA3J,EACA,WAAYuL,EACZ,OAAQA,EAAc,cACtB,MAAArL,EACA,IAAAZ,EACA,aAAAc,EACA,SAAUjB,EAAS,KACrB,CAAC,CACH,EAEAqM,GAAe,CACblM,EACAoG,IACG,CACH,IAAI+F,EAAc,GAClB,cAAO,KAAK/F,CAAM,EAAE,QAASgG,GAAe,CAC1CD,GAAe,IACZA,EAAY,OAAS,IAAM,IAAM,mBAAmBC,CAAU,CACjE,IAAI,mBAAmBhG,EAAOgG,CAAU,CAAC,CAAC,EAC5C,CAAC,EAGCpM,GACEmM,GAAoBnM,EAAI,QAAQ,GAAG,GAAK,EAAI,IAAM,KAAOmM,EAA3C,GAEpB,EAOA,mBAAqB,CACnB9F,EACAD,IACG,CAEH,GAAIe,EAAuBd,CAAE,EAAG,CAC9B,MAAMgG,EAAW,KAAK,qBAAqBhG,CAAE,EAC7C,KAAKqB,GAAW,mBAAmB2E,EAAUjG,CAAM,CACrD,MAEE,KAAKsB,GAAW,mBAAmBrB,EAAID,CAAM,CAEjD,EAQA,qBACEkG,GACyB,CACzB,GAAI,CAACA,EAAO,MAAM,IAAI,MAAM,mBAAmB,EAE/C,MAAMjG,EAAK,IAAIjH,EAAgBkN,EAAM,GAAIA,EAAM,UAAU,EAGzD,IAAIC,EAAsC,CAAC,EAI3C,cAAO,KAAKD,CAAK,EAAE,QAASE,GAAa,CACvC,MAAMC,EAAYH,EAAME,CAAuC,EAC/D,GAAI,KAAKpC,GAAcqC,CAAS,EAAG,CAEjC,MAAMlL,EAAQ,IAAInD,EAAiB,CACjC,KAAMqO,EAAU,MAAQD,EACxB,SAAUnG,EAAG,EACf,CAAC,EAQD,GANA,OAAO,eAAeA,EAAImG,EAAU,CAClC,MAAOjL,EACP,WAAY,EACd,CAAC,EAGIkL,aAA6BjO,EAAY,CAE5C,MAAMkO,EAAW,CAAC,CAChB,YAAAC,EACA,aAAAC,CACF,IAIE,KAAK,cAAc,CACjB,MAAArL,EAEA,YAAAoL,EAEA,aAAAC,CACF,CAAC,EAEGhO,EAAS6N,EAAoC,UACjDC,CACF,EACAH,EAAc,KAAK,IAAM,CACtBE,EAAoC,YAAY7N,CAAK,CACxD,CAAC,CACH,KAAO,CAGL,MAAMA,EAAS6N,EAAkB,YAC/B,CAACvO,EAAsBkI,EAAa/D,IAClC,KAAK,cAAc,CACjB,MAAAd,EAEA,YAAa6E,EAEb,aAAc/D,CAChB,CAAC,CACL,EACAkK,EAAc,KAAK,IAAM,CAEtBE,EAAkB,cAAc7N,CAAK,CACxC,CAAC,CACH,CACF,SAAWyB,EAAWoM,CAAS,IAE7B,OAAO,eAAepG,EAAImG,EAAU,CAClC,MAAO,SAAUK,IAAoB,CACnC,MAAMC,EAAS,MAAML,EAAU,GAAGI,CAAI,EACtC,OAAO1F,EAAuB2F,CAAM,EAChC,KAAK,qBAAqBA,CAAM,EAChCA,CACN,EACA,WAAY,EACd,CAAC,EAGGN,IAAa,WAAW,CAE1B,MAAMO,EAAc1G,EAAG,QACvB,OAAO,eAAeA,EAAImG,EAAU,CAClC,MAAO,KAGLnG,EAAG,SAAS,EACL0G,EAAY,MAAM1G,CAAE,GAE7B,WAAY,EACd,CAAC,CACH,CAEJ,CAAC,EAKDA,EAAG,SAAW,IAAM,CAClBkG,EAAc,QAASS,GAAU,CAC/BA,IAAQ,CACV,CAAC,EACDT,EAAgB,CAAC,CACnB,EAEOlG,CACT,EAKA,MAAQ,IAAM,CACR,KAAKuB,KACP,cAAc,KAAKA,EAAkB,EACrC,KAAKA,GAAqB,MAE5B,KAAKK,GAAqB,EAC1B,KAAK1H,GAAU,MAAM,EACrB,OAAO,oBAAoB,eAAgB,KAAK0H,EAAoB,EACpE,KAAK3E,GAAQ,MACX,2BAA2B,KAAK,MAAM,oBACpC,KAAKD,EACP,EACF,CACF,EAOA,cAAgB,MAKd+C,GACG,CACH,KAAM,CACJ,MAAO,CAAE,GAAAJ,EAAI,KAAA1H,CAAK,EAClB,YAAAqO,EACA,aAAAC,EAAe,CAAC,CAClB,EAAIxG,EACE,CACJ,aAAA6G,EAAe,KACf,QAAAzL,EAAU,KACV,OAAQ0L,EAAe,KACvB,QAAAxM,CACF,EAAIkM,EAEErO,EAAWyH,EAAG,MAAM,GAAG,EAAE,CAAC,EAE1BmH,EAAezM,GAAWwM,EAC1BE,EAAcD,EAAe,KAAK1D,GAAW0D,CAAY,EAAI,KAE7DE,EAAkBD,EACpB,KAAK,mBAAmB7O,EAAU,CAAE,MAAO6O,CAAY,CAAC,EACxD,KAAK,mBAAmB7O,CAAQ,EACpC,GAAI,CAAC8O,EACH,YAAK/J,GAAQ,KACX,6BAA6BhF,CAAI,sBAAsBC,CAAQ,EACjE,EACO,QAAQ,QAAQ,CAAC,CAAC,EAG3B,MAAM+O,EAAwB,CAE5B,OAAQD,EAAgB,QAAQ,EAChC,UAAW/O,EACX,YAAAqO,EACA,aAAAM,EACA,aAAc,CACZ,eAAgB,EAClB,CACF,EAEIzL,GAAW,CAAC,OAAO,MAAMA,CAAO,IAClC8L,EAAS,aAAe,CACtB,eAAgB,GAChB,QAAS,OAAO9L,CAAO,CACzB,GAIF,MAAM+L,EAAyC,CAAC,EAChD,IAAIC,EAAsB,GAE1B,MAAMC,EAAmBzG,GAAiB,CACxC,MAAMqC,EAAYrC,EAAM,QAAQ,EAC5BxF,GAAWwF,GAAO,cAAc,eAClCuG,EAAc,KAAKvG,EAAM,cAAcsG,EAAU9L,CAAO,CAAC,EACpDgM,IACH,KAAKnF,GACH,yBAAyBgF,EAAgB,EAAE,IAAI/O,CAAI,GACnD,CACE,MAAO,KAAK,OACZ,OAAQ,OAAO,SAAS,IAC1B,CACF,EACAkP,EAAsB,IAExB,KAAKlK,GAAQ,MAAM,CACjB,QAAS,yCACT,iBAAkB0C,EAClB,GAAGqD,CACL,CAAC,IAEDrC,EAAM,KAAK,CACT,YAAarH,EAAY,YACzB,YAAa2N,CACf,CAAC,EACD,KAAKhK,GAAQ,MAAM,CACjB,QAAS,mBACT,iBAAkB0C,EAClB,GAAGqD,CACL,CAAC,EAEL,EAEA,OAAI+D,EAEFK,EAAgBL,CAAW,EAE3B,KAAK9F,GAAQ,QAAQmG,CAAe,EAIrB,MAAM,QAAQ,IAAIF,CAAa,EAC7C,KAAMG,IACL,KAAKpK,GAAQ,MAAM,CACjB,QAAS,0BACT,iBAAkB0C,CACpB,CAAC,EAEM9F,EAAQwN,CAAM,EACtB,EACA,MAAOhI,GAAc,CACpB,WAAKpC,GAAQ,MAAM,CACjB,QAAS,yBACT,QAAS0C,EACT,UAAWN,CACb,CAAC,EACKA,CACR,CAAC,EACA,QAAQ,IAAM,CACT8H,GACF,KAAKlF,GACH,yBAAyB+E,EAAgB,EAAE,IAAI/O,CAAI,GACnD,CACE,MAAO,KAAK,OACZ,OAAQ,OAAO,SAAS,IAC1B,CACF,CACJ,CAAC,CAGL,EAMA,UAAY,IAAoB,MAAM,KAAK,KAAKgJ,GAAQ,OAAO,CAAC,EAQhE,mBAAqB,CACnB/I,EACA6H,IAEA,KAAKsB,GAAW,UAAUnJ,EAAU6H,GAAQ,KAAK,EAOnD,UACE/H,GACU,CACV,KAAM,CACJ,GAAIqC,EACJ,IAAAV,EACA,cAAAsL,EACA,MAAA1K,EACA,aAAAE,EAAe,CAAC,EAChB,OAAA+J,EACA,QAAAC,EACA,QAAAzI,EAAU,CAAC,CACb,EAAIhE,EACJ,GAAI,CAACqC,EAAS,MAAM,IAAI,MAAM,sCAAsC,EAEpE,IAAIiN,EAAajN,EACjB,GAAI,KAAK4G,GAAQ,IAAIqG,CAAU,EAAG,CAChC,IAAIC,EAAU,EACd,KAAO,KAAKtG,GAAQ,IAAI,GAAG5G,CAAO,IAAIkN,CAAO,EAAE,GAC7CA,GAAW,EAEbD,EAAa,GAAGjN,CAAO,IAAIkN,CAAO,EACpC,CACA,KAAM,CAAE,SAAA7M,EAAWlB,EAAS,MAAO,oBAAA+K,EAAsB,CAAC,CAAE,EAAIvI,EAE1DwL,EAAS,KAAK3B,GAAalM,EAAKc,CAAY,EAClD,IAAIkG,EAAsB,KAM1B,GAJA,KAAKqB,GAAa,iBAAkB,CAClC,MAAOsF,EACP,OAAQE,CACV,CAAC,EACG9M,IAAalB,EAAS,MACxBmH,EAAQ,KAAK2D,GAAgB,CAC3B,QAASgD,EACT,IAAKE,EACL,MAAAjN,EACA,aAAAE,EACA,oBAAA8J,EACA,OAAAC,EACA,QAAAC,CACF,CAAC,UACQ/J,IAAalB,EAAS,MAC/BmH,EAAQ,KAAKqE,GAAgB,CAC3B,QAASsC,EACT,IAAKE,EACL,MAAAjN,EACA,cAAA0K,EACA,aAAAxK,EACA,OAAA+J,EACA,QAAAC,EACA,QAAAzI,CACF,CAAC,MAED,OAAM,IAAI,MAAM,qBAAqBtB,CAAkB,EAAE,EAG3D,YAAKuC,GAAQ,MAAM,CACjB,QAAS,eACT,GAAG0D,EAAM,QAAQ,CACnB,CAAC,EACMA,CACT,EAMA,WACE3I,GACG,CACH,KAAM,CACJ,GAAA2H,EACA,IAAAhG,EACA,cAAAsL,EACA,MAAA1K,EACA,iBAAAkN,EAAmB,CAAC,EACpB,QAAAzL,EAAU,CAAC,CACb,EAAIhE,EAEJyP,EAAiB,QAAQ,CAAChN,EAAc0E,IAAU,CAChD,KAAK,UAAU,CACb,GAAI,GAAGQ,CAAE,IAAIR,CAAK,GAClB,IAAAxF,EACA,MAAAY,EACA,cAAA0K,EACA,aAAAxK,EACA,QAAAuB,CACF,CAAC,CACH,EAAG,IAAI,CACT,EAMA,0BAA6B3B,GAAqB,CAChD,KAAKgH,GAAW,0BAA0BhH,CAAO,CACnD,EAOA,sBAAwB,CACtBnC,EACAmC,IACG,CACH,KAAKgH,GAAW,sBAAsBnJ,EAAUmC,CAAO,CACzD,EAMA,YAAeqN,GAAqB,CAElC,KAAKzK,GAAQ,YAAYyK,CAAK,EAE9B,KAAKzG,GAAQ,QAAQ,KAAKyB,EAAoB,EAC9C,KAAKzF,GAAQ,MAAM,wCAAwC,CAC7D,EAOA,YAAegH,GAA8D,CAE3E,MAAMtD,EAAQ,KAAKyC,GAAWa,CAAoB,EAC9CtD,IAEFA,EAAM,QAAQ,EAEd,KAAKO,GAAgB,OAAOP,EAAM,MAAM,EACxC,KAAKQ,GAAa,OAAOR,EAAM,GAAG,EAClC,KAAKM,GAAQ,OAAON,EAAM,EAAE,EAC5B,KAAK1D,GAAQ,MAAM,CACjB,QAAS,6BACT,GAAG0D,EAAM,QAAQ,CACnB,CAAC,EAED,KAAK0D,GAA2B,EAEpC,EAQA,aAAgBrM,GAA2B,CACzC,KAAM,CAAE,GAAA2H,EAAI,mBAAAgI,CAAmB,EAAI3P,EAC7B2G,EAAY,KAAKyC,GAAwB,IAAIzB,CAAE,GAAK,CAAC,EAC3DhB,EAAU,KAAKgJ,CAAkB,EACjC,KAAKvG,GAAwB,IAAIzB,EAAIhB,CAAS,CAChD,CACF,C","sources":["webpack://ice.host/webpack/universalModuleDefinition","webpack://ice.host/webpack/bootstrap","webpack://ice.host/webpack/runtime/define property getters","webpack://ice.host/webpack/runtime/hasOwnProperty shorthand","webpack://ice.host/webpack/runtime/make namespace object","webpack://ice.host/../common/dist/esm/event.js","webpack://ice.host/../common/dist/esm/scriptingObject.js","webpack://ice.host/../common/dist/esm/messageType.js","webpack://ice.host/./lib/types.ts","webpack://ice.host/./lib/utils.ts","webpack://ice.host/./lib/guest.ts","webpack://ice.host/../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/native.js","webpack://ice.host/../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/rng.js","webpack://ice.host/../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/stringify.js","webpack://ice.host/../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/v4.js","webpack://ice.host/../common/dist/esm/remoting.js","webpack://ice.host/../common/dist/esm/scriptingObjectManager.js","webpack://ice.host/../common/dist/esm/proxy.js","webpack://ice.host/./lib/host.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ice\"] = factory();\n\telse\n\t\troot[\"ice\"] = root[\"ice\"] || {}, root[\"ice\"][\"host\"] = factory();\n})(globalThis, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","class Event {\n /* eslint-enable indent */\n /**\n * name of the event\n */\n name;\n /**\n * scripting object id that owns this event\n */\n objectId;\n /**\n * unique id of the event\n */\n id;\n /**\n * Create an event object\n * @param {EventParam} param - parameters for creating an event\n */\n constructor(param) {\n const { name, objectId } = param;\n if (!name) throw new Error(\"Event name is required\");\n if (!objectId) throw new Error(\"Scripting object id is required\");\n this.objectId = objectId;\n this.name = name;\n this.id = `${this.objectId}.${this.name}`.toLowerCase();\n }\n}\nclass ProxyEvent {\n /**\n * check if given object is an instance of ProxyEvent\n * @param obj object to be compared\n * @returns true if given object is an instance of ProxyEvent\n */\n static [Symbol.hasInstance](obj) {\n return typeof obj === \"object\" && obj !== null && \"getType\" in obj && typeof obj.getType === \"function\" && obj.getType() === \"ProxyEvent\";\n }\n /* eslint-enable indent */\n /**\n * module that owns this event management. SSF Guest or App Bridge host\n */\n #eventSrc;\n /**\n * unique id of scripting object\n */\n objectId;\n /**\n * name of the event\n */\n name;\n /**\n * unique id of the event\n */\n id;\n /**\n * get type of the object\n * @returns type of the object\n */\n getType() {\n return \"ProxyEvent\";\n }\n /**\n * Create a new instance of the Scripting Object Proxy Event\n * @param {ProxyEventParam} param - parameter for the constructor\n */\n constructor(param) {\n const { name, objectId, eventSrc } = param;\n if (!name) throw new Error(\"Event name is required\");\n if (!objectId) throw new Error(\"Scripting object id is required\");\n if (!eventSrc) throw new Error(\"Event source is required\");\n this.objectId = objectId;\n this.name = name;\n this.#eventSrc = eventSrc;\n this.id = `${this.objectId}.${this.name}`.toLowerCase();\n }\n /**\n * subscribe to an scripting object event\n * @param callback event listener\n * @returns subscription token\n */\n subscribe = (callback) => this.#eventSrc.subscribe({\n eventId: this.id,\n callback\n });\n /**\n * unsubscribe from an scripting object event\n * @param token subscription token\n */\n unsubscribe = (token) => {\n this.#eventSrc.unsubscribe({\n eventId: this.id,\n token\n });\n };\n}\nconst isEvent = (value) => value instanceof Event;\nconst getEventId = (objectId, eventName) => `${objectId.toLowerCase()}.${eventName.toLowerCase()}`;\nexport {\n Event,\n ProxyEvent,\n getEventId,\n isEvent\n};\n","import { isEvent } from \"./event.js\";\nconst FUNCTION = \"function\";\nconst isPublicFunction = (value, fnName) => typeof value === FUNCTION && !!fnName && !fnName.startsWith(\"_\");\nclass ScriptingObject {\n /**\n * unique id of the scripting object\n */\n #id;\n /**\n * type of the scripting object\n */\n #objectType = \"Object\";\n /**\n * Creates an instance of ScriptingObject.\n * @param objectId unique id of the scripting object\n * @param objectType type of the scripting object\n */\n constructor(objectId, objectType) {\n this.#id = objectId;\n this.#objectType = objectType || this.#objectType;\n }\n /**\n * get unique id of the scripting object\n */\n get id() {\n return this.#id;\n }\n /**\n * get type of the scripting object\n */\n get objectType() {\n return this.#objectType;\n }\n /**\n * transform the scripting object to a format suitable for transmitting over window.postMessage\n * @returns marshalled scripting object\n */\n // eslint-disable-next-line no-underscore-dangle\n _toJSON = () => {\n const functions = [];\n const events = [];\n Object.keys(this).forEach((property) => {\n const value = this[property];\n if (isEvent(value)) {\n events.push(property);\n } else if (isPublicFunction(value, property)) {\n functions.push(property);\n }\n });\n return {\n objectId: this.#id,\n objectType: this.#objectType,\n functions,\n events\n };\n };\n /**\n * dispose the scripting object\n */\n // eslint-disable-next-line no-underscore-dangle\n _dispose = () => {\n };\n /**\n * dispose the scripting object\n */\n dispose = () => {\n };\n}\nexport {\n ScriptingObject,\n isPublicFunction\n};\n","var MessageType = /* @__PURE__ */ ((MessageType2) => {\n MessageType2[\"GuestClose\"] = \"guest:close\";\n MessageType2[\"GuestEventSubscribe\"] = \"guest:eventSubscribe\";\n MessageType2[\"GuestEventUnsubscribe\"] = \"guest:eventUnsubscribe\";\n MessageType2[\"GuestFocus\"] = \"guest:focus\";\n MessageType2[\"GuestReady\"] = \"guest:ready\";\n MessageType2[\"GuestReadyComplete\"] = \"guest:readyComplete\";\n MessageType2[\"GuestResize\"] = \"guest:resize\";\n MessageType2[\"HandShake\"] = \"handshake\";\n MessageType2[\"HandShakeAck\"] = \"handshake:ack\";\n MessageType2[\"HostClose\"] = \"host:close\";\n MessageType2[\"HostConfig\"] = \"host:config\";\n MessageType2[\"ListObjects\"] = \"list:objects\";\n MessageType2[\"ObjectEvent\"] = \"object:event\";\n MessageType2[\"ObjectGet\"] = \"object:get\";\n MessageType2[\"ObjectInvoke\"] = \"object:invoke\";\n return MessageType2;\n})(MessageType || {});\nexport {\n MessageType\n};\n","import type {\n IScriptingObject,\n RemotingScriptingObject,\n} from '@elliemae/pui-scripting-object';\n\nexport enum OpenMode {\n /**\n * open as a popup window\n */\n Popup = 'popup',\n /**\n * open as an embedded iframe\n */\n Embed = 'embed',\n}\n\nexport type ValueOf<T> = T[keyof T];\n\n/**\n * allowed sandbox values for the guest application\n */\nexport enum IFrameSandboxValues {\n AllowDownloadsWithoutUserActivation = 'allow-downloads-without-user-activation',\n AllowDownloads = 'allow-downloads',\n AllowForms = 'allow-forms',\n AllowModals = 'allow-modals',\n AllowOrientationLock = 'allow-orientation-lock',\n AllowPointerLock = 'allow-pointer-lock',\n AllowPopups = 'allow-popups',\n AllowPopupsToEscapeSandbox = 'allow-popups-to-escape-sandbox',\n AllowPresentation = 'allow-presentation',\n AllowSameOrigin = 'allow-same-origin',\n AllowScripts = 'allow-scripts',\n AllowStorageAccessByUserActivation = 'allow-storage-access-by-user-activation',\n AllowTopNavigation = 'allow-top-navigation',\n AllowTopNavigationByUserActivation = 'allow-top-navigation-by-user-activation',\n}\n\nexport type GenericFunction = (...args: unknown[]) => unknown;\n\nexport type EventObject = {\n object: RemotingScriptingObject;\n eventName: string;\n eventParams: Record<string, unknown>;\n eventHandler: string | null;\n eventOptions: {\n allowsFeedback: boolean;\n timeout?: number;\n };\n};\n\n/**\n * features for the popup window\n */\nexport type WindowFeatures = {\n /**\n * width of the popup window\n */\n width?: number;\n /**\n * height of the popup window\n */\n height?: number;\n /**\n * top position of the popup window\n */\n top?: number;\n /**\n * left position of the popup window\n */\n left?: number;\n};\n\n/**\n * configuration options for rendering a guest application\n *\n */\nexport type GuestOptions = {\n /**\n * mode of opening the guest application, popup or embed\n * @default OpenMode.Embed\n */\n openMode?: OpenMode;\n /**\n * flag to disable sandboxing for iframe\n * @default false\n */\n disableSandbox?: boolean;\n /**\n * additional sandbox values for the iframe. These values will be added in addition to the default sandbox values.\n * @default [IFrameSandboxValues.AllowScripts, IFrameSandboxValues.AllowPopups, IFrameSandboxValues.AllowModals, IFrameSandboxValues.AllowForms, IFrameSandboxValues.AllowDownloads, IFrameSandboxValues.AllowSameOrigin ]\n */\n sandboxValues?: Array<IFrameSandboxValues>;\n /**\n * custom sandbox values for the iframe. These values will replace the default sandbox values entirely.\n */\n customSandboxValues?: Array<IFrameSandboxValues>;\n /**\n * resize the iframe to fit the content inside\n * @default true\n */\n fitToContent?: boolean;\n /**\n * css style for the iframe\n */\n style?: string;\n /**\n * features for the popup window\n * @default { width: 800, height: 600, top: 100, left: 100 }\n */\n popupWindowFeatures?: WindowFeatures;\n /**\n * permission policy for the guest iframe\n * check https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe#allow for more details\n * @example \"microphone 'self' https://example.com; geolocation 'none'\"\n */\n permissionPolicy?: string;\n};\n\n/**\n * collection of scripting objects\n */\nexport type ScriptingObjects = Record<string, IScriptingObject>;\n\n/**\n * parameters for attaching a guest\n */\nexport type AttachParam = {\n /**\n * unique id of the guest application\n */\n guestId: string;\n /**\n * url of the guest application\n */\n url: string;\n /**\n * page title for the guest application\n */\n title: string;\n /**\n * dom element to attach the guest application to\n */\n domElement?: HTMLIFrameElement;\n /**\n * window object of the guest application\n */\n window: Window;\n /**\n * open mode of the guest application\n */\n openMode: OpenMode;\n /**\n * additional parameters for the guest application\n */\n searchParams?: Record<string, string | number | boolean>;\n};\n","import { GenericFunction } from './types.js';\n\nexport const getOrigin = (url: string) => {\n if (url === 'about:blank') return '*';\n try {\n const { origin } = new URL(url);\n return origin === 'null' || !origin ? url : origin;\n } catch (e) {\n const { origin } = new URL(url, document.baseURI);\n return origin;\n }\n};\n\nexport const flatten = (source: unknown[]): unknown[] =>\n source.flat(Infinity).filter((v) => v !== undefined);\n\nexport function isFunction(value: any): value is GenericFunction {\n return typeof value === 'function';\n}\n","import { IAnalytics } from '@elliemae/pui-scripting-object';\nimport { Remoting, MessageType } from '@elliemae/microfe-common';\nimport { EventObject, OpenMode } from './types.js';\nimport { getOrigin } from './utils.js';\n\n/**\n * options for creating a guest application\n */\ntype GuestOption = {\n /**\n * unique id of the guest application\n */\n guestId: string;\n /**\n * page title of the guest application\n */\n title: string;\n /**\n * url of the guest application\n */\n url: string;\n /**\n * iframe element of the guest application\n */\n domElement?: HTMLIFrameElement;\n /**\n * window object of the guest application\n */\n window: Window;\n /**\n * open mode of the guest application\n */\n openMode: OpenMode;\n /**\n * individual query parameters of the guest application's url parameter string\n */\n searchParams?: Record<string, unknown>;\n /**\n * remoting object\n */\n remoting: Remoting;\n /**\n * analytics object\n */\n analyticsObj: IAnalytics;\n};\n\n/**\n * message to be sent\n */\nexport type MessageParam = {\n /**\n * type of the message\n */\n messageType: string;\n /**\n * body of the message\n */\n messageBody: unknown;\n};\n\n/**\n * Object repesenting guest application\n */\nexport class Guest {\n /**\n * unique id of the guest application\n */\n public readonly id: string;\n\n /**\n * page title of the guest application\n */\n public readonly title: string;\n\n /**\n * url of the guest application\n */\n public readonly url: string;\n\n /**\n * individual query parameters of the guest application's url parameter string\n */\n public readonly searchParams: Record<string, unknown>;\n\n /**\n * iframe element of the guest application\n */\n public readonly domElement: HTMLIFrameElement | null;\n\n /**\n * window object of the guest application\n */\n public readonly window: Window;\n\n /**\n * open mode of the guest application\n */\n public readonly openMode: OpenMode;\n\n /**\n * origin of the guest application\n */\n public readonly origin: string;\n\n /**\n * flag indicating if the guest application is initialized\n */\n public initialized = false;\n\n /**\n * flag indicating if the guest application is ready\n */\n public ready = false;\n\n /**\n * capabilities of the guest application\n */\n public capabilities: Record<string, unknown>;\n\n /**\n * remoting object\n */\n #remoting: Remoting;\n\n /**\n * analytics object\n */\n #analyticsObj: IAnalytics;\n\n /**\n * Create object representing guest application\n * @param {GuestOption} option - options for creating a guest application\n */\n constructor(option: GuestOption) {\n const {\n guestId,\n domElement = null,\n title,\n url,\n window,\n searchParams = {},\n openMode = OpenMode.Embed,\n remoting,\n analyticsObj,\n } = option;\n this.id = guestId;\n this.title = title;\n this.url = url;\n this.origin = getOrigin(url);\n this.searchParams = searchParams;\n this.domElement = domElement;\n this.window = window;\n this.openMode = openMode;\n this.capabilities = {};\n this.#analyticsObj = analyticsObj;\n this.#remoting = remoting;\n }\n\n /**\n * clean up resources\n */\n dispose = () => {\n if (this.openMode === OpenMode.Popup && !this.window.closed) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n this.window.document;\n this.window.close();\n } catch (e) {\n this.#remoting.send({\n targetWin: this.window,\n targetOrigin: this.origin,\n messageType: MessageType.HostClose,\n messageBody: {},\n });\n }\n } else {\n this.domElement?.remove?.();\n }\n // remove guest window from allowed list\n this.#remoting.removeSender({ origin: this.origin, window: this.window });\n };\n\n /**\n * Get information about the guest application\n * @returns guest properties\n */\n getInfo = () => ({\n guestId: this.id,\n guestTitle: this.title,\n guestUrl: this.url,\n });\n\n /**\n * Handshake with the guest application in the popup window\n * @returns true if the guest popup window is open & connected\n */\n handShake = () =>\n new Promise<boolean>((resolve) => {\n let handShakeCount = 0;\n const handShakeRetries = 5;\n let handShakeHandle: ReturnType<typeof setInterval>;\n const onAck = () => {\n clearInterval(handShakeHandle);\n this.#remoting.unlisten({\n messageType: MessageType.HandShakeAck,\n callback: onAck,\n });\n resolve(true);\n };\n handShakeHandle = setInterval(() => {\n if (handShakeCount >= handShakeRetries) {\n clearInterval(handShakeHandle);\n this.#remoting.unlisten({\n messageType: MessageType.HandShakeAck,\n callback: onAck,\n });\n resolve(false);\n } else {\n this.#remoting.send({\n targetWin: this.window,\n targetOrigin: this.origin,\n messageType: MessageType.HandShake,\n messageBody: {},\n });\n handShakeCount += 1;\n }\n }, 1000);\n this.#remoting.listen({\n messageType: MessageType.HandShakeAck,\n callback: onAck,\n });\n });\n\n /**\n * initialize guest messaging\n */\n init = () => {\n // add guest window to the allowed list\n this.#remoting.addSender({ origin: this.origin, window: this.window });\n // for popup guests, we need to provide the guest with the host's window\n if (this.openMode === OpenMode.Popup) {\n this.handShake().catch(() => {});\n }\n };\n\n /**\n * invokes event callback on the guest application\n * @param {EventObject} event - event object\n * @param {number} timeout - timeout in milliseconds\n */\n dispatchEvent = (event: EventObject, timeout: number) => {\n this.#analyticsObj\n .startTiming(\n `ScriptingObject.Event.${event.object.objectId}.${event.eventName}`,\n {\n appId: this.id,\n appUrl: this.url,\n },\n )\n .catch(() => {});\n return this.#remoting\n .invoke({\n targetWin: this.window,\n targetOrigin: this.origin,\n messageType: MessageType.ObjectEvent,\n messageBody: event,\n responseTimeoutMs: timeout,\n })\n .finally(() => {\n this.#analyticsObj\n .endTiming(\n `ScriptingObject.Event.${event.object.objectId}.${event.eventName}`,\n {\n appId: this.id,\n appUrl: this.url,\n },\n )\n .catch(() => {});\n });\n };\n\n /**\n * Send a message without any form of response. fire and forget\n * @param {MessageParam} param - message to be sent\n */\n send = (param: MessageParam) => {\n this.#remoting.send({\n targetWin: this.window,\n targetOrigin: this.origin,\n ...param,\n });\n };\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import { v4 as uuidv4 } from \"uuid\";\nconst MESSAGE_SOURCE = \"elli:remoting\";\nconst RESPONSE_MESSAGE_TYPE = \"elli:remoting:response\";\nconst EXCEPTION_MESSAGE_TYPE = \"elli:remoting:exception\";\nconst createMessage = ({\n messageType,\n messageBody,\n requestId,\n onewayMsg = false\n}) => ({\n requestId: requestId ?? (!onewayMsg ? uuidv4() : null),\n source: MESSAGE_SOURCE,\n type: messageType,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n body: messageBody\n});\nconst sendMessage = (param) => {\n const { targetWin, targetOrigin, messageType, messageBody } = param;\n const msg = createMessage({ messageType, messageBody });\n targetWin.postMessage(msg, targetOrigin);\n};\nclass Remoting {\n #correlationId;\n #logger;\n /**\n * set of listeners that are registered\n */\n #listeners = /* @__PURE__ */ new Map();\n /**\n * Represents the set of invocations that are waiting for a response\n */\n #invocations = /* @__PURE__ */ new Map();\n /**\n * The handle to the timeout monitor\n */\n #timeoutMonitorHandle = null;\n /**\n * The window that remoting was initialized on\n */\n #initializedWindow = null;\n /**\n * The set of windows that are allowed to send messages to this window\n */\n #allowedSenders = /* @__PURE__ */ new Map();\n /**\n * Create a new instance of the Remoting class\n * @param logger pui-diagnostic logger\n * @param correlationId unique id for the current session\n */\n constructor(logger, correlationId) {\n if (!logger) throw new Error(\"logger is required\");\n if (!correlationId) throw new Error(\"correlationId is required\");\n this.#correlationId = correlationId;\n this.#logger = logger;\n }\n // Evaluates the timeouts on any waiting invocations and schedules the next check\n #evaluateTimeouts = () => {\n this.#timeoutMonitorHandle = null;\n const ts = Date.now();\n const canceledItems = [];\n let nextCancelTime = null;\n this.#invocations.forEach((eventData, key) => {\n const { requestId, cancelTime } = eventData;\n if (cancelTime && cancelTime <= ts) {\n this.#logger.debug(\n `Detected response timeout for requestId: ${requestId}...`\n );\n canceledItems.push(key);\n eventData.resolve(void 0);\n } else if (cancelTime) {\n nextCancelTime = nextCancelTime === null ? cancelTime : Math.min(nextCancelTime, cancelTime);\n }\n });\n canceledItems.forEach((key) => {\n this.#invocations.delete(key);\n });\n if (nextCancelTime !== null) {\n const delay = Math.max(nextCancelTime - Date.now(), 0);\n this.#scheduleTimeoutCheck(delay);\n }\n };\n // Schedule a timeout check after a delay\n #scheduleTimeoutCheck = (delayMs) => {\n if (this.#timeoutMonitorHandle !== null) return;\n this.#timeoutMonitorHandle = window.setTimeout(\n this.#evaluateTimeouts,\n delayMs\n );\n };\n // Stops the timeout monitor\n #stopResponseMonitor = () => {\n if (this.#timeoutMonitorHandle !== null) {\n window.clearTimeout(this.#timeoutMonitorHandle);\n this.#timeoutMonitorHandle = null;\n }\n };\n // Pops an invocation from the incovation list\n #popInvocation = (requestId) => {\n const e = this.#invocations.get(requestId);\n this.#logger.debug(`serving requestId: ${requestId}`);\n this.#invocations.delete(requestId);\n return e;\n };\n // Handles a response to a prior cross-frame invocation\n #processResponse = (message) => {\n const { requestId } = message;\n this.#logger.debug(\n `Response received for invocation requestId: ${requestId}`\n );\n const eventData = this.#popInvocation(requestId);\n if (!eventData) {\n this.#logger.debug(\n `Received response to stale/invalid request with requestId: ${requestId}`\n );\n return false;\n }\n eventData.resolve(message.body);\n return true;\n };\n // Handles a response to a prior cross-frame invocation\n #processException = (message) => {\n this.#logger.debug(\n `Exception received for invocation (requestId = ${message.requestId})`\n );\n const eventData = this.#popInvocation(message.requestId);\n if (!eventData) {\n this.#logger.warn(\n `Received exception for stale/invalid request (requestId = ${message.requestId})`\n );\n return false;\n }\n eventData.reject(new Error(message.body));\n return true;\n };\n // Receives a message from another window and invokes any event handlers\n #receive = ({\n sourceWin,\n sourceOrigin,\n message\n }) => {\n this.#logger.debug(`Received message of type \"${message.type}\"`);\n const callbacks = this.#listeners.get(message.type);\n if (!callbacks) return false;\n callbacks.forEach((callback) => {\n this.#logger.debug(`Invoking message handler ${callback.name}`);\n callback({\n sourceWin,\n sourceOrigin,\n requestId: message.requestId,\n type: message.type,\n body: message.body\n });\n });\n return true;\n };\n // Processes a message received thru the window's message event\n #processMessage = (message) => {\n if (this.#allowedSenders.size === 0) return false;\n if (!message.source) return false;\n const senderOrigin = this.#allowedSenders.get(message.source);\n if (!senderOrigin) return false;\n if (message?.data?.source !== MESSAGE_SOURCE) return false;\n this.#logger.debug(\n `Remoting: Received message of type \"${message.data.type}\"`\n );\n if (message.data.type === RESPONSE_MESSAGE_TYPE)\n this.#processResponse(message.data);\n else if (message.data.type === EXCEPTION_MESSAGE_TYPE)\n this.#processException(message.data);\n else\n this.#receive({\n sourceWin: message.source,\n sourceOrigin: senderOrigin,\n message: message.data\n });\n return true;\n };\n /**\n * Adds window and its origin list of allowed senders\n * @param {AddSenderParam} param - The sender to add\n */\n addSender = (param) => {\n const { origin, window: window2 } = param;\n if (!origin) throw new Error(\"origin is required\");\n if (!window2) throw new Error(\"window is required\");\n this.#allowedSenders.set(window2, origin);\n };\n /**\n * Initializes the remoting service for a window\n * @param win The window to initialize remoting for\n */\n initialize = (win) => {\n if (this.#initializedWindow) {\n this.#initializedWindow.removeEventListener(\n \"message\",\n this.#processMessage\n );\n }\n win.addEventListener(\"message\", this.#processMessage);\n this.#initializedWindow = win;\n this.#logger.debug(`initialized remoting id: ${this.#correlationId}`);\n };\n /**\n * Closes the remoting service for a window\n */\n close = () => {\n if (this.#initializedWindow) {\n this.#initializedWindow.removeEventListener(\n \"message\",\n this.#processMessage\n );\n this.#initializedWindow = null;\n }\n this.#stopResponseMonitor();\n this.#logger.debug(`closed remoting id: ${this.#correlationId}`);\n };\n /**\n * Sends an invocation which generates a Promise to be used to get a response\n * @param {InvokeParam} param The parameters for the invocation\n * @returns promisifyed response\n */\n invoke = (param) => {\n const {\n targetWin,\n targetOrigin,\n messageType,\n messageBody,\n responseTimeoutMs\n } = param;\n return new Promise((resolve, reject) => {\n const msg = createMessage({ messageType, messageBody });\n this.#invocations.set(msg.requestId, {\n requestId: msg.requestId,\n resolve,\n reject,\n cancelTime: responseTimeoutMs ? Date.now() + responseTimeoutMs : null\n });\n targetWin.postMessage(msg, targetOrigin);\n const { requestId } = msg;\n this.#logger.debug(\n `Posted invocation message of type ${messageType} requestId: ${requestId || \"\"}`\n );\n if (responseTimeoutMs) {\n this.#logger.debug(\n `scheduling timeout check for requestId: ${requestId || \"\"} in ${responseTimeoutMs} ms`\n );\n this.#scheduleTimeoutCheck(responseTimeoutMs);\n }\n });\n };\n /**\n * Setup callback for a specific message type\n * @param {ListenParam<T>} param The parameters for the listener\n */\n listen = (param) => {\n const { messageType, callback } = param;\n const items = this.#listeners.get(messageType) || [];\n items.push(callback);\n this.#listeners.set(messageType, items);\n };\n /**\n * Remove a previously registered callback for a specific message type\n * @param {ListenParam<T>} param The parameters identifying the listener to remove\n */\n unlisten = (param) => {\n const { messageType, callback } = param;\n const items = this.#listeners.get(messageType);\n if (!items) return;\n const index = items.indexOf(callback);\n if (index !== -1) {\n items.splice(index, 1);\n }\n };\n /**\n * Send a message without any form of response. Fire and forget\n * @param {SendParam} param The parameters for the send\n */\n send = (param) => {\n const { targetWin, targetOrigin, messageType, messageBody } = param;\n const msg = createMessage({\n messageType,\n messageBody,\n onewayMsg: true\n });\n targetWin.postMessage(msg, targetOrigin);\n this.#logger.debug(`Posted one-way message of type \"${messageType}\"`);\n };\n /**\n * Removes a window from the list of allowed senders\n * @param {AddSenderParam} param - The sender to remove\n */\n removeSender = (param) => {\n const { window: window2 } = param;\n if (window2) this.#allowedSenders.delete(window2);\n };\n /**\n * Send a response message to a window\n * @param {RespondParam} param The parameters for the response\n */\n respond = (param) => {\n const { targetWin, targetOrigin, requestId, response } = param;\n const msg = createMessage({\n messageType: RESPONSE_MESSAGE_TYPE,\n messageBody: response,\n requestId\n });\n targetWin.postMessage(msg, targetOrigin);\n this.#logger.debug(\n `Response sent to caller for invocation requestId: ${requestId}`\n );\n };\n /**\n * Send an exception message to a window\n * @param {RaiseExceptionParam} param The parameters for the exception\n */\n raiseException = (param) => {\n const { targetWin, targetOrigin, requestId, ex } = param;\n const messageBody = ex instanceof Error ? ex.message : ex;\n const msg = createMessage({\n messageType: EXCEPTION_MESSAGE_TYPE,\n messageBody,\n requestId\n });\n targetWin.postMessage(msg, targetOrigin);\n this.#logger.debug(\n `Exception sent to caller for invocation. requestId: ${requestId}`\n );\n };\n}\nexport {\n Remoting,\n sendMessage\n};\n","const MODULE_OBJECT = \"module\";\nvar SecurityContext = /* @__PURE__ */ ((SecurityContext2) => {\n SecurityContext2[\"USER\"] = \"USER\";\n SecurityContext2[\"PARTNER\"] = \"PARTNER\";\n return SecurityContext2;\n})(SecurityContext || {});\nclass ScriptingObjectManager {\n #normalizeId = (id) => id.trim().toLowerCase();\n /**\n * collection of registered scripting objects\n */\n #scriptingObjects = /* @__PURE__ */ new Map();\n /**\n * collection of proxied scripting objects for each guest\n */\n #guestScriptingObjects = /* @__PURE__ */ new Map();\n #addGuestScriptingObject = (params) => {\n const { so, guestId } = params;\n const objectId = this.#normalizeId(so.id);\n const guestSOs = this.#guestScriptingObjects.get(guestId);\n if (!guestSOs) {\n this.#guestScriptingObjects.set(guestId, /* @__PURE__ */ new Map([[objectId, params]]));\n } else {\n if (guestSOs.has(objectId))\n throw new Error(\n `Scripting Object ${so.id} already exists for guest ${guestId}`\n );\n guestSOs.set(objectId, params);\n }\n };\n #disposeSO = ({ so }) => {\n if (so._dispose && typeof so._dispose === \"function\") {\n try {\n so._dispose();\n } catch {\n }\n }\n };\n /**\n * get scripting object for the given object id and guest id\n * this method is backward compatible with the V1 guest, where the guest id is not provided. It will return the scripting object for the first guest\n * @param root0\n * @param root0.objectId\n * @param root0.guestId\n * @returns scripting object for the given object id and guest id. null if not found\n */\n #getGuestScriptingObject = ({\n objectId,\n guestId\n }) => {\n if (objectId === MODULE_OBJECT && !guestId) {\n for (const [, mSOs] of this.#guestScriptingObjects) {\n const mSO = mSOs.get(objectId);\n if (mSO) return mSO;\n }\n }\n const SOs = guestId ? this.#guestScriptingObjects.get(guestId) : null;\n if (SOs) {\n return SOs.get(objectId) ?? null;\n }\n return null;\n };\n #removeGuestScriptingObject = ({\n objectId,\n guestId\n } = {}) => {\n if (guestId) {\n if (!objectId) {\n const sosInfo = this.#guestScriptingObjects.get(guestId);\n if (sosInfo) {\n sosInfo.forEach(this.#disposeSO);\n }\n this.#guestScriptingObjects.delete(guestId);\n return;\n }\n const moduleSOs = this.#guestScriptingObjects.get(guestId);\n if (moduleSOs) {\n const soInfo = moduleSOs.get(objectId);\n if (soInfo) this.#disposeSO(soInfo);\n moduleSOs.delete(objectId);\n }\n } else if (objectId) {\n this.#guestScriptingObjects.forEach((moduleSOs) => {\n const soInfo = moduleSOs.get(objectId);\n if (soInfo) this.#disposeSO(soInfo);\n moduleSOs.delete(objectId);\n });\n }\n };\n /**\n * registers scripting object to the host\n * @param so scripting object to register\n * @param {AddScriptingObjectParams<ValueOf<AppObjects>>}\n * @param params\n */\n addScriptingObject = (so, params) => {\n const { guestId } = params || {};\n if (!so?.id || !so?._toJSON) {\n throw new Error(\"Object is not derived from ScriptingObject\");\n }\n const objectId = this.#normalizeId(so.id);\n if (objectId === MODULE_OBJECT && !guestId) {\n throw new Error(`Guest id is required to add Module scripting object`);\n }\n if (guestId) {\n this.#addGuestScriptingObject({ so, ...params, guestId });\n return;\n }\n if (this.#scriptingObjects.has(objectId))\n throw new Error(`Scripting Object ${so.id} already exists`);\n this.#scriptingObjects.set(objectId, { so, ...params });\n };\n /**\n * Get reference to the scripting object proxy for a guest\n * @param {string} objectId scripting object id\n * @param {GuestContext} guest that is requesting the scripting object\n * @returns proxied scripting object reference\n */\n getObject = (objectId, guest) => {\n const id = this.#normalizeId(objectId);\n let soInfo = this.#getGuestScriptingObject({\n objectId: id,\n guestId: guest?.id\n });\n soInfo = soInfo ?? this.#scriptingObjects.get(id) ?? null;\n const { so } = soInfo || {};\n if (!so) return null;\n return so;\n };\n /**\n * Check if a scripting object exists\n * @param objectId unique id of the scripting object\n * @param guest\n * @returns true if the scripting object exists, false otherwise\n */\n has = (objectId, guest) => this.getObject(objectId, guest) !== null;\n /**\n * list name of scripting objects for the given guest\n * @param guestId unique id of the guest\n * @returns name of scripting objects for the given guest\n */\n listScriptingObjects = (guestId) => {\n const objects = new Set(this.#scriptingObjects.keys());\n const guestSOs = this.#guestScriptingObjects.get(guestId);\n if (guestSOs) {\n for (const key of guestSOs.keys()) objects.add(key);\n }\n return Array.from(objects);\n };\n /**\n * removes scripting object\n * @param objectId unique id of the scripting object\n * @param guestId unique id of the guest\n */\n removeScriptingObject = (objectId, guestId) => {\n const id = this.#normalizeId(objectId);\n if (guestId) {\n this.#removeGuestScriptingObject({ objectId: id, guestId });\n } else {\n this.#removeGuestScriptingObject({ objectId: id });\n const soInfo = this.#scriptingObjects.get(id);\n if (soInfo) this.#disposeSO(soInfo);\n this.#scriptingObjects.delete(id);\n }\n };\n /**\n * removes all scripting objects\n * @param guestId unique id of the guest\n */\n removeAllScriptingObjects = (guestId) => {\n if (!guestId) {\n this.#scriptingObjects.forEach(this.#disposeSO);\n this.#scriptingObjects.clear();\n } else {\n this.#removeGuestScriptingObject({ guestId });\n }\n };\n}\nexport {\n MODULE_OBJECT,\n ScriptingObjectManager,\n SecurityContext\n};\n","class ScriptingObjectProxy {\n /**\n * proxy type\n */\n __TYPE__ = \"Proxy\";\n /**\n * unique id of scripting object\n */\n id;\n /**\n * type of scripting object\n */\n objectType;\n /**\n * Creates a new instance of the Scripting Object Proxy\n * @param objectId unique id of scripting object\n * @param objectType type of scripting object\n */\n constructor(objectId, objectType) {\n this.id = objectId;\n this.objectType = objectType;\n }\n}\nconst isScriptingObjectProxy = (value) => (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n value?.constructor?.name === \"Proxy\" || // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n value?.constructor?.name === \"ScriptingObjectProxy\" || // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-underscore-dangle\n value?.__TYPE__ === \"Proxy\"\n);\nexport {\n ScriptingObjectProxy,\n isScriptingObjectProxy\n};\n","/* eslint-disable max-lines */\nimport { v4 as uuidv4 } from 'uuid';\nimport type {\n IScriptingObject,\n IScriptingObjectProxy,\n ScriptingObjectTypes,\n Events,\n IAnalytics,\n TimingOptions,\n} from '@elliemae/pui-scripting-object';\nimport {\n Remoting,\n ScriptingObject,\n MessageType,\n Event,\n ScriptingObjectManager,\n ProxyEvent,\n isScriptingObjectProxy,\n GuestContext,\n} from '@elliemae/microfe-common';\nimport type {\n ListenerCallbackParams,\n EventListeners,\n IScriptingObjectProxyEvent,\n AddScriptingObjectParams,\n GetObjectParams,\n DispatchEventParam,\n EventOptions,\n FilterCriteria,\n} from '@elliemae/microfe-common';\nimport { Logger, LogLevels } from '@elliemae/pui-diagnostics';\nimport {\n EventObject,\n GenericFunction,\n IFrameSandboxValues,\n GuestOptions,\n ValueOf,\n ScriptingObjects,\n AttachParam,\n OpenMode,\n WindowFeatures,\n} from './types.js';\nimport {\n ISSFHost,\n HostOption,\n LoadGuestParam,\n LoadGuestsParam,\n GuestCloseParam,\n GuestEventSubscribeCallback,\n GuestEventUnsubscribeCallback,\n} from './ihost.js';\nimport { Guest } from './guest.js';\nimport { flatten, isFunction } from './utils.js';\n\nexport const SANDBOX_DEFAULT = [\n IFrameSandboxValues.AllowScripts,\n IFrameSandboxValues.AllowPopups,\n IFrameSandboxValues.AllowModals,\n IFrameSandboxValues.AllowForms,\n IFrameSandboxValues.AllowDownloads,\n IFrameSandboxValues.AllowSameOrigin,\n];\n\ntype GuestWindowSize = {\n width: number;\n height: number;\n};\n\n/**\n * Host class for embedding guest application and enabling bi-directional communication using scripting objects methods and events\n * @typeParam AppObjects - scripting objects that are published by the host application\n * @typeParam AppEvents - events that are published by the host application\n */\n/* eslint-disable indent */\nexport class SSFHost<\n AppObjects extends ScriptingObjects = ScriptingObjectTypes,\n AppEvents extends EventListeners = Events,\n> implements ISSFHost<AppObjects, AppEvents>\n{\n /* eslint-enable indent */\n /**\n * unique identifier for the host\n */\n public hostId: string;\n\n /**\n * reference to the remoting object\n */\n #remoting: Remoting;\n\n /**\n * unique identifier for the host\n */\n #correlationId: string;\n\n /**\n * reference to the logger\n */\n #logger: Logger;\n\n /**\n * reference to the analytics object\n */\n #analyticsObj: IAnalytics;\n\n /**\n * list of guests\n */\n #guests = new Map<string, Guest>();\n\n /**\n * reverse lookup: window -> guest for O(1) message routing\n */\n #guestsByWindow = new Map<Window, Guest>();\n\n /**\n * reverse lookup: url -> guest for O(1) popup dedup\n */\n #guestsByUrl = new Map<string, Guest>();\n\n /**\n * list of callbacks for guest close.\n */\n #guestCloseCallbackList = new Map<\n string,\n (({ id }: { id: string }) => void | Promise<void>)[]\n >();\n\n /**\n * scripting object manager\n */\n #soManager: ScriptingObjectManager<AppObjects>;\n\n /**\n * callback for ready state\n */\n #readyStateCallback: null | ((guest: Guest) => void) = null;\n\n /**\n *\n */\n #popupGuestMonitor: ReturnType<typeof setInterval> | null = null;\n\n /**\n * callback for guest event subscription\n */\n #onGuestEventSubscribe: GuestEventSubscribeCallback | null = null;\n\n /**\n * callback for guest event unsubscription\n */\n #onGuestEventUnsubscribe: GuestEventUnsubscribeCallback | null = null;\n\n /**\n * Create a new host\n * @param hostId unique identifier for the host\n * @param {HostOption} option - options for the host\n */\n constructor(hostId: string, option: HostOption) {\n // Set the local variables\n this.hostId = hostId;\n if (!option?.logger) throw new Error('Logger is required');\n if (!option?.analyticsObj) throw new Error('Analytics object is required');\n this.#logger = option.logger;\n this.#analyticsObj = option.analyticsObj;\n this.#correlationId = uuidv4();\n this.#remoting = new Remoting(this.#logger, this.#correlationId);\n if (\n option?.readyStateCallback &&\n typeof option?.readyStateCallback !== 'function'\n )\n throw new Error('readyStateCallback must be a function');\n this.#readyStateCallback = option?.readyStateCallback || null;\n this.#onGuestEventSubscribe = option?.onGuestEventSubscribe || null;\n this.#onGuestEventUnsubscribe = option?.onGuestEventUnsubscribe || null;\n this.#soManager = new ScriptingObjectManager<AppObjects>();\n // Initialize the messenger\n this.#remoting.initialize(window);\n this.#connect();\n // close all popup guest when host window gets reloaded\n window.addEventListener('beforeunload', this.#closeAllPopupGuests);\n this.#logger.debug(\n `host is initialized. hostId: ${this.hostId}, correlationId: ${\n this.#correlationId\n }`,\n );\n }\n\n #sendBAEvent = (event: string, data: Record<string, unknown>) => {\n const baEvent = { event, ...data };\n this.#analyticsObj.sendBAEvent(baEvent).catch((e) => {\n this.#logger.debug(\n `Analytics sendBAEvent failed: ${(e as Error).message}`,\n );\n });\n };\n\n #startTiming = (name: string, options: TimingOptions) => {\n this.#analyticsObj.startTiming(name, options).catch((e) => {\n this.#logger.debug(\n `Analytics startTiming failed: ${(e as Error).message}`,\n );\n });\n };\n\n #endTiming = (start: string, options: TimingOptions) => {\n this.#analyticsObj.endTiming(start, options).catch((e) => {\n this.#logger.debug(`Analytics endTiming failed: ${(e as Error).message}`);\n });\n };\n\n #closeAllPopupGuests = () => {\n const popupIds = Array.from(this.#guests.values())\n .filter((guest) => guest.openMode === OpenMode.Popup)\n .map((guest) => guest.id);\n popupIds.forEach((id) => this.unloadGuest(id));\n };\n\n /**\n * get the reference to the guest application by its window\n * @param guestWindow reference to the guest window\n * @returns reference to the guest\n */\n #getGuestForWindow = (guestWindow: Window) =>\n this.#guestsByWindow.get(guestWindow);\n\n /**\n * get the reference to the guest application by its window\n * @param url url of the guest application\n * @returns reference to the guest\n */\n #getGuestForUrl = (url: string) => this.#guestsByUrl.get(url) ?? null;\n\n /**\n * check if a object is a scripting object\n * @param value javascript object\n * @returns true if the object is a scripting object\n */\n #isScriptingObject = (value: any): value is ValueOf<AppObjects> =>\n // eslint-disable-next-line no-underscore-dangle, @typescript-eslint/no-unsafe-member-access\n typeof value?._toJSON === 'function';\n\n #encodeResponse = (val: unknown, guest?: GuestContext) => {\n if (this.#isScriptingObject(val)) {\n // add scripting objects returned from scripting object methods\n if (\n !this.#soManager.has(\n val?.id as Extract<keyof AppObjects, string>,\n guest,\n )\n )\n this.#soManager.addScriptingObject(\n val,\n guest ? { guestId: guest?.id } : {},\n );\n // eslint-disable-next-line no-underscore-dangle\n return { type: 'object', object: val._toJSON() };\n }\n return { type: 'value', value: val };\n };\n\n #encodeException = (ex: string | Error) => {\n if (typeof ex === 'string') {\n return ex;\n }\n if (ex instanceof Error) {\n return ex.message;\n }\n return 'An unexpected error occurred in the host application';\n };\n\n #dispatchConfigEvent = (guest: Guest) => {\n if (guest.ready) {\n this.#remoting.send({\n targetWin: guest.window,\n targetOrigin: guest.origin,\n messageType: MessageType.HostConfig,\n messageBody: {\n logLevel: this.#logger.getLogLevel(),\n ...guest.getInfo(),\n },\n });\n }\n };\n\n #invoke = <T extends IScriptingObject>({\n guest,\n obj,\n functionName,\n functionParams,\n }: {\n guest: Guest;\n obj: T;\n functionName: keyof IScriptingObject;\n functionParams: unknown[];\n }) => {\n const func = obj[functionName];\n // Ensure the function exists\n if (!isFunction(func)) {\n this.#logger.warn(\n `Attempt to call invalid function on object type ${\n obj.objectType\n }: ${String(functionName)}`,\n );\n return Promise.reject(\n new Error(\n `Method '${functionName}' not found in Scripting Object '${obj.id}'`,\n ),\n );\n }\n\n // Invoke the object's function\n this.#logger.debug(\n `Invoking host implementation of ${obj.id}.${String(functionName)}()`,\n );\n return new Promise((resolve) => {\n Object.defineProperty(func, 'callContext', {\n value: { guest },\n configurable: true,\n enumerable: true,\n writable: true,\n });\n\n resolve((func as GenericFunction)(...functionParams));\n });\n };\n\n #handleGuestReadyComplete = ({\n sourceWin,\n sourceOrigin,\n requestId,\n }: ListenerCallbackParams<any>) => {\n // Verify the guest belongs to this host\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n `Received ready event for unknown guest. requestId: ${requestId}`,\n );\n return;\n }\n\n // Ensure this guest is initialized\n if (!guest.initialized) {\n this.#logger.warn(\n 'Guest must be initialized before it is marked as ready',\n );\n this.#remoting.raiseException({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n ex: 'Guest must be initialized before it is marked as ready',\n });\n return;\n }\n\n if (!guest.ready) {\n // Set the ready state\n guest.ready = true;\n const guestInfo = guest.getInfo();\n this.#endTiming('SSF.Guest.Load', {\n appId: guestInfo.guestId,\n appUrl: guestInfo.guestUrl,\n });\n // Invoke the control function on the guest\n this.#dispatchConfigEvent(guest);\n // Invoke the registered callback, if any\n this.#readyStateCallback?.(guest);\n this.#logger.audit({\n message: `Guest is ready`,\n ...guestInfo,\n });\n }\n };\n\n // Initializes a guest when the guest is full loaded\n #handleGuestReady = ({\n sourceWin,\n sourceOrigin,\n requestId,\n body,\n }: ListenerCallbackParams<Record<string, any>>) => {\n // Verify the guest belongs to this host\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n `Received ready event for unknown guest. requestid = ${requestId}`,\n );\n return;\n }\n if (!guest.initialized) {\n // Initialize the capabilities object\n guest.initialized = true;\n guest.capabilities = body || {};\n this.#logger.audit({\n message: `Guest is initialized`,\n ...guest.getInfo(),\n });\n }\n // If the guest has not indicated that it will provide explicit notification\n // when it's ready, we'll fire the ready event now\n if (!body || !body.onReady) {\n this.#handleGuestReadyComplete({\n sourceWin,\n sourceOrigin,\n requestId,\n type: '',\n body: null,\n });\n }\n };\n\n /**\n * cleanup the guest reference when it is closed\n * @param param0\n * @param param0.sourceWin\n */\n #handleGuestClose = async ({ sourceWin }: ListenerCallbackParams<any>) => {\n if (sourceWin?.window) {\n const guest = this.#findGuest(sourceWin);\n if (guest && !(await guest.handShake())) {\n this.unloadGuest(sourceWin);\n }\n }\n };\n\n // Handles list objects requests from the remote automation framework\n #handleListObjects = ({\n sourceWin,\n sourceOrigin,\n requestId,\n }: ListenerCallbackParams<{\n objects: keyof AppObjects;\n }>) => {\n this.#logger.debug(\n `Processing listObjects request. requestId = ${requestId}`,\n );\n\n // Get the guest from which the request came\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn('Rejected object request from unknown guest window');\n return false;\n }\n\n // Get the list of objects available for the guest\n const objects = this.#soManager.listScriptingObjects(guest.id);\n\n this.#remoting.respond({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n response: objects,\n });\n\n this.#logger.audit({\n message: `name of scripting objects returned`,\n requestId,\n objects,\n ...guest.getInfo(),\n });\n return true;\n };\n\n // Handles object get requests from the remote automation framework\n #handleObjectGet = ({\n sourceWin,\n sourceOrigin,\n requestId,\n body,\n }: ListenerCallbackParams<{\n objectId: Extract<keyof AppObjects, string>;\n }>) => {\n const { objectId } = body;\n this.#logger.debug(\n `Processing getObject request for object ${objectId}. requestId = ${requestId}`,\n );\n\n // Get the guest from which the request came\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn('Rejected object request from unknown guest window');\n return false;\n }\n\n // Get the object from the guest's host\n const obj = this.getScriptingObject(objectId, { guest });\n if (!obj) {\n this.#logger.warn(\n `unknown or unauthorized object ${objectId} from guest ${guest.id}`,\n );\n this.#remoting.raiseException({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n ex: `The requested object (${objectId}) is not available`,\n });\n return false;\n }\n\n this.#remoting.respond({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n response: this.#encodeResponse(obj, guest),\n });\n\n this.#logger.audit({\n message: `Scripting Object returned`,\n requestId,\n scriptingObject: objectId,\n ...guest.getInfo(),\n });\n return true;\n };\n\n /**\n * Handles a guest event subscription request.\n *\n * This method processes a request from a guest window to subscribe to a specific event.\n * It verifies the guest window, logs the request, and invokes the subscription callback asynchronously.\n * If the guest window is unknown, the request is rejected and a warning is logged.\n * @param params - The parameters for the event subscription request.\n * @param params.sourceWin - The window object from which the request originated.\n * @param params.requestId - The unique identifier for the request.\n * @param params.body - The body of the request containing event subscription details.\n * @param params.body.eventId - The identifier of the event to subscribe to.\n * @param params.body.criteria - Optional filter criteria for the event subscription.\n * @param params.body.token - The authentication token for the request.\n * @returns Returns `false` if the guest window is unknown; otherwise, no explicit return value.\n */\n #handleGuestEventSubscribe = ({\n sourceWin,\n requestId,\n body,\n }: ListenerCallbackParams<{\n eventId: string;\n criteria?: FilterCriteria;\n token: string;\n }>) => {\n const { eventId, criteria, token } = body;\n this.#logger.debug(\n `Processing guest event subscribe request for event ${eventId}. requestId = ${requestId}`,\n );\n // Get the guest from which the request came\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n 'Rejected event subscribe request from unknown guest window',\n );\n return;\n }\n // invoke the callback\n setTimeout(() => {\n try {\n this.#onGuestEventSubscribe?.({\n guestId: guest.id,\n eventId,\n criteria,\n token,\n });\n } catch (error) {\n this.#logger.warn(\n `Error in onGuestEventSubscribe callback for event ${eventId}: ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n };\n\n /**\n * Handles a guest event unsubscribe request.\n *\n * This method processes an unsubscribe request from a guest window for a specific event.\n * It verifies the source window, retrieves the corresponding guest, and invokes the\n * `#onGuestEventUnsubscribe` callback asynchronously. If the source window is not recognized,\n * the request is rejected and a warning is logged.\n * @param params - The parameters for the unsubscribe request, including:\n * - `sourceWin`: The window from which the request originated.\n * - `requestId`: The unique identifier for the request.\n * - `body`: An object containing the `eventId` and `token` for the event to unsubscribe.\n * @param params.sourceWin\n * @param params.requestId\n * @param params.body\n * @returns `false` if the guest window is unknown; otherwise, no explicit return value.\n */\n #handleGuestEventUnsubscribe = ({\n sourceWin,\n requestId,\n body,\n }: ListenerCallbackParams<{ eventId: string; token: string }>) => {\n const { eventId, token } = body;\n this.#logger.debug(\n `Processing guest event unsubscribe request for event ${eventId}. requestId = ${requestId}`,\n );\n // Get the guest from which the request came\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n 'Rejected event unsubscribe request from unknown guest window',\n );\n return;\n }\n // invoke the callback\n setTimeout(() => {\n try {\n this.#onGuestEventUnsubscribe?.({\n guestId: guest.id,\n eventId,\n token,\n });\n } catch (error) {\n this.#logger.warn(\n `Error in onGuestEventUnsubscribe callback for event ${eventId}: ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n };\n\n // handles guest resize event\n #handleGuestResize = ({\n sourceWin,\n requestId,\n body,\n }: ListenerCallbackParams<GuestWindowSize>) => {\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n `Received resize event from unknown guest. requestid = ${requestId}`,\n );\n return;\n }\n if (guest.domElement) {\n guest.domElement.style.height = `${body.height}px`;\n }\n this.#logger.debug(\n `Guest ${guest.id} resized to ${body.width}x${body.height}`,\n );\n };\n\n // Handles object invoke requests from the remote automation framework\n #handleObjectInvoke = ({\n sourceWin,\n sourceOrigin,\n requestId,\n body,\n }: ListenerCallbackParams<{\n objectId: Extract<keyof AppObjects, string>;\n functionName: keyof IScriptingObject;\n functionParams: unknown[];\n }>) => {\n const { objectId } = body;\n\n // Get the guest from which the request came\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n 'Rejected method invocation request from unknown guest window',\n );\n // this.#remoting.raiseException({\n // targetWin: sourceWin,\n // targetOrigin: sourceOrigin,\n // requestId,\n // ex: 'Specified window is not a known guest',\n // });\n return false;\n }\n\n this.#logger.debug(\n `Function ${objectId}.${String(body.functionName)}() called from guest \"${\n guest.id\n }\" (requestId = ${requestId})`,\n );\n\n // Get the object from the guest's host\n const obj = this.getScriptingObject(objectId, { guest });\n if (!obj) {\n this.#logger.warn(\n `Invocation of unknown or unauthorized object ${objectId} from guest ${guest.id}`,\n );\n this.#remoting.raiseException({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n ex: `The requested object (${objectId}) is not available`,\n });\n return false;\n }\n\n const guestInfo = guest.getInfo();\n this.#startTiming(`ScriptingObject.API.${objectId}.${body.functionName}`, {\n appId: guestInfo.guestId,\n appUrl: guestInfo.guestUrl,\n });\n // Invoke the function, which will always return a Promise\n this.#invoke({\n guest,\n obj,\n functionName: body.functionName,\n functionParams: body.functionParams,\n })\n .then((val) => {\n this.#remoting.respond({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n response: this.#encodeResponse(val, guest),\n });\n this.#logger.audit({\n message: `Value returned for Scripting Object method call`,\n requestId,\n scriptingObject: objectId,\n scriptingMethod: body.functionName,\n ...guestInfo,\n });\n })\n .catch((ex) => {\n this.#remoting.raiseException({\n targetWin: sourceWin,\n targetOrigin: guest.origin,\n requestId,\n ex: ex as Error,\n });\n this.#logger.audit({\n message: `Exception thrown for Scripting Object method call`,\n requestId,\n scriptingObject: objectId,\n scriptingMethod: body.functionName,\n ...guestInfo,\n });\n })\n .finally(() => {\n this.#endTiming(\n `ScriptingObject.API.${objectId}.${body.functionName}`,\n {\n appId: guestInfo.guestId,\n appUrl: guestInfo.guestUrl,\n },\n );\n });\n return true;\n };\n\n /**\n * subscribe to guest resize event\n */\n #subscribeToGuestResizeEvent = () => {\n this.#remoting.listen({\n messageType: MessageType.GuestResize,\n callback: this.#handleGuestResize,\n });\n };\n\n /**\n * start listening to the remoting messages\n */\n #connect = () => {\n this.#remoting.listen({\n messageType: MessageType.GuestReady,\n callback: this.#handleGuestReady,\n });\n this.#remoting.listen({\n messageType: MessageType.GuestReadyComplete,\n callback: this.#handleGuestReadyComplete,\n });\n this.#remoting.listen({\n messageType: MessageType.GuestClose,\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n callback: this.#handleGuestClose,\n });\n this.#remoting.listen({\n messageType: MessageType.ListObjects,\n callback: this.#handleListObjects,\n });\n this.#remoting.listen({\n messageType: MessageType.ObjectGet,\n callback: this.#handleObjectGet,\n });\n this.#remoting.listen({\n messageType: MessageType.ObjectInvoke,\n callback: this.#handleObjectInvoke,\n });\n this.#remoting.listen({\n messageType: MessageType.GuestEventSubscribe,\n callback: this.#handleGuestEventSubscribe,\n });\n this.#remoting.listen({\n messageType: MessageType.GuestEventUnsubscribe,\n callback: this.#handleGuestEventUnsubscribe,\n });\n };\n\n /**\n * check if the value is a proxy event\n * @param value\n * @returns\n */\n #isProxyEvent = (\n value: any,\n ): value is IScriptingObjectProxyEvent<AppEvents> =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n value instanceof ProxyEvent ||\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n typeof value?.subscribe === 'function'; // support v1 scripting objects\n\n /**\n * Register pre-rendered guest application to host\n * @param {AttachParam} param - parameters for attaching the guest\n * @returns reference to the guest object\n */\n #attachGuest = (param: AttachParam): Guest => {\n const guest = new Guest({\n ...param,\n remoting: this.#remoting,\n analyticsObj: this.#analyticsObj,\n });\n // Register the guest with host\n guest.init();\n // Add the guest to all lookup maps\n this.#guests.set(param.guestId, guest);\n this.#guestsByWindow.set(guest.window, guest);\n this.#guestsByUrl.set(guest.url, guest);\n return guest;\n };\n\n /**\n * find the guest object by its id, window or dom element\n * @param guestIdOrWindowOrEle id, window or dom element of the guest\n * @returns guest object\n */\n #findGuest = (guestIdOrWindowOrEle: string | Window | HTMLIFrameElement) => {\n if (typeof guestIdOrWindowOrEle === 'string') {\n return this.#guests.get(guestIdOrWindowOrEle);\n }\n // O(1) lookup by window reference\n const byWindow = this.#guestsByWindow.get(guestIdOrWindowOrEle as Window);\n if (byWindow) return byWindow;\n // fallback: scan for domElement match\n return Array.from(this.#guests.values()).find(\n (value) => value.domElement === guestIdOrWindowOrEle,\n );\n };\n\n #monitorPopupGuests = () => {\n // already monitoring\n if (this.#popupGuestMonitor) return;\n this.#popupGuestMonitor = setInterval(() => {\n const guestsToRemove: Guest[] = [];\n this.#guests.forEach((guest) => {\n if (guest.openMode === OpenMode.Popup && guest.window.closed) {\n guestsToRemove.push(guest);\n }\n });\n guestsToRemove.forEach((guest) => {\n const { id } = guest;\n this.unloadGuest(id);\n const callbacks = this.#guestCloseCallbackList.get(id);\n callbacks?.forEach((callback) => {\n // eslint-disable-next-line max-nested-callbacks\n Promise.resolve(callback({ id })).catch(() => {});\n });\n });\n }, 1000);\n };\n\n #stopMonitoringPopupGuests = () => {\n if (!this.#popupGuestMonitor) return;\n const hasPopups = Array.from(this.#guests.values()).some(\n (guest) => guest.openMode === OpenMode.Popup,\n );\n if (!hasPopups) {\n clearInterval(this.#popupGuestMonitor);\n this.#popupGuestMonitor = null;\n }\n };\n\n #openPopupGuest = <\n SearchParams extends Record<string, string | number | boolean>,\n >(param: {\n guestId: string;\n url: string;\n title: string;\n searchParams: SearchParams;\n popupWindowFeatures?: WindowFeatures;\n onLoad?: (guestId: string) => void;\n onError?: (guestId: string) => void;\n }) => {\n const {\n url,\n title,\n popupWindowFeatures = {},\n searchParams,\n guestId,\n onLoad,\n onError,\n } = param;\n const {\n width = 800,\n height = 600,\n top = 100,\n left = 100,\n } = popupWindowFeatures;\n let guest = this.#getGuestForUrl(url);\n if (guest) {\n // bring guest popup window to front\n if (!guest.window.closed) {\n guest.send({\n messageType: MessageType.GuestFocus,\n messageBody: {},\n });\n }\n } else {\n // construct window features as comma separated string\n const windowFeatures = Object.entries({ width, height, top, left })\n .filter(([, v]) => v)\n .map(([k, v]) => `${k}=${v}`)\n .join(',');\n // open new guest popup window\n const guestWindow = window.open(url, title, `popup, ${windowFeatures}`);\n if (!guestWindow) {\n // notify load failure to the caller\n setTimeout(() => {\n try {\n onError?.(guestId);\n } catch (error) {\n this.#logger.debug(\n `Error occurred in onError for guest with id '${guestId}': ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n throw new Error('Failed to open guest application in popup window');\n } else {\n // notify load complete to the caller\n setTimeout(() => {\n try {\n onLoad?.(guestId);\n } catch (error) {\n this.#logger.debug(\n `Error occurred in onLoad for guest with id '${guestId}': ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n }\n // nullify opener before attaching to prevent guest access to host window\n guestWindow.opener = null;\n guest = this.#attachGuest({\n guestId,\n window: guestWindow,\n title,\n url,\n searchParams,\n openMode: OpenMode.Popup,\n });\n // start polling for popup close only when popups exist\n this.#monitorPopupGuests();\n }\n return guest;\n };\n\n #openEmbedGuest = <\n SearchParams extends Record<string, string | number | boolean>,\n >(param: {\n guestId: string;\n url: string;\n title: string;\n searchParams: SearchParams;\n targetElement: HTMLElement;\n onLoad?: (guestId: string) => void;\n onError?: (guestId: string) => void;\n options?: GuestOptions;\n }) => {\n const {\n url,\n title,\n targetElement,\n searchParams,\n guestId,\n onLoad,\n onError,\n options = {} as GuestOptions,\n } = param;\n // create the iframe\n const targetElementDocument = targetElement.ownerDocument ?? document;\n const {\n fitToContent = false,\n disableSandbox = false,\n sandboxValues = [],\n customSandboxValues = [],\n style = '',\n permissionPolicy = '',\n } = options;\n if (!title) throw new Error('title is required');\n if (fitToContent) this.#subscribeToGuestResizeEvent();\n // create guest frame\n const frame = targetElementDocument.createElement('iframe');\n frame.setAttribute('id', guestId);\n // handle frame load and error events\n const onFrameLoad = () => {\n // notify load complete to the caller\n setTimeout(() => {\n try {\n onLoad?.(guestId);\n } catch (error) {\n this.#logger.debug(\n `Error occurred in onLoad for guest with id '${guestId}': ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n this.#logger.debug(`frame loaded for guest with id '${guestId}'`);\n frame.removeEventListener('load', onFrameLoad);\n };\n const onFrameLoadFailure = () => {\n // notify load failure to the caller\n setTimeout(() => {\n try {\n onError?.(guestId);\n } catch (error) {\n this.#logger.debug(\n `Error occurred in onError for guest with id '${guestId}': ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n this.#logger.error(`frame load failed for guest with id '${guestId}'`);\n frame.removeEventListener('error', onFrameLoadFailure);\n };\n frame.addEventListener('load', onFrameLoad);\n frame.addEventListener('error', onFrameLoadFailure);\n frame.setAttribute(\n 'style',\n `min-width: 100%; height: 100%; border: 0px; ${style}`,\n );\n if (!disableSandbox) {\n frame.setAttribute(\n 'sandbox',\n customSandboxValues.length > 0\n ? customSandboxValues.join(' ')\n : [...SANDBOX_DEFAULT, ...sandboxValues].join(' '),\n );\n }\n frame.setAttribute('title', title);\n frame.setAttribute('src', url);\n if (permissionPolicy) frame.setAttribute('allow', permissionPolicy);\n targetElement.appendChild(frame);\n // Find the window object and create the guest\n const guestFrameEle = targetElementDocument.getElementById(\n guestId,\n ) as HTMLIFrameElement;\n return this.#attachGuest({\n guestId,\n domElement: guestFrameEle,\n window: guestFrameEle.contentWindow as Window,\n title,\n url,\n searchParams,\n openMode: OpenMode.Embed,\n });\n };\n\n #getGuestUrl = <Params extends Record<string, string | number | boolean>>(\n url: string,\n params: Params,\n ) => {\n let querystring = '';\n Object.keys(params).forEach((queryParam) => {\n querystring += `${\n (querystring.length ? '&' : '') + encodeURIComponent(queryParam)\n }=${encodeURIComponent(params[queryParam])}`;\n });\n\n return (\n url +\n (!querystring ? '' : (url.indexOf('?') >= 0 ? '&' : '?') + querystring)\n );\n };\n\n /**\n * registers scripting object to the host\n * @param {ValueOf<AppObjects>} so scripting object to be registered\n * @param {AddScriptingObjectParams} params params to add scripting object\n */\n addScriptingObject = <SO extends ValueOf<AppObjects>>(\n so: SO,\n params?: AddScriptingObjectParams,\n ) => {\n // if scripting object is proxy then clone it\n if (isScriptingObjectProxy(so)) {\n const clonedSo = this.cloneScriptingObject(so);\n this.#soManager.addScriptingObject(clonedSo, params);\n } else {\n // if scripting object is not a proxy object, add it directly\n this.#soManager.addScriptingObject(so, params);\n }\n };\n\n /**\n * Clone parent host's scripting object for exposing to grand children\n * @param proxy - reference to the scripting object obtained through getObject method\n * @param guest - reference to the ssf guest\n * @returns cloned version of the scripting object\n */\n cloneScriptingObject = <ObjectId extends Extract<keyof AppObjects, string>>(\n proxy: IScriptingObjectProxy,\n ): AppObjects[ObjectId] => {\n if (!proxy) throw new Error('proxy is required');\n // Create a new, base ScriptingObject with V2 properties\n const so = new ScriptingObject(proxy.id, proxy.objectType);\n type UnsubscribeFn = () => void;\n // Store the tokens for unsubscription\n let unsubscribers: Array<UnsubscribeFn> = [];\n\n // Copy the functions and events over\n // let propName: keyof typeof proxy;\n Object.keys(proxy).forEach((propName) => {\n const propValue = proxy[propName as keyof IScriptingObjectProxy];\n if (this.#isProxyEvent(propValue)) {\n // v1 or v2 object event\n const event = new Event<AppEvents>({\n name: propValue.name || propName,\n objectId: so.id,\n });\n // Create the event on the object\n Object.defineProperty(so, propName, {\n value: event,\n enumerable: true,\n });\n\n // Subscribe to the event and pass the callback down\n if ((propValue as any) instanceof ProxyEvent) {\n // proxy was obtained from v2 guest\n const listener = ({\n eventParams,\n eventOptions,\n }: {\n eventParams: any;\n eventOptions?: any;\n }) =>\n this.dispatchEvent({\n event,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n eventParams,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n eventOptions,\n });\n\n const token = (propValue as unknown as ProxyEvent).subscribe(\n listener,\n );\n unsubscribers.push(() => {\n (propValue as unknown as ProxyEvent).unsubscribe(token);\n });\n } else {\n // proxy was obtained from v1 guest\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const token = (propValue as any).subscribe?.(\n (obj: ScriptingObject, params: any, options: any) =>\n this.dispatchEvent({\n event,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n eventParams: params,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n eventOptions: options,\n }),\n );\n unsubscribers.push(() => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (propValue as any).unsubscribe?.(token);\n });\n }\n } else if (isFunction(propValue)) {\n // Create a function that proxies the call to the proxy\n Object.defineProperty(so, propName, {\n value: async (...args: unknown[]) => {\n const retVal = await propValue(...args);\n return isScriptingObjectProxy(retVal)\n ? this.cloneScriptingObject(retVal)\n : retVal;\n },\n enumerable: true,\n });\n\n // Override the dispose function\n if (propName === 'dispose') {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const defaultImpl = so.dispose;\n Object.defineProperty(so, propName, {\n value: () => {\n // Dispose of the object in the proxy tier\n // eslint-disable-next-line no-underscore-dangle\n so._dispose();\n return defaultImpl.apply(so);\n },\n enumerable: true,\n });\n }\n }\n });\n\n // Override the dispose function// Add a destroy method to clean up the proxy by unsubscribing to the\n // proxied object's events and unpublishing the object\n // eslint-disable-next-line no-underscore-dangle\n so._dispose = () => {\n unsubscribers.forEach((unsub) => {\n unsub?.();\n });\n unsubscribers = [];\n };\n\n return so as unknown as AppObjects[ObjectId];\n };\n\n /**\n * dispose the resources used by the host application\n */\n close = () => {\n if (this.#popupGuestMonitor) {\n clearInterval(this.#popupGuestMonitor);\n this.#popupGuestMonitor = null;\n }\n this.#closeAllPopupGuests();\n this.#remoting.close();\n window.removeEventListener('beforeunload', this.#closeAllPopupGuests);\n this.#logger.debug(\n `host is closed. hostId: ${this.hostId}, correlationId: ${\n this.#correlationId\n }`,\n );\n };\n\n /**\n * dispatch event to guest application(s)\n * @param {EventDetail} params details of the event to be dispatched\n * @returns promise that resolves to an array with result from each guest application\n */\n dispatchEvent = async <\n EventId extends Extract<keyof AppEvents, string>,\n Params extends Parameters<AppEvents[EventId]>[0]['eventParams'],\n Options extends EventOptions,\n >(\n params: DispatchEventParam<EventId, Params, Options>,\n ) => {\n const {\n event: { id, name },\n eventParams,\n eventOptions = {} as Options,\n } = params;\n const {\n eventHandler = null,\n timeout = null,\n window: targetWindow = null,\n guestId,\n } = eventOptions;\n // Get the scripting object\n const objectId = id.split('.')[0] as Extract<keyof AppObjects, string>;\n // get the guest object to which the event should be dispatched to\n const guestIdorWnd = guestId || targetWindow;\n const targetGuest = guestIdorWnd ? this.#findGuest(guestIdorWnd) : null;\n // get scripting object\n const scriptingObject = targetGuest\n ? this.getScriptingObject(objectId, { guest: targetGuest })\n : this.getScriptingObject(objectId);\n if (!scriptingObject) {\n this.#logger.warn(\n `Attempt to dispatch event ${name} on unknown object ${objectId}`,\n );\n return Promise.resolve([]);\n }\n\n const eventObj: EventObject = {\n // eslint-disable-next-line no-underscore-dangle\n object: scriptingObject._toJSON(),\n eventName: name,\n eventParams,\n eventHandler,\n eventOptions: {\n allowsFeedback: false,\n },\n };\n\n if (timeout && !Number.isNaN(timeout)) {\n eventObj.eventOptions = {\n allowsFeedback: true,\n timeout: Number(timeout),\n };\n }\n\n // Invoke the event handler in target or all guests\n const guestPromises: Array<Promise<unknown>> = [];\n let timingMetricStarted = false;\n\n const dispatchToGuest = (guest: Guest) => {\n const guestInfo = guest.getInfo();\n if (timeout && guest?.capabilities?.eventFeedback) {\n guestPromises.push(guest.dispatchEvent(eventObj, timeout));\n if (!timingMetricStarted) {\n this.#startTiming(\n `ScriptingObject.Event.${scriptingObject.id}.${name}`,\n {\n appId: this.hostId,\n appUrl: window.location.href,\n },\n );\n timingMetricStarted = true;\n }\n this.#logger.audit({\n message: 'Event dispatched and awaiting feedback',\n scriptingEventId: id,\n ...guestInfo,\n });\n } else {\n guest.send({\n messageType: MessageType.ObjectEvent,\n messageBody: eventObj,\n });\n this.#logger.audit({\n message: 'Event dispatched',\n scriptingEventId: id,\n ...guestInfo,\n });\n }\n };\n\n if (targetGuest) {\n // targeted dispatch — skip iterating all guests\n dispatchToGuest(targetGuest);\n } else {\n this.#guests.forEach(dispatchToGuest);\n }\n\n // Return a promise that aggregates all of the guest promises\n const retValue = await Promise.all(guestPromises)\n .then((values) => {\n this.#logger.audit({\n message: 'Event feedback received',\n scriptingEventId: id,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return flatten(values);\n })\n .catch((ex: Error) => {\n this.#logger.error({\n message: 'Error processing event',\n eventId: id,\n exception: ex,\n });\n throw ex;\n })\n .finally(() => {\n if (timingMetricStarted)\n this.#endTiming(\n `ScriptingObject.Event.${scriptingObject.id}.${name}`,\n {\n appId: this.hostId,\n appUrl: window.location.href,\n },\n );\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return retValue;\n };\n\n /**\n * get reference to all guest applications\n * @returns list of guest application references\n */\n getGuests = (): Array<Guest> => Array.from(this.#guests.values());\n\n /**\n * get the scripting object by id\n * @param objectId - id of the scripting object\n * @param params\n * @returns scripting object\n */\n getScriptingObject = <Id extends Extract<keyof AppObjects, string>>(\n objectId: Id,\n params?: GetObjectParams,\n ): AppObjects[Id] | null =>\n this.#soManager.getObject(objectId, params?.guest);\n\n /**\n * loads guest application inside sandboxed iframe\n * @param {LoadGuestParam} param - parameters for loading the guest application\n * @returns reference to the guest object\n */\n loadGuest = <SearchParams extends Record<string, string | number | boolean>>(\n param: LoadGuestParam<SearchParams>,\n ): Guest => {\n const {\n id: guestId,\n url,\n targetElement,\n title,\n searchParams = {} as SearchParams,\n onLoad,\n onError,\n options = {} as GuestOptions,\n } = param;\n if (!guestId) throw new Error('id for guest application is required');\n // Generate a unique instance ID when multiple instances of the same app are loaded\n let instanceId = guestId;\n if (this.#guests.has(instanceId)) {\n let counter = 1;\n while (this.#guests.has(`${guestId}-${counter}`)) {\n counter += 1;\n }\n instanceId = `${guestId}-${counter}`;\n }\n const { openMode = OpenMode.Embed, popupWindowFeatures = {} } = options;\n\n const srcUrl = this.#getGuestUrl(url, searchParams);\n let guest: Guest | null = null;\n\n this.#startTiming('SSF.Guest.Load', {\n appId: instanceId,\n appUrl: srcUrl,\n });\n if (openMode === OpenMode.Popup) {\n guest = this.#openPopupGuest({\n guestId: instanceId,\n url: srcUrl,\n title,\n searchParams,\n popupWindowFeatures,\n onLoad,\n onError,\n });\n } else if (openMode === OpenMode.Embed) {\n guest = this.#openEmbedGuest({\n guestId: instanceId,\n url: srcUrl,\n title,\n targetElement,\n searchParams,\n onLoad,\n onError,\n options,\n });\n } else {\n throw new Error(`Invalid openMode: ${openMode as string}`);\n }\n\n this.#logger.audit({\n message: 'Guest loaded',\n ...guest.getInfo(),\n });\n return guest;\n };\n\n /**\n * loads guest application inside sandboxed iframe with different params\n * @param {LoadGuestsParam} param - parameters for loading the guest application\n */\n loadGuests = <SearchParams extends Record<string, string | number | boolean>>(\n param: LoadGuestsParam<SearchParams>,\n ) => {\n const {\n id,\n url,\n targetElement,\n title,\n searchParamsList = [] as SearchParams[],\n options = {} as GuestOptions,\n } = param;\n // Render the plugins into sandboxed iframe elements\n searchParamsList.forEach((searchParams, index) => {\n this.loadGuest({\n id: `${id}-${index}`,\n url,\n title,\n targetElement,\n searchParams,\n options,\n });\n }, this);\n };\n\n /**\n * removes all scripting objects from host\n * @param guestId unique id of the guest application\n */\n removeAllScriptingObjects = (guestId?: string) => {\n this.#soManager.removeAllScriptingObjects(guestId);\n };\n\n /**\n * removes scripting object from the host\n * @param objectId unique id of the scripting object\n * @param guestId unique id of the guest application\n */\n removeScriptingObject = (\n objectId: Extract<keyof AppObjects, string>,\n guestId?: string,\n ) => {\n this.#soManager.removeScriptingObject(objectId, guestId);\n };\n\n /**\n * set the log level for the host application\n * @param level - log level\n */\n setLogLevel = (level: LogLevels) => {\n // Set the logging level at the host\n this.#logger.setLogLevel(level);\n // Notify all guests of the change\n this.#guests.forEach(this.#dispatchConfigEvent);\n this.#logger.debug('Dispatched config events to all guests');\n };\n\n /**\n * unloads guest application from host\n * @param guestIdOrWindowOrEle unique id of the guest application or window object or dom element of the guest application\n * @throws Error if guestId or Window reference is invalid\n */\n unloadGuest = (guestIdOrWindowOrEle: string | Window | HTMLIFrameElement) => {\n // Find the guest object\n const guest = this.#findGuest(guestIdOrWindowOrEle);\n if (guest) {\n // dispose the guest\n guest.dispose();\n // Remove from all lookup maps\n this.#guestsByWindow.delete(guest.window);\n this.#guestsByUrl.delete(guest.url);\n this.#guests.delete(guest.id);\n this.#logger.audit({\n message: `Guest is removed from host`,\n ...guest.getInfo(),\n });\n // stop polling if no popup guests remain\n this.#stopMonitoringPopupGuests();\n }\n };\n\n /**\n * monitors guest window close action and executes the callback from host.\n * @param callback host callback method\n * @param id unique id of the guest application\n * @param param\n */\n onGuestClose = (param: GuestCloseParam) => {\n const { id, guestCloseCallback } = param;\n const callbacks = this.#guestCloseCallbackList.get(id) || [];\n callbacks.push(guestCloseCallback);\n this.#guestCloseCallbackList.set(id, callbacks);\n };\n}\n"],"names":["root","factory","__webpack_require__","exports","definition","key","obj","prop","Event","param","name","objectId","ProxyEvent","#eventSrc","eventSrc","callback","token","isEvent","value","getEventId","eventName","FUNCTION","isPublicFunction","fnName","ScriptingObject","#id","#objectType","objectType","functions","events","property","MessageType","MessageType2","OpenMode","IFrameSandboxValues","getOrigin","url","origin","flatten","source","v","isFunction","Guest","#remoting","#analyticsObj","option","guestId","domElement","title","window","searchParams","openMode","remoting","analyticsObj","resolve","handShakeCount","handShakeRetries","handShakeHandle","onAck","event","timeout","getRandomValues","rnds8","rng","byteToHex","i","unsafeStringify","arr","offset","stringify","uuid","validate","v4","options","buf","rnds","MESSAGE_SOURCE","RESPONSE_MESSAGE_TYPE","EXCEPTION_MESSAGE_TYPE","createMessage","messageType","messageBody","requestId","onewayMsg","sendMessage","targetWin","targetOrigin","msg","Remoting","#correlationId","#logger","#listeners","#invocations","#timeoutMonitorHandle","#initializedWindow","#allowedSenders","logger","correlationId","#evaluateTimeouts","ts","canceledItems","nextCancelTime","eventData","cancelTime","delay","#scheduleTimeoutCheck","delayMs","#stopResponseMonitor","#popInvocation","e","#processResponse","message","#processException","#receive","sourceWin","sourceOrigin","callbacks","#processMessage","senderOrigin","window2","win","responseTimeoutMs","reject","items","index","response","ex","MODULE_OBJECT","SecurityContext","SecurityContext2","ScriptingObjectManager","#normalizeId","id","#scriptingObjects","#guestScriptingObjects","#addGuestScriptingObject","params","so","guestSOs","#disposeSO","#getGuestScriptingObject","mSOs","mSO","SOs","#removeGuestScriptingObject","sosInfo","moduleSOs","soInfo","guest","objects","ScriptingObjectProxy","isScriptingObjectProxy","SANDBOX_DEFAULT","SSFHost","#guests","#guestsByWindow","#guestsByUrl","#guestCloseCallbackList","#soManager","#readyStateCallback","#popupGuestMonitor","#onGuestEventSubscribe","#onGuestEventUnsubscribe","hostId","#connect","#closeAllPopupGuests","#sendBAEvent","data","baEvent","#startTiming","#endTiming","start","#getGuestForWindow","guestWindow","#getGuestForUrl","#isScriptingObject","#encodeResponse","val","#encodeException","#dispatchConfigEvent","#invoke","functionName","functionParams","func","#handleGuestReadyComplete","guestInfo","#handleGuestReady","body","#handleGuestClose","#findGuest","#handleListObjects","#handleObjectGet","#handleGuestEventSubscribe","eventId","criteria","error","#handleGuestEventUnsubscribe","#handleGuestResize","#handleObjectInvoke","#subscribeToGuestResizeEvent","#isProxyEvent","#attachGuest","guestIdOrWindowOrEle","byWindow","#monitorPopupGuests","guestsToRemove","#stopMonitoringPopupGuests","#openPopupGuest","popupWindowFeatures","onLoad","onError","width","height","top","left","windowFeatures","k","#openEmbedGuest","targetElement","targetElementDocument","fitToContent","disableSandbox","sandboxValues","customSandboxValues","style","permissionPolicy","frame","onFrameLoad","onFrameLoadFailure","guestFrameEle","#getGuestUrl","querystring","queryParam","clonedSo","proxy","unsubscribers","propName","propValue","listener","eventParams","eventOptions","args","retVal","defaultImpl","unsub","eventHandler","targetWindow","guestIdorWnd","targetGuest","scriptingObject","eventObj","guestPromises","timingMetricStarted","dispatchToGuest","values","instanceId","counter","srcUrl","searchParamsList","level","guestCloseCallback"],"sourceRoot":""}
|