kwikid-components
Version:
KwikID's Components Library
208 lines • 24.4 kB
JavaScript
import { __awaiter } from "tslib";
import { LOCATION_TIMEOUT } from "./permission-checker.constants";
// Platform detection utilities
export function detectDeviceType() {
const userAgent = navigator.userAgent || navigator.vendor || window.opera;
if (/android/i.test(userAgent)) {
return "android";
}
if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) {
return "ios";
}
return "windows";
}
/**
* Request microphone permission
* @returns Promise resolving to an object with success status and optional error
*/
export function requestMicrophonePermission() {
return __awaiter(this, void 0, void 0, function* () {
try {
const stream = yield navigator.mediaDevices.getUserMedia({ audio: true });
// Stop the stream immediately as we only need to confirm permission
stream.getTracks().forEach((track) => track.stop());
return { granted: true };
}
catch (error) {
return { granted: false, error };
}
});
}
export function requestLocationPermission() {
return __awaiter(this, void 0, void 0, function* () {
try {
if (!navigator.geolocation) {
return { granted: false, error: "Geolocation not supported" };
}
if ("permissions" in navigator) {
try {
const permission = yield navigator.permissions.query({
name: "geolocation"
});
if (permission.state === "granted") {
return { granted: true };
}
if (permission.state === "denied") {
return { granted: false, error: "Permission denied" };
}
// If 'prompt', fall through to getCurrentPosition to trigger the popup
}
catch (permissionError) {
console.warn("Permissions API failed:", permissionError);
}
}
return yield new Promise((resolve) => {
const timeoutId = setTimeout(() => {
resolve({ granted: false, error: "Location request timeout" });
}, LOCATION_TIMEOUT);
navigator.geolocation.getCurrentPosition((position) => {
clearTimeout(timeoutId);
resolve({ granted: true });
}, (error) => {
clearTimeout(timeoutId);
resolve({ granted: false, error });
}, {
timeout: LOCATION_TIMEOUT,
maximumAge: 0,
enableHighAccuracy: false
});
});
}
catch (error) {
return { granted: false, error };
}
});
}
/**
* Checks if the device has both front and back cameras
* @returns Promise that resolves to an object containing camera availability info
*/
export function checkCameraAvailability() {
return __awaiter(this, void 0, void 0, function* () {
try {
const devices = yield navigator.mediaDevices.enumerateDevices();
const videoDevices = devices.filter((device) => device.kind === "videoinput");
// If there are no video devices
if (videoDevices.length === 0) {
return { isFrontCamera: false, isBackCamera: false };
}
// If there's only one camera, we assume it's the front camera by default
// More sophisticated checks could inspect device labels if available
if (videoDevices.length === 1) {
return { isFrontCamera: true, isBackCamera: false };
}
// If there are at least two cameras, we assume there are both front and back cameras
return { isFrontCamera: true, isBackCamera: true };
}
catch (error) {
console.error("Error checking camera availability:", error);
return { isFrontCamera: false, isBackCamera: false, error };
}
});
}
/**
* Tests the front camera
* @returns Promise resolving to result object with granted status and optional stream/error
*/
export function testFrontCamera() {
return __awaiter(this, void 0, void 0, function* () {
console.log("Testing front camera");
try {
// Request front camera stream
const frontStream = yield navigator.mediaDevices.getUserMedia({
video: { facingMode: "user" }
});
console.log("Front camera test successful");
// The stream is returned to be stopped by the caller after verification if needed
return {
granted: true,
stream: frontStream
};
}
catch (error) {
console.error("Front camera test failed:", error);
return {
granted: false,
error
};
}
});
}
/**
* Tests the back camera
* @returns Promise resolving to result object with granted status and optional stream/error
*/
export function testBackCamera() {
return __awaiter(this, void 0, void 0, function* () {
console.log("Testing back camera");
try {
// Request back camera stream
const backStream = yield navigator.mediaDevices.getUserMedia({
video: { facingMode: "environment" }
});
console.log("Back camera test successful");
// The stream is returned to be stopped by the caller after verification if needed
return {
granted: true,
stream: backStream
};
}
catch (error) {
console.error("Back camera test failed:", error);
return {
granted: false,
error
};
}
});
}
/**
* Tests both front and back cameras
* @param bothRequired Whether both cameras are required for success
* @returns Promise resolving to result object with status of both cameras
*/
export function testBothCamera(bothRequired = true) {
return __awaiter(this, void 0, void 0, function* () {
console.log("Testing both cameras");
// Test front camera
const frontResult = yield testFrontCamera();
console.log("Front camera test result:", frontResult.granted);
// Stop front camera stream to free the camera before testing the back
if (frontResult.stream) {
frontResult.stream.getTracks().forEach((track) => track.stop());
}
// Test back camera
const backResult = yield testBackCamera();
console.log("Back camera test result:", backResult.granted);
// Stop back camera stream
if (backResult.stream) {
backResult.stream.getTracks().forEach((track) => track.stop());
}
// Determine overall result based on requirements
const allGranted = bothRequired
? frontResult.granted && backResult.granted
: frontResult.granted || backResult.granted;
// Create error message if needed
let errorMessage;
if (!allGranted) {
errorMessage = "Camera permission issue:";
if (!frontResult.granted)
errorMessage += " Front camera not available.";
if (!backResult.granted)
errorMessage += " Back camera not available.";
}
return {
frontCamera: {
granted: frontResult.granted,
error: frontResult.error
},
backCamera: {
granted: backResult.granted,
error: backResult.error
},
allGranted,
errorMessage
};
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1jaGVja2VyLmhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9wZXJtaXNzaW9uLWNoZWNrZXIvcGVybWlzc2lvbi1jaGVja2VyLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFjLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFOUUsK0JBQStCO0FBQy9CLE1BQU0sVUFBVSxnQkFBZ0I7SUFDOUIsTUFBTSxTQUFTLEdBQ2IsU0FBUyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFLLE1BQWMsQ0FBQyxLQUFLLENBQUM7SUFFbkUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQzlCLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBRUQsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBRSxNQUFjLENBQUMsUUFBUSxFQUFFO1FBQ25FLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFnQiwyQkFBMkI7O1FBSS9DLElBQUk7WUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUUsb0VBQW9FO1lBQ3BFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDMUI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9B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Q0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsaURBQWlEO1FBQ2pELE1BQU0sVUFBVSxHQUFHLFlBQVk7WUFDN0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLE9BQU87WUFDM0MsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUU5QyxpQ0FBaUM7UUFDakMsSUFBSSxZQUFZLENBQUM7UUFDakIsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLFlBQVksR0FBRywwQkFBMEIsQ0FBQztZQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87Z0JBQUUsWUFBWSxJQUFJLDhCQUE4QixDQUFDO1lBQ3pFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTztnQkFBRSxZQUFZLElBQUksNkJBQTZCLENBQUM7U0FDeEU7UUFFRCxPQUFPO1lBQ0wsV0FBVyxFQUFFO2dCQUNYLE9BQU8sRUFBRSxXQUFXLENBQUMsT0FBTztnQkFDNUIsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLO2FBQ3pCO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztnQkFDM0IsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO2FBQ3hCO1lBQ0QsVUFBVTtZQUNWLFlBQVk7U0FDYixDQUFDO0lBQ0osQ0FBQztDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGV2aWNlVHlwZSwgTE9DQVRJT05fVElNRU9VVCB9IGZyb20gXCIuL3Blcm1pc3Npb24tY2hlY2tlci5jb25zdGFudHNcIjtcblxuLy8gUGxhdGZvcm0gZGV0ZWN0aW9uIHV0aWxpdGllc1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdERldmljZVR5cGUoKTogRGV2aWNlVHlwZSB7XG4gIGNvbnN0IHVzZXJBZ2VudCA9XG4gICAgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCBuYXZpZ2F0b3IudmVuZG9yIHx8ICh3aW5kb3cgYXMgYW55KS5vcGVyYTtcblxuICBpZiAoL2FuZHJvaWQvaS50ZXN0KHVzZXJBZ2VudCkpIHtcbiAgICByZXR1cm4gXCJhbmRyb2lkXCI7XG4gIH1cblxuICBpZiAoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QodXNlckFnZW50KSAmJiAhKHdpbmRvdyBhcyBhbnkpLk1TU3RyZWFtKSB7XG4gICAgcmV0dXJuIFwiaW9zXCI7XG4gIH1cblxuICByZXR1cm4gXCJ3aW5kb3dzXCI7XG59XG5cbi8qKlxuICogUmVxdWVzdCBtaWNyb3Bob25lIHBlcm1pc3Npb25cbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFuIG9iamVjdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzIGFuZCBvcHRpb25hbCBlcnJvclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdE1pY3JvcGhvbmVQZXJtaXNzaW9uKCk6IFByb21pc2U8e1xuICBncmFudGVkOiBib29sZWFuO1xuICBlcnJvcj86IGFueTtcbn0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pO1xuICAgIC8vIFN0b3AgdGhlIHN0cmVhbSBpbW1lZGlhdGVseSBhcyB3ZSBvbmx5IG5lZWQgdG8gY29uZmlybSBwZXJtaXNzaW9uXG4gICAgc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHRyYWNrKSA9PiB0cmFjay5zdG9wKCkpO1xuICAgIHJldHVybiB7IGdyYW50ZWQ6IHRydWUgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBncmFudGVkOiBmYWxzZSwgZXJyb3IgfTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdExvY2F0aW9uUGVybWlzc2lvbigpOiBQcm9taXNlPHtcbiAgZ3JhbnRlZDogYm9vbGVhbjtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIHRyeSB7XG4gICAgaWYgKCFuYXZpZ2F0b3IuZ2VvbG9jYXRpb24pIHtcbiAgICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlLCBlcnJvcjogXCJHZW9sb2NhdGlvbiBub3Qgc3VwcG9ydGVkXCIgfTtcbiAgICB9XG5cbiAgICBpZiAoXCJwZXJtaXNzaW9uc1wiIGluIG5hdmlnYXRvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbiA9IGF3YWl0IG5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJnZW9sb2NhdGlvblwiXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwZXJtaXNzaW9uLnN0YXRlID09PSBcImdyYW50ZWRcIikge1xuICAgICAgICAgIHJldHVybiB7IGdyYW50ZWQ6IHRydWUgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwZXJtaXNzaW9uLnN0YXRlID09PSBcImRlbmllZFwiKSB7XG4gICAgICAgICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UsIGVycm9yOiBcIlBlcm1pc3Npb24gZGVuaWVkXCIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmICdwcm9tcHQnLCBmYWxsIHRocm91Z2ggdG8gZ2V0Q3VycmVudFBvc2l0aW9uIHRvIHRyaWdnZXIgdGhlIHBvcHVwXG4gICAgICB9IGNhdGNoIChwZXJtaXNzaW9uRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiUGVybWlzc2lvbnMgQVBJIGZhaWxlZDpcIiwgcGVybWlzc2lvbkVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8eyBncmFudGVkOiBib29sZWFuOyBlcnJvcj86IGFueSB9PigocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoeyBncmFudGVkOiBmYWxzZSwgZXJyb3I6IFwiTG9jYXRpb24gcmVxdWVzdCB0aW1lb3V0XCIgfSk7XG4gICAgICB9LCBMT0NBVElPTl9USU1FT1VUKTtcblxuICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihcbiAgICAgICAgKHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgcmVzb2x2ZSh7IGdyYW50ZWQ6IHRydWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIHJlc29sdmUoeyBncmFudGVkOiBmYWxzZSwgZXJyb3IgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0aW1lb3V0OiBMT0NBVElPTl9USU1FT1VULFxuICAgICAgICAgIG1heGltdW1BZ2U6IDAsXG4gICAgICAgICAgZW5hYmxlSGlnaEFjY3VyYWN5OiBmYWxzZVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlLCBlcnJvciB9O1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBkZXZpY2UgaGFzIGJvdGggZnJvbnQgYW5kIGJhY2sgY2FtZXJhc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIGNhbWVyYSBhdmFpbGFiaWxpdHkgaW5mb1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tDYW1lcmFBdmFpbGFiaWxpdHkoKTogUHJvbWlzZTx7XG4gIGlzRnJvbnRDYW1lcmE6IGJvb2xlYW47XG4gIGlzQmFja0NhbWVyYTogYm9vbGVhbjtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGV2aWNlcyA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpO1xuICAgIGNvbnN0IHZpZGVvRGV2aWNlcyA9IGRldmljZXMuZmlsdGVyKFxuICAgICAgKGRldmljZSkgPT4gZGV2aWNlLmtpbmQgPT09IFwidmlkZW9pbnB1dFwiXG4gICAgKTtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyB2aWRlbyBkZXZpY2VzXG4gICAgaWYgKHZpZGVvRGV2aWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IGlzRnJvbnRDYW1lcmE6IGZhbHNlLCBpc0JhY2tDYW1lcmE6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSBjYW1lcmEsIHdlIGFzc3VtZSBpdCdzIHRoZSBmcm9udCBjYW1lcmEgYnkgZGVmYXVsdFxuICAgIC8vIE1vcmUgc29waGlzdGljYXRlZCBjaGVja3MgY291bGQgaW5zcGVjdCBkZXZpY2UgbGFiZWxzIGlmIGF2YWlsYWJsZVxuICAgIGlmICh2aWRlb0RldmljZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4geyBpc0Zyb250Q2FtZXJhOiB0cnVlLCBpc0JhY2tDYW1lcmE6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBjYW1lcmFzLCB3ZSBhc3N1bWUgdGhlcmUgYXJlIGJvdGggZnJvbnQgYW5kIGJhY2sgY2FtZXJhc1xuICAgIHJldHVybiB7IGlzRnJvbnRDYW1lcmE6IHRydWUsIGlzQmFja0NhbWVyYTogdHJ1ZSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjaGVja2luZyBjYW1lcmEgYXZhaWxhYmlsaXR5OlwiLCBlcnJvcik7XG4gICAgcmV0dXJuIHsgaXNGcm9udENhbWVyYTogZmFsc2UsIGlzQmFja0NhbWVyYTogZmFsc2UsIGVycm9yIH07XG4gIH1cbn1cblxuLyoqXG4gKiBUZXN0cyB0aGUgZnJvbnQgY2FtZXJhXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byByZXN1bHQgb2JqZWN0IHdpdGggZ3JhbnRlZCBzdGF0dXMgYW5kIG9wdGlvbmFsIHN0cmVhbS9lcnJvclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdEZyb250Q2FtZXJhKCk6IFByb21pc2U8e1xuICBncmFudGVkOiBib29sZWFuO1xuICBzdHJlYW0/OiBNZWRpYVN0cmVhbTtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIGNvbnNvbGUubG9nKFwiVGVzdGluZyBmcm9udCBjYW1lcmFcIik7XG4gIHRyeSB7XG4gICAgLy8gUmVxdWVzdCBmcm9udCBjYW1lcmEgc3RyZWFtXG4gICAgY29uc3QgZnJvbnRTdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XG4gICAgICB2aWRlbzogeyBmYWNpbmdNb2RlOiBcInVzZXJcIiB9XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhcIkZyb250IGNhbWVyYSB0ZXN0IHN1Y2Nlc3NmdWxcIik7XG4gICAgLy8gVGhlIHN0cmVhbSBpcyByZXR1cm5lZCB0byBiZSBzdG9wcGVkIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdmVyaWZpY2F0aW9uIGlmIG5lZWRlZFxuICAgIHJldHVybiB7XG4gICAgICBncmFudGVkOiB0cnVlLFxuICAgICAgc3RyZWFtOiBmcm9udFN0cmVhbVxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkZyb250IGNhbWVyYSB0ZXN0IGZhaWxlZDpcIiwgZXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBncmFudGVkOiBmYWxzZSxcbiAgICAgIGVycm9yXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFRlc3RzIHRoZSBiYWNrIGNhbWVyYVxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gcmVzdWx0IG9iamVjdCB3aXRoIGdyYW50ZWQgc3RhdHVzIGFuZCBvcHRpb25hbCBzdHJlYW0vZXJyb3JcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RCYWNrQ2FtZXJhKCk6IFByb21pc2U8e1xuICBncmFudGVkOiBib29sZWFuO1xuICBzdHJlYW0/OiBNZWRpYVN0cmVhbTtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIGNvbnNvbGUubG9nKFwiVGVzdGluZyBiYWNrIGNhbWVyYVwiKTtcbiAgdHJ5IHtcbiAgICAvLyBSZXF1ZXN0IGJhY2sgY2FtZXJhIHN0cmVhbVxuICAgIGNvbnN0IGJhY2tTdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XG4gICAgICB2aWRlbzogeyBmYWNpbmdNb2RlOiBcImVudmlyb25tZW50XCIgfVxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coXCJCYWNrIGNhbWVyYSB0ZXN0IHN1Y2Nlc3NmdWxcIik7XG4gICAgLy8gVGhlIHN0cmVhbSBpcyByZXR1cm5lZCB0byBiZSBzdG9wcGVkIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdmVyaWZpY2F0aW9uIGlmIG5lZWRlZFxuICAgIHJldHVybiB7XG4gICAgICBncmFudGVkOiB0cnVlLFxuICAgICAgc3RyZWFtOiBiYWNrU3RyZWFtXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiQmFjayBjYW1lcmEgdGVzdCBmYWlsZWQ6XCIsIGVycm9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgZ3JhbnRlZDogZmFsc2UsXG4gICAgICBlcnJvclxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBUZXN0cyBib3RoIGZyb250IGFuZCBiYWNrIGNhbWVyYXNcbiAqIEBwYXJhbSBib3RoUmVxdWlyZWQgV2hldGhlciBib3RoIGNhbWVyYXMgYXJlIHJlcXVpcmVkIGZvciBzdWNjZXNzXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byByZXN1bHQgb2JqZWN0IHdpdGggc3RhdHVzIG9mIGJvdGggY2FtZXJhc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdEJvdGhDYW1lcmEoYm90aFJlcXVpcmVkID0gdHJ1ZSk6IFByb21pc2U8e1xuICBmcm9udENhbWVyYTogeyBncmFudGVkOiBib29sZWFuOyBlcnJvcj86IGFueSB9O1xuICBiYWNrQ2FtZXJhOiB7IGdyYW50ZWQ6IGJvb2xlYW47IGVycm9yPzogYW55IH07XG4gIGFsbEdyYW50ZWQ6IGJvb2xlYW47XG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbn0+IHtcbiAgY29uc29sZS5sb2coXCJUZXN0aW5nIGJvdGggY2FtZXJhc1wiKTtcblxuICAvLyBUZXN0IGZyb250IGNhbWVyYVxuICBjb25zdCBmcm9udFJlc3VsdCA9IGF3YWl0IHRlc3RGcm9udENhbWVyYSgpO1xuICBjb25zb2xlLmxvZyhcIkZyb250IGNhbWVyYSB0ZXN0IHJlc3VsdDpcIiwgZnJvbnRSZXN1bHQuZ3JhbnRlZCk7XG5cbiAgLy8gU3RvcCBmcm9udCBjYW1lcmEgc3RyZWFtIHRvIGZyZWUgdGhlIGNhbWVyYSBiZWZvcmUgdGVzdGluZyB0aGUgYmFja1xuICBpZiAoZnJvbnRSZXN1bHQuc3RyZWFtKSB7XG4gICAgZnJvbnRSZXN1bHQuc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHRyYWNrKSA9PiB0cmFjay5zdG9wKCkpO1xuICB9XG5cbiAgLy8gVGVzdCBiYWNrIGNhbWVyYVxuICBjb25zdCBiYWNrUmVzdWx0ID0gYXdhaXQgdGVzdEJhY2tDYW1lcmEoKTtcbiAgY29uc29sZS5sb2coXCJCYWNrIGNhbWVyYSB0ZXN0IHJlc3VsdDpcIiwgYmFja1Jlc3VsdC5ncmFudGVkKTtcblxuICAvLyBTdG9wIGJhY2sgY2FtZXJhIHN0cmVhbVxuICBpZiAoYmFja1Jlc3VsdC5zdHJlYW0pIHtcbiAgICBiYWNrUmVzdWx0LnN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0cmFjaykgPT4gdHJhY2suc3RvcCgpKTtcbiAgfVxuXG4gIC8vIERldGVybWluZSBvdmVyYWxsIHJlc3VsdCBiYXNlZCBvbiByZXF1aXJlbWVudHNcbiAgY29uc3QgYWxsR3JhbnRlZCA9IGJvdGhSZXF1aXJlZFxuICAgID8gZnJvbnRSZXN1bHQuZ3JhbnRlZCAmJiBiYWNrUmVzdWx0LmdyYW50ZWRcbiAgICA6IGZyb250UmVzdWx0LmdyYW50ZWQgfHwgYmFja1Jlc3VsdC5ncmFudGVkO1xuXG4gIC8vIENyZWF0ZSBlcnJvciBtZXNzYWdlIGlmIG5lZWRlZFxuICBsZXQgZXJyb3JNZXNzYWdlO1xuICBpZiAoIWFsbEdyYW50ZWQpIHtcbiAgICBlcnJvck1lc3NhZ2UgPSBcIkNhbWVyYSBwZXJtaXNzaW9uIGlzc3VlOlwiO1xuICAgIGlmICghZnJvbnRSZXN1bHQuZ3JhbnRlZCkgZXJyb3JNZXNzYWdlICs9IFwiIEZyb250IGNhbWVyYSBub3QgYXZhaWxhYmxlLlwiO1xuICAgIGlmICghYmFja1Jlc3VsdC5ncmFudGVkKSBlcnJvck1lc3NhZ2UgKz0gXCIgQmFjayBjYW1lcmEgbm90IGF2YWlsYWJsZS5cIjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZnJvbnRDYW1lcmE6IHtcbiAgICAgIGdyYW50ZWQ6IGZyb250UmVzdWx0LmdyYW50ZWQsXG4gICAgICBlcnJvcjogZnJvbnRSZXN1bHQuZXJyb3JcbiAgICB9LFxuICAgIGJhY2tDYW1lcmE6IHtcbiAgICAgIGdyYW50ZWQ6IGJhY2tSZXN1bHQuZ3JhbnRlZCxcbiAgICAgIGVycm9yOiBiYWNrUmVzdWx0LmVycm9yXG4gICAgfSxcbiAgICBhbGxHcmFudGVkLFxuICAgIGVycm9yTWVzc2FnZVxuICB9O1xufVxuIl19