Skip to content
52 changes: 46 additions & 6 deletions extension/js/common/platform/xss.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ export class Xss {
private static ADD_ATTR = ['email', 'page', 'addurltext', 'longid', 'index', 'target', 'fingerprint', 'cryptup-data'];
private static FORBID_ATTR = ['background'];
private static HREF_REGEX_CACHE: RegExp | undefined;
private static FORBID_CSS_STYLE = /z-index:[^;]+;|position:[^;]+;|background[^;]+;/g;
private static FORBID_CSS_STYLE =
/(?:^|;)\s*(?:z-index|position|display|visibility|opacity|transform|clip-path|clip|top|left|right|bottom|pointer-events|font-size|line-height|width|height|text-indent|filter)\s*:[^;]*;?/gi;
Comment thread
martgil marked this conversation as resolved.
private static EMOJI_REGEX = /(?![*#0-9]+)[\p{Emoji}\p{Emoji_Modifier}\p{Emoji_Component}\p{Emoji_Modifier_Base}\p{Emoji_Presentation}]/gu;

public static sanitizeRender = (selector: string | HTMLElement | JQuery, dirtyHtml: string) => {
Expand Down Expand Up @@ -115,14 +116,16 @@ export class Xss {
// Handle style attributes
if (node.hasAttribute('style')) {
// mitigation rather than a fix, which will involve updating CSP, see https://github.com/FlowCrypt/flowcrypt-browser/issues/2648
const style = node.getAttribute('style')?.toLowerCase();
if (style && (style.includes('url(') || style.includes('@import'))) {
node.removeAttribute('style'); // don't want any leaks through css url()
}
// strip css styles that could use to overlap with the extension UI
let style = node.getAttribute('style') || '';
style = Xss.sanitizeCssStyle(style);
if (style && Xss.FORBID_CSS_STYLE.test(style)) {
const updatedStyle = style.replace(Xss.FORBID_CSS_STYLE, '');
Comment thread
martgil marked this conversation as resolved.
node.setAttribute('style', updatedStyle);
} else if (style) {
// if style was modified but still present, update it
node.setAttribute('style', style);
} else {
node.removeAttribute('style');
}
}

Expand Down Expand Up @@ -274,6 +277,43 @@ export class Xss {
}
};

/**
* Decode CSS escape sequences before applying security checks
*/
private static normalizeCssEscapes = (css: string): string => {
return css.replace(/\\(?:\r\n|[\n\r\f])|\\([0-9a-fA-F]{1,6}\s?|.)/g, (_match: string, escaped: string | undefined) => {
if (typeof escaped === 'undefined') {
return '';
}
if (/^[0-9a-fA-F]/.test(escaped)) {
const codePoint = Number.parseInt(escaped.trim(), 16);
return codePoint > 0 && codePoint <= 0x10ffff ? String.fromCodePoint(codePoint) : '';
}
return escaped;
});
};

/**
* Remove @import rules and any url(...) that would cause an out‑of‑band request.
* Only data: and cid: URLs are allowed.
*/
private static sanitizeCssStyle = (css: string): string => {
return css
.replace(/\/\*[\s\S]*?\*\//g, '')
.split(';')
Comment thread
martgil marked this conversation as resolved.
.map(part => this.normalizeCssEscapes(part.trim()))
.filter(part => {
return !/^(z-index|position|display|visibility|opacity|transform|clip-path|clip|top|left|right|bottom|pointer-events|font-size|line-height|width|height|text-indent|filter)\s*:/i.test(
part
Comment thread
martgil marked this conversation as resolved.
);
})
.filter(part => {
// remove url + import safely
return !/@import|url\(/i.test(part);
})
.join('; ');
};

/**
* allow href links that have same origin as our extension + cid + inline image
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
{
"acctEmail": "flowcrypt.compatibility@gmail.com",
"full": {
"id": "19e9cc77867bba39",
"threadId": "19e9cc77867bba39",
"labelIds": [
"Label_15",
"SENT",
"INBOX"
],
"snippet": "-----BEGIN PGP MESSAGE----- Version: FlowCrypt Email Encryption 8.5.13 Comment: Seamlessly send and receive encrypted email wcFMA0taL/zmLZUBARAAppqO6JcGThb0Jy1pZWk/N7nHV5syTuOhM1X89X79 GEsJ+GzB/",
"payload": {
"partId": "",
"mimeType": "multipart/mixed",
"filename": "",
"headers": [
{
"name": "Content-Type",
"value": "multipart/mixed; boundary=\"----sinikael-?=_1-17807467778820.2979209442026295\""
},
{
"name": "Openpgp",
"value": "id=E8F0517BA6D7DAB6081C96E4ADAC279C95093207"
},
{
"name": "From",
"value": "sender@domain.com"
},
{
"name": "To",
"value": "flowcrypt.compatibility@gmail.com"
},
{
"name": "Subject",
"value": "flowcrypt-browser #6234 test"
},
{
"name": "Date",
"value": "Sat, 6 Jun 2026 04:52:58 -0700"
},
{
"name": "MIME-Version",
"value": "1.0"
}
],
"body": {
"size": 0
},
"parts": [
{
"partId": "0",
"mimeType": "text/plain",
"filename": "",
"headers": [
{
"name": "Content-Type",
"value": "text/plain"
},
{
"name": "Content-Transfer-Encoding",
"value": "quoted-printable"
}
],
"body": {
"size": 5009,
"data": "LS0tLS1CRUdJTiBQR1AgTUVTU0FHRS0tLS0tDQpWZXJzaW9uOiBGbG93Q3J5cHQgRW1haWwgRW5jcnlwdGlvbiA4LjUuMTMNCkNvbW1lbnQ6IFNlYW1sZXNzbHkgc2VuZCBhbmQgcmVjZWl2ZSBlbmNyeXB0ZWQgZW1haWwNCg0Kd2NGTUEwdGFML3ptTFpVQkFSQUFwcHFPNkpjR1RoYjBKeTFwWldrL043bkhWNXN5VHVPaE0xWDg5WDc5DQpHRXNKK0d6Qi9PZXJJZmoxT0dhMFpRNXJwTDg2azNWYnU3dHBqRGJubDBnM0U0VzFGbHFHamFVSitBZmoNCkt4M2xNL2lXb1B2T3FUSXlRNkhHRU9oNnJDdXozd2hEbXFsVkRyczI3N1R1aXBxRy9LWldjK1dWUG93YQ0KUXpNNTg0eHNFZEkwUjJZTjRWM054T0EyKy9lM2RSWVhwU3c1V2lVTTJta3oyZ1E1MVRKTklYZ1FEYm9LDQpuRlZCeGxvSzB0NjJGZ2dWdTVKQWVhSWFiNWpucXRmY1BKSzVYVG9aLzN1ZlJ0Y3BHTjdRa29DRlRkV0UNCkI5YU9Fa1hKOXcrdzIxYjIrOFM4ZStyMWpQaE1kY3ZpQWRxOUQ3cUVRUGpuNUQ0NHArdDdHNGExT01GOA0KNXZDYU4vMTQxaUtmcExRQjA3cWRQbHBpd2lyVzk5cGpjTU4zdklGSnBVaUpXWThTR1hndFRrRkFjei8zDQo3YXFFQ00wd3N6NzZvQkh5dU16K09COHF2Y21sRHU3cG9FWUlsVzdjYkxCYWc3RWxQdENLYTRkR241SDENCkJOSlJ1dnBGTW82NlJuVmdQYkYzTVN0WXlRM1ZKMzF3bTRDcjBGVjU2Ukl1Q1Rab3YvRFdLb0g3OVpoMQ0KTmNKTVl6Z1BySERtbUFTOEpaanhFd0h1dENKSnF2dEF2R0RXeTdGT29Ma2E5bjVseGI1YzVZdEdyZXhNDQpZUFNzQWpVMW42aDVXMDJLZDZOdzZDU1FNVUlxWmFndTNid3E0ZXU1K1hyZU9OQi9YWU1Ob3NOMS9GSEUNCnkzNE81ZmRSaEg0Y1hSSzJ6THhCRFRGUG1lRlZjbVA2Ynd2Zlo2MjlvSWJCd1V3RHZiMTJZUGFaamNRQg0KRUFEWmtzektldHgrU3Jhd2lzakc2RmRJUG1qcU1xOWRubjRGYzJjREM2UkNZbXJocXI3THBRdktLZ0N4DQpOdlFwemdlODVkeHBNVG4za3lLTVV1THFyYTUxNGE0N2p6eWhzUVh0QUU5R1BWMkhQOGM0TFJkV3VZdnMNCnBCS1AxSnIrVUQxdEN6V0NUY2c4b3V5NjB4ZVFkaTkwZWw5RWtiS3BseVdEUmZ5dHlON1NFdmk0L3hXbg0KUWZSS3N4Sk00azdYMDBEaklpbnpnREFqQ3kveHBLT0pSNWtjSU9qdnNWZUFzUnBISjJlaU5GTS9XL0JrDQpCUHZ1ZnFRZjl1MXlVNDd1anJ6dEpLWFFkOTZjNkxFbzFwZjlwRDdpMUFHVVk1MkE4SkdSRXVjSEdLdWUNCnRGbWJ2NjZBekFtQ21XQjY4Q0lWOUs4UmFNa1FBRjFqcEdJZktPRTkwUmFYOE91N3hudnIzS2VxVlc4bQ0KRjZIV1Baazd5Zit5dkVtOTRPWWIycW1KWTYyUW9relR2b2gvV0RVSjl2eVowRU5HTWtBbnRUU1Vpa0FTDQpTRVlGWWNqd2phbUJEclJBS2UvL3pzQSt0RVZFMDhHVEZhYU5lUm9Ga25wYWZTTXo5L0s3OWRVK1poeDkNCnJHWEdJUXBleXBvU2Q1NXVyK09wUlpUV2lTcExmUFZwR0g3YmJrcEwyeGpGbHZCY3FuZmtaWkZyQ0RqWQ0KOWJIR2lnd1Fuckx4bVJJRGNQTkxlQmgxSXArWFFTUkdtVG14TnF2MTlJbzJSREtSVFdvclZLdk9mNUhqDQpjRWFBOEEwTSsvcEs0a1VOSzQxTHZSc3Y0Z0ZTMzVtUTRuN1RGVVZNUkFJTklKOStndVpzY0FOV2dKWHYNClVSdUl2bXB1Mzh5Y1hyZWhBdmxIWjdlM2NzSEJUQU5MV2kvODVpMlZBUUVQLzBZQ2R6a0M3bUNjN0FhRg0KL0ZxUWlzTERvMVMvWUFSWE5TazlySTltN1BFVFUwdnFBZjJ2WDJLR05QU1NwQmN1MHVyQ0FzM1dVVEMxDQppMjBrdm5iSUJBeVVUc2V5enFhN3B4VTdaRzdIbUg2c1ArUFZveUF4V0lOaVZSL0F4ekxDNk9GcElOWnMNCkJOaCthZ0tuWjd4NE5UM3RvV1pEVVZwY1VCL1UxaHRYSmYxbDlacldNeEloRGlKQXJySXl5NFNEd0VPYQ0KYkxwRnFiMUd1WnlxTk1WeElLUzFHeVNwU1hMV3lwMks1K2dVNnErZ0lObE1sdjRIUHU3RVJ6ZUVOVUZNDQpVYkpRV2F6TWxmZ2pFY2dudTJnUSs3TXZDQ1RhVXFUbjhFa3RnMFlJRm5XT2lzalN3L1g0R3Evb2o2N1cNCllJSTl5dEh4Vi9CQ1V2bUFBbTVWL3RFYWdUSkQrTmxaWFlxTS95aEM1eHpKWWw2cXNtUGtMRTRmRHpHWQ0KTmxpbXVJM3ZzR1VMOTdlbGk4dnRvYU9xZ2EyajR2bGc1TjJMVWljWk1YMFlqWDNOeXd4ZVlwbFBQU1UwDQpTZnNQbFhyR0tzeWJ4bzJia1lpSUlDeXFkSmFja1hqVXl4TTZVdWRhRHIreVNGMWdDQVgrYjQra3JicjINCjI4UHpPRnBiK0VzVWZ4eVJCK09BQU1CbWZTWC9UTkxWNHNRYURlK3JyYVExdDZDVGVYT3FQN0lmZWFyQg0KOFNrUm5PQlVEKzBBOEY5QVlSL2pCT0pkUjNTKzRaWXpUQS9aWlRjU0N0TDZXNDhGWFJtK0hRNS9tRXRCDQpyaXg4MlY2Q1dELzNVRnRqRXJDWUZaZXhIM3RYbkpUK0lQb0ZQOFpxKytCVDE3SXBRUUhMMkVnR0dGTTUNClYzOVFBdlN6d2NGTUE3MjlkbUQybVkzRUFRLzlGOWY1WGkvUTZsdmxiOEcxMmVuSVlMK1FXbGcrVklDVQ0KUDRHTTczaGtpbEVZVUsyT2ZPbFZ1bzBmdVcwbTVqR005QXpkQzlEOXBsQkxNcWVKc255SEwrOU1Bek4zDQpaU21jL3hmTEhsZWErVmVxa3ZiNWk3dEVwWHJLSU1vTVlLSVhEaW5Iclk0WEh3UzU4c2xOZ0M0Qm5GT2INCk45R09Kbng3K3NRQldFanlXZFBDUng2MjV2cXZRU005bG1hYlJieXJuUyt6K2d6dHY4WGxBekdSVGU2Yg0KWW85a1lGb1k2VnFoS1lmVUtiUmN6YXRMTFM4UDBRUWk0Z2JMNjlKS25ZdSs5ZlRvSXI2NEx2MEhwOHNCDQpuVGFvdU45MkdYK1hyZUVMSkZmbzhrckFCenZSTGhkeVp2clM1UE5aMmR0NW50MjlBR3MxWG5HRGFQM0MNClZ0cXA1UWNyWjNyS0ZmeGpWdHdCRnU1ajdGalp3cWwzQmhqR1BlaXowWjl1N3IyU1lZYTY3bUtTR3kzTg0KdTdwdElWcHNtVWtMSTVzU2JwTTBra0V4c2dEVU15SGt2V3FObWh0dHdkUEJYYzJPeTJEellGdXViSFBrDQpxS2dJV2JNdFc5LzZ5eFU4aGZUT084alA3akNnTVhoazI3SUEzTXNqYUVmRzdxaEY0OFJHdkMzMVhYMHQNCjJSRUxyd3JBcHoxR2VNRkR0SHFiTUNnMDFiMGhWREJDRW8zait0bWpIODZUVUErRnRyTVZjR2swTG5JeQ0KMHBoeDgxeWYvenhSSUFRRWFNNnVQemNMeHRlVTJRdmpNMldqa3JWbDY5UWFLU2Frb1NicVMyQlRxYVkwDQpISllGKy85NjVwejZJT2xPeDBXeC9oYmh3emZ0MmxLOER3M05HYzFsSWtXd2sycjhzRmJTeEwwQmFUN1gNCk1WUlVVeTZ3Y1hJMHpRRXAwYkxJdGJmaTgrSytBelVTVnhJUkV6Nm1zU2VLaTJZbzRRWStZcmc3eG1jQQ0Ka0dvV0NTVVBXU2JWWm1ub1ZhREd1UlJ6VlhXUjdxTEFnWWJFdGU1UEUrOXJSVWpCaVF2a2JoWjk3RHdjDQplc1hlZUx2NzBtbkdzaHNhK2NKWkdEalZtdkVVTDhRRE16c3ArdERNTU5DbmNmNlpCMTBMSVMxeHNoRE8NCmdQakd0TFhSNGdGcVVSeDVoc2lYa0J0VnE2UWV4Wlh2Rm1sZWVuWm5Ma1JCWkdwNEFiWGZXSmU2eTBWMA0KTHVwSE43cmU4YW1pMzZYckt6Qkh6OU5hT1lzWmsyU09wZzdKYldQRnBkam9xSkJpQ3orTEhHOUNJWWNhDQpFcjhhZ25iRXpiYnE4MTBVbWU2NVo2VGlJdTJ5enJxRlIrV2hpbEVYNTcrY0taNXVtOFNwMk8wV05UZFkNCmFXU2MyNnNLMVJCNUhVQ05jdGtEZiszajJWdU1qWnd3OVA1SUhPMUhvM2QyOUxtWnFlZCtLWkZuaHNRQQ0KcjRJalZoMzJXdnlrNXpoNVhkNitudFEvdUo3enZjT1M2aWpEUGExWCs3bG9wdlZoQVBObVRxN3FqcHE2DQpzSHlJWTIzZGZBNFRGaEVOTlNaaHhpNEhpU3lMdkd4ZVFudGkrMENzRGttYlhQQ3VQVVZJTWQwVGZod28NCm9aLzk5WVBsOWFjNXo3dVRVejhoaFcweGgvWjk1SnJKNVRZQ21wSk5EWjJrclIwNEtXMk4zZjQ5U1RNVw0KOGl2WmFKdExBK0tFMVNHc3NuRkhSM2hURWo1ZndHc2dITXVtMDZBanlUYmdIYncxL0JlS0ZNYTZWU2R0DQo2TDhVa01sR2FndDhob0hSTW9aaEFWM203SHhZbkl5RmJKalNQcmtkN0pWKzR4S09mQStHUjNVZ2FlU28NCnArVmFNMDFkYWVGcHVrM0lHSEMwazZmMnFXQjQvSHJXWDNZZ1FTZ3UxYUVocXptS1BiTmIzTE8zUTNiTg0KQU1PdTd1c2ZjSllPakdJN0tia2FiaDMxNkhQV2c5ZWVGZ2FGQVdSWS9FV2tramRyQzVaWHEvMDBMd0JiDQp0Snkwa0Z0NmN6TDlHQW1RbW04UjFUaGNmTlpVTXhRY0pRRk9ldGNMWjFtNEVlcDhGTEVaWlM2TURIWnQNCmV3dnJRMnhqWm41d295bDBJRkVUWXd4RHAxUnVxcGhlc1RxY0l6MHJEKzg4OWxJRC9xTHlGbDNDWXNjNw0KRnEyMGN2WTdLT2ZSeUcybW5oOVI0ckNkTGo2aGtkZ091cWJvODRxYnNZYlpCN1BMVlg1aXZFaXlhd1lDDQptSmZ6bzIxdjlZSndNZUxJNUZPTlJQc1haVDJJOHl4SFlGL1ZQY0xSR3NEWGl4M0xFWHIxMlREbWhEeXkNCiswaVJTb041aEQxQTVLNE1tUmZjL21JZmpqUnMyWW92S0g3VFlUSDBOeHdFWlJZOEtlU1lKWUpZS2d4UQ0KVjVKZHBTS2Y0aEs5K2dRcWhWK3hzdHpZN2w3YmcxU1psdDZnZk9QTVY1UW5vU0xjQ21pbWJod0VKcEZGDQpvWjkwMzZUOFl3SU1mc2QzSUcyN2JvL3dkNjFFbW1kZW5IRTJ4a2IvM0IwYSttc0VNM2lRN0VtVkhYRW4NCk1XcUF5OEFOZ05ISm05VjV5U0dGVUkwTGEvQWtrZEVKWmppMm9XRHpxUXRNditya0g0Nm9oMTlwYWJVNQ0KS3dFRzFEUWhLNkRMdlcvS1lxSVhlUEJuNWxaaWVqTDNDWHZRM3JiWXI0OEwxL0VuM2dIcE00OVduQk9GDQpkUzVlN2Fuc2pMTFBQVGZpYTdiN3R6M1h2b3NxNHc2TXVSeElmSFAwaTVmQzRiM2JiaTF4VTlYMk9hMUcNCjdiNWVzVzdQSmJEemdSamdMbUhuYnNhcEo1WStPQVBzd3gwa2JEczBTeDNoUFlYKzFVa1prcFZXQjlLTA0KRE5Vay81ZHYvTDQ1TlllVWJEd2lTSkJ1enY5WCtyQTRZN2FmdWo2bTRIbUE3V0JIVEJMUnBUQm9wSlNVDQpZYlk0Z0RXRFJ3ZnNHVDcyT1k2Q2YySUFnRW94a2FpdXA0WWJrMnpQZGN3Z1RaNFI0U1Z6ZlE5bW02ZHgNCk5lSTZmT1g3Vnh0WUFOTHVpdzR5M2JQOGNCd1dXaE1vNkxmOTR4UWdXSFp5QWV4SG1GV1ZpMGxZSVpuKw0KcWEyRE9DY1doOFVBMHZjU0drZXFuV2cvdWRaUTdGYm9NRVlqWm94RzRMWCs3aldPRGdQOWc1dm5TNm5RDQp3VW0xdEhrTGg0Ti9vRjJmQjRNWUIwSDlhbFJRTFFyblhPbUFRU2dqTWg4d0ZzYWdjWWxRbFlIY2t0YmsNCmVtZ25PYmZKaFltdUJMUC9pMHBaTzF4QUhwMFU2eXJxR2kySzhneitremdONUVBR1dtVm5qVmlwMHZMbA0KTThvaVovdUMNCj0rajBrDQotLS0tLUVORCBQR1AgTUVTU0FHRS0tLS0tDQo="
}
}
]
},
"sizeEstimate": 5895,
"historyId": "1499379",
"internalDate": "1780746778000"
},
"attachments": {},
"raw": {
"id": "19e9cc77867bba39",
"threadId": "19e9cc77867bba39",
"labelIds": [
"Label_15",
"SENT",
"INBOX"
],
"snippet": "-----BEGIN PGP MESSAGE----- Version: FlowCrypt Email Encryption 8.5.13 Comment: Seamlessly send and receive encrypted email wcFMA0taL/zmLZUBARAAppqO6JcGThb0Jy1pZWk/N7nHV5syTuOhM1X89X79 GEsJ+GzB/",
"sizeEstimate": 5895,
"raw": "UmVjZWl2ZWQ6IGZyb20gNzE3Mjg0NzMwMjQ0DQoJbmFtZWQgdW5rbm93bg0KCWJ5IGdtYWlsYXBpLmdvb2dsZS5jb20NCgl3aXRoIEhUVFBSRVNUOw0KCVNhdCwgNiBKdW4gMjAyNiAwNDo1Mjo1OCAtMDcwMA0KUmVjZWl2ZWQ6IGZyb20gNzE3Mjg0NzMwMjQ0DQoJbmFtZWQgdW5rbm93bg0KCWJ5IGdtYWlsYXBpLmdvb2dsZS5jb20NCgl3aXRoIEhUVFBSRVNUOw0KCVNhdCwgNiBKdW4gMjAyNiAwNDo1Mjo1OCAtMDcwMA0KQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7DQogYm91bmRhcnk9Ii0tLS1zaW5pa2FlbC0_PV8xLTE3ODA3NDY3Nzc4ODIwLjI5NzkyMDk0NDIwMjYyOTUiDQpPcGVucGdwOiBpZD1FOEYwNTE3QkE2RDdEQUI2MDgxQzk2RTRBREFDMjc5Qzk1MDkzMjA3DQpGcm9tOiBGbG93Q3J5cHQgQ29tcGF0aWJpbGl0eSA8Zmxvd2NyeXB0LmNvbXBhdGliaWxpdHlAZ21haWwuY29tPg0KVG86IEZsb3dDcnlwdCBDb21wYXRpYmlsaXR5IDxmbG93Y3J5cHQuY29tcGF0aWJpbGl0eUBnbWFpbC5jb20-DQpTdWJqZWN0OiBmbG93Y3J5cHQtYnJvd3NlciAjNjIzNCB0ZXN0DQpEYXRlOiBTYXQsIDYgSnVuIDIwMjYgMDQ6NTI6NTggLTA3MDANCk1lc3NhZ2UtSWQ6IDxDQUtidUxUckhvZVUxMVhYK2ZORThibjQ9VWRHMjM5OFFGOS1OTHAzWWRSa0ZuUTdYLWdAbWFpbC5nbWFpbC5jb20-DQpNSU1FLVZlcnNpb246IDEuMA0KDQotLS0tLS1zaW5pa2FlbC0_PV8xLTE3ODA3NDY3Nzc4ODIwLjI5NzkyMDk0NDIwMjYyOTUNCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogcXVvdGVkLXByaW50YWJsZQ0KDQotLS0tLUJFR0lOIFBHUCBNRVNTQUdFLS0tLS0NClZlcnNpb246IEZsb3dDcnlwdCBFbWFpbCBFbmNyeXB0aW9uIDguNS4xMw0KQ29tbWVudDogU2VhbWxlc3NseSBzZW5kIGFuZCByZWNlaXZlIGVuY3J5cHRlZCBlbWFpbA0KDQp3Y0ZNQTB0YUwvem1MWlVCQVJBQXBwcU82SmNHVGhiMEp5MXBaV2svTjduSFY1c3lUdU9oTTFYODlYNzkNCkdFc0orR3pCL09lcklmajFPR2EwWlE1cnBMODZrM1ZidTd0cGpEYm5sMGczRTRXMUZscUdqYVVKK0Fmag0KS3gzbE0vaVdvUHZPcVRJeVE2SEdFT2g2ckN1ejN3aERtcWxWRHJzMjc3VHVpcHFHL0taV2MrV1ZQb3dhDQpRek01ODR4c0VkSTBSMllONFYzTnhPQTIrL2UzZFJZWHBTdzVXaVVNMm1rejJnUTUxVEpOSVhnUURib0sNCm5GVkJ4bG9LMHQ2MkZnZ1Z1NUpBZWFJYWI1am5xdGZjUEpLNVhUb1ovM3VmUnRjcEdON1Frb0NGVGRXRQ0KQjlhT0VrWEo5dyt3MjFiMis4UzhlK3IxalBoTWRjdmlBZHE5RDdxRVFQam41RDQ0cCt0N0c0YTFPTUY4DQo1dkNhTi8xNDFpS2ZwTFFCMDdxZFBscGl3aXJXOTlwamNNTjN2SUZKcFVpSldZOFNHWGd0VGtGQWN6LzMNCjdhcUVDTTB3c3o3Nm9CSHl1TXorT0I4cXZjbWxEdTdwb0VZSWxXN2NiTEJhZzdFbFB0Q0thNGRHbjVIMQ0KQk5KUnV2cEZNbzY2Um5WZ1BiRjNNU3RZeVEzVkozMXdtNENyMEZWNTZSSXVDVFpvdi9EV0tvSDc5WmgxDQpOY0pNWXpnUHJIRG1tQVM4SlpqeEV3SHV0Q0pKcXZ0QXZHRFd5N0ZPb0xrYTluNWx4YjVjNVl0R3JleE0NCllQU3NBalUxbjZoNVcwMktkNk53NkNTUU1VSXFaYWd1M2J3cTRldTUrWHJlT05CL1hZTU5vc04xL0ZIRQ0KeTM0TzVmZFJoSDRjWFJLMnpMeEJEVEZQbWVGVmNtUDZid3ZmWjYyOW9JYkJ3VXdEdmIxMllQYVpqY1FCDQpFQURaa3N6S2V0eCtTcmF3aXNqRzZGZElQbWpxTXE5ZG5uNEZjMmNEQzZSQ1ltcmhxcjdMcFF2S0tnQ3gNCk52UXB6Z2U4NWR4cE1UbjNreUtNVXVMcXJhNTE0YTQ3anp5aHNRWHRBRTlHUFYySFA4YzRMUmRXdVl2cw0KcEJLUDFKcitVRDF0Q3pXQ1RjZzhvdXk2MHhlUWRpOTBlbDlFa2JLcGx5V0RSZnl0eU43U0V2aTQveFduDQpRZlJLc3hKTTRrN1gwMERqSWluemdEQWpDeS94cEtPSlI1a2NJT2p2c1ZlQXNScEhKMmVpTkZNL1cvQmsNCkJQdnVmcVFmOXUxeVU0N3Vqcnp0SktYUWQ5NmM2TEVvMXBmOXBEN2kxQUdVWTUyQThKR1JFdWNIR0t1ZQ0KdEZtYnY2NkF6QW1DbVdCNjhDSVY5SzhSYU1rUUFGMWpwR0lmS09FOTBSYVg4T3U3eG52cjNLZXFWVzhtDQpGNkhXUFprN3lmK3l2RW05NE9ZYjJxbUpZNjJRb2t6VHZvaC9XRFVKOXZ5WjBFTkdNa0FudFRTVWlrQVMNClNFWUZZY2p3amFtQkRyUkFLZS8venNBK3RFVkUwOEdURmFhTmVSb0ZrbnBhZlNNejkvSzc5ZFUrWmh4OQ0KckdYR0lRcGV5cG9TZDU1dXIrT3BSWlRXaVNwTGZQVnBHSDdiYmtwTDJ4akZsdkJjcW5ma1paRnJDRGpZDQo5YkhHaWd3UW5yTHhtUklEY1BOTGVCaDFJcCtYUVNSR21UbXhOcXYxOUlvMlJES1JUV29yVkt2T2Y1SGoNCmNFYUE4QTBNKy9wSzRrVU5LNDFMdlJzdjRnRlMzNW1RNG43VEZVVk1SQUlOSUo5K2d1WnNjQU5XZ0pYdg0KVVJ1SXZtcHUzOHljWHJlaEF2bEhaN2UzY3NIQlRBTkxXaS84NWkyVkFRRVAvMFlDZHprQzdtQ2M3QWFGDQovRnFRaXNMRG8xUy9ZQVJYTlNrOXJJOW03UEVUVTB2cUFmMnZYMktHTlBTU3BCY3UwdXJDQXMzV1VUQzENCmkyMGt2bmJJQkF5VVRzZXl6cWE3cHhVN1pHN0htSDZzUCtQVm95QXhXSU5pVlIvQXh6TEM2T0ZwSU5acw0KQk5oK2FnS25aN3g0TlQzdG9XWkRVVnBjVUIvVTFodFhKZjFsOVpyV014SWhEaUpBcnJJeXk0U0R3RU9hDQpiTHBGcWIxR3VaeXFOTVZ4SUtTMUd5U3BTWExXeXAySzUrZ1U2cStnSU5sTWx2NEhQdTdFUnplRU5VRk0NClViSlFXYXpNbGZnakVjZ251MmdRKzdNdkNDVGFVcVRuOEVrdGcwWUlGbldPaXNqU3cvWDRHcS9vajY3Vw0KWUlJOXl0SHhWL0JDVXZtQUFtNVYvdEVhZ1RKRCtObFpYWXFNL3loQzV4ekpZbDZxc21Qa0xFNGZEekdZDQpObGltdUkzdnNHVUw5N2VsaTh2dG9hT3FnYTJqNHZsZzVOMkxVaWNaTVgwWWpYM055d3hlWXBsUFBTVTANClNmc1BsWHJHS3N5YnhvMmJrWWlJSUN5cWRKYWNrWGpVeXhNNlV1ZGFEcit5U0YxZ0NBWCtiNCtrcmJyMg0KMjhQek9GcGIrRXNVZnh5UkIrT0FBTUJtZlNYL1ROTFY0c1FhRGUrcnJhUTF0NkNUZVhPcVA3SWZlYXJCDQo4U2tSbk9CVUQrMEE4RjlBWVIvakJPSmRSM1MrNFpZelRBL1paVGNTQ3RMNlc0OEZYUm0rSFE1L21FdEINCnJpeDgyVjZDV0QvM1VGdGpFckNZRlpleEgzdFhuSlQrSVBvRlA4WnErK0JUMTdJcFFRSEwyRWdHR0ZNNQ0KVjM5UUF2U3p3Y0ZNQTcyOWRtRDJtWTNFQVEvOUY5ZjVYaS9RNmx2bGI4RzEyZW5JWUwrUVdsZytWSUNVDQpQNEdNNzNoa2lsRVlVSzJPZk9sVnVvMGZ1VzBtNWpHTTlBemRDOUQ5cGxCTE1xZUpzbnlITCs5TUF6TjMNClpTbWMveGZMSGxlYStWZXFrdmI1aTd0RXBYcktJTW9NWUtJWERpbkhyWTRYSHdTNThzbE5nQzRCbkZPYg0KTjlHT0pueDcrc1FCV0VqeVdkUENSeDYyNXZxdlFTTTlsbWFiUmJ5cm5TK3orZ3p0djhYbEF6R1JUZTZiDQpZbzlrWUZvWTZWcWhLWWZVS2JSY3phdExMUzhQMFFRaTRnYkw2OUpLbll1KzlmVG9JcjY0THYwSHA4c0INCm5UYW91TjkyR1grWHJlRUxKRmZvOGtyQUJ6dlJMaGR5WnZyUzVQTloyZHQ1bnQyOUFHczFYbkdEYVAzQw0KVnRxcDVRY3JaM3JLRmZ4alZ0d0JGdTVqN0ZqWndxbDNCaGpHUGVpejBaOXU3cjJTWVlhNjdtS1NHeTNODQp1N3B0SVZwc21Va0xJNXNTYnBNMGtrRXhzZ0RVTXlIa3ZXcU5taHR0d2RQQlhjMk95MkR6WUZ1dWJIUGsNCnFLZ0lXYk10VzkvNnl4VThoZlRPTzhqUDdqQ2dNWGhrMjdJQTNNc2phRWZHN3FoRjQ4Ukd2QzMxWFgwdA0KMlJFTHJ3ckFwejFHZU1GRHRIcWJNQ2cwMWIwaFZEQkNFbzNqK3Rtakg4NlRVQStGdHJNVmNHazBMbkl5DQowcGh4ODF5Zi96eFJJQVFFYU02dVB6Y0x4dGVVMlF2ak0yV2prclZsNjlRYUtTYWtvU2JxUzJCVHFhWTANCkhKWUYrLzk2NXB6NklPbE94MFd4L2hiaHd6ZnQybEs4RHczTkdjMWxJa1d3azJyOHNGYlN4TDBCYVQ3WA0KTVZSVVV5NndjWEkwelFFcDBiTEl0YmZpOCtLK0F6VVNWeElSRXo2bXNTZUtpMllvNFFZK1lyZzd4bWNBDQprR29XQ1NVUFdTYlZabW5vVmFER3VSUnpWWFdSN3FMQWdZYkV0ZTVQRSs5clJVakJpUXZrYmhaOTdEd2MNCmVzWGVlTHY3MG1uR3Noc2ErY0paR0RqVm12RVVMOFFETXpzcCt0RE1NTkNuY2Y2WkIxMExJUzF4c2hETw0KZ1BqR3RMWFI0Z0ZxVVJ4NWhzaVhrQnRWcTZRZXhaWHZGbWxlZW5abkxrUkJaR3A0QWJYZldKZTZ5MFYwDQpMdXBITjdyZThhbWkzNlhyS3pCSHo5TmFPWXNaazJTT3BnN0piV1BGcGRqb3FKQmlDeitMSEc5Q0lZY2ENCkVyOGFnbmJFemJicTgxMFVtZTY1WjZUaUl1Mnl6cnFGUitXaGlsRVg1NytjS1o1dW04U3AyTzBXTlRkWQ0KYVdTYzI2c0sxUkI1SFVDTmN0a0RmKzNqMlZ1TWpad3c5UDVJSE8xSG8zZDI5TG1acWVkK0taRm5oc1FBDQpyNElqVmgzMld2eWs1emg1WGQ2K250US91Sjd6dmNPUzZpakRQYTFYKzdsb3B2VmhBUE5tVHE3cWpwcTYNCnNIeUlZMjNkZkE0VEZoRU5OU1poeGk0SGlTeUx2R3hlUW50aSswQ3NEa21iWFBDdVBVVklNZDBUZmh3bw0Kb1ovOTlZUGw5YWM1ejd1VFV6OGhoVzB4aC9aOTVKcko1VFlDbXBKTkRaMmtyUjA0S1cyTjNmNDlTVE1XDQo4aXZaYUp0TEErS0UxU0dzc25GSFIzaFRFajVmd0dzZ0hNdW0wNkFqeVRiZ0hidzEvQmVLRk1hNlZTZHQNCjZMOFVrTWxHYWd0OGhvSFJNb1poQVYzbTdIeFluSXlGYkpqU1Bya2Q3SlYrNHhLT2ZBK0dSM1VnYWVTbw0KcCtWYU0wMWRhZUZwdWszSUdIQzBrNmYycVdCNC9IcldYM1lnUVNndTFhRWhxem1LUGJOYjNMTzNRM2JODQpBTU91N3VzZmNKWU9qR0k3S2JrYWJoMzE2SFBXZzllZUZnYUZBV1JZL0VXa2tqZHJDNVpYcS8wMEx3QmINCnRKeTBrRnQ2Y3pMOUdBbVFtbThSMVRoY2ZOWlVNeFFjSlFGT2V0Y0xaMW00RWVwOEZMRVpaUzZNREhadA0KZXd2clEyeGpabjV3b3lsMElGRVRZd3hEcDFSdXFwaGVzVHFjSXowckQrODg5bElEL3FMeUZsM0NZc2M3DQpGcTIwY3ZZN0tPZlJ5RzJtbmg5UjRyQ2RMajZoa2RnT3VxYm84NHFic1liWkI3UExWWDVpdkVpeWF3WUMNCm1KZnpvMjF2OVlKd01lTEk1Rk9OUlBzWFpUMkk4eXhIWUYvVlBjTFJHc0RYaXgzTEVYcjEyVERtaER5eQ0KKzBpUlNvTjVoRDFBNUs0TW1SZmMvbUlmampSczJZb3ZLSDdUWVRIME54d0VaUlk4S2VTWUpZSllLZ3hRDQpWNUpkcFNLZjRoSzkrZ1FxaFYreHN0elk3bDdiZzFTWmx0NmdmT1BNVjVRbm9TTGNDbWltYmh3RUpwRkYNCm9aOTAzNlQ4WXdJTWZzZDNJRzI3Ym8vd2Q2MUVtbWRlbkhFMnhrYi8zQjBhK21zRU0zaVE3RW1WSFhFbg0KTVdxQXk4QU5nTkhKbTlWNXlTR0ZVSTBMYS9Ba2tkRUpaamkyb1dEenFRdE12K3JrSDQ2b2gxOXBhYlU1DQpLd0VHMURRaEs2REx2Vy9LWXFJWGVQQm41bFppZWpMM0NYdlEzcmJZcjQ4TDEvRW4zZ0hwTTQ5V25CT0YNCmRTNWU3YW5zakxMUFBUZmlhN2I3dHozWHZvc3E0dzZNdVJ4SWZIUDBpNWZDNGIzYmJpMXhVOVgyT2ExRw0KN2I1ZXNXN1BKYkR6Z1JqZ0xtSG5ic2FwSjVZK09BUHN3eDBrYkRzMFN4M2hQWVgrMVVrWmtwVldCOUtMDQpETlVrLzVkdi9MNDVOWWVVYkR3aVNKQnV6djlYK3JBNFk3YWZ1ajZtNEhtQTdXQkhUQkxScFRCb3BKU1UNClliWTRnRFdEUndmc0dUNzJPWTZDZjJJQWdFb3hrYWl1cDRZYmsyelBkY3dnVFo0UjRTVnpmUTltbTZkeA0KTmVJNmZPWDdWeHRZQU5MdWl3NHkzYlA4Y0J3V1doTW82TGY5NHhRZ1dIWnlBZXhIbUZXVmkwbFlJWm4rDQpxYTJET0NjV2g4VUEwdmNTR2tlcW5XZy91ZFpRN0Zib01FWWpab3hHNExYKzdqV09EZ1A5ZzV2blM2blENCndVbTF0SGtMaDROL29GMmZCNE1ZQjBIOWFsUlFMUXJuWE9tQVFTZ2pNaDh3RnNhZ2NZbFFsWUhja3Riaw0KZW1nbk9iZkpoWW11QkxQL2kwcFpPMXhBSHAwVTZ5cnFHaTJLOGd6K2t6Z041RUFHV21WbmpWaXAwdkxsDQpNOG9pWi91Qw0KPTNEK2owaw0KLS0tLS1FTkQgUEdQIE1FU1NBR0UtLS0tLQ0KDQotLS0tLS1zaW5pa2FlbC0_PV8xLTE3ODA3NDY3Nzc4ODIwLjI5NzkyMDk0NDIwMjYyOTUtLQ0K",
"historyId": "1499379",
"internalDate": "1780746778000"
}
}
Loading
Loading