n8n-nodes-canva
Version:
Node customizado do n8n para integração com Canva Connect APIs
255 lines • 18.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CanvaTrigger = void 0;
class CanvaTrigger {
constructor() {
this.description = {
displayName: 'Canva Trigger',
name: 'canvaTrigger',
icon: 'file:logo.svg',
group: ['trigger'],
version: 1,
subtitle: '={{$parameter["event"]}}',
description: 'Recebe notificações webhook do Canva em tempo real',
defaults: {
name: 'Canva Trigger',
},
inputs: [],
outputs: ['main'],
credentials: [
{
name: 'canvaApi',
required: true,
},
],
webhooks: [
{
name: 'default',
httpMethod: 'POST',
responseMode: 'onReceived',
path: 'canva-webhook',
},
],
properties: [
{
displayName: 'Event',
name: 'event',
type: 'options',
options: [
{
name: 'Comment Notification',
value: 'comment',
description: 'Eventos relacionados a comentários em designs',
},
{
name: 'Design Access Request',
value: 'design_access_request',
description: 'Solicitações de acesso a designs',
},
{
name: 'Design Approval',
value: 'design_approval',
description: 'Aprovações de designs',
},
{
name: 'Design Sharing Event',
value: 'design_sharing',
description: 'Eventos de compartilhamento de designs',
},
{
name: 'Folder Access Request',
value: 'folder_access_request',
description: 'Solicitações de acesso a pastas',
},
{
name: 'Folder Sharing Event',
value: 'folder_sharing',
description: 'Eventos de compartilhamento de pastas',
},
{
name: 'Team Access Invitation',
value: 'team_access_invitation',
description: 'Convites de acesso à equipe',
},
{
name: 'Suggestion Notification (Preview)',
value: 'suggestion',
description: '⚠️ Preview: Notificações de sugestões em Canva Docs',
},
{
name: 'Design Mention Notification (Preview)',
value: 'design_mention',
description: '⚠️ Preview: Menções em designs',
},
],
default: 'comment',
description: 'Tipo de evento do Canva que acionará o webhook',
},
{
displayName: 'Design ID Filter',
name: 'designIdFilter',
type: 'string',
displayOptions: {
show: {
event: [
'design.publish',
'design.share',
'design.update',
'comment.create',
'comment.resolve',
'export.complete',
'export.failed',
],
},
},
default: '',
description: 'Filtrar por ID específico do design (opcional)',
},
{
displayName: 'Folder ID Filter',
name: 'folderIdFilter',
type: 'string',
displayOptions: {
show: {
event: [
'folder.access_requested',
'folder.share',
],
},
},
default: '',
description: 'Filtrar por ID específico da pasta (opcional)',
},
{
displayName: 'User ID Filter',
name: 'userIdFilter',
type: 'string',
displayOptions: {
show: {
event: [
'user.mention',
'comment.create',
'suggestion.create',
],
},
},
default: '',
description: 'Filtrar por ID específico do usuário (opcional)',
},
{
displayName: 'Validate Signature',
name: 'validateSignature',
type: 'boolean',
default: true,
description: 'Whether validar assinatura HMAC do webhook para segurança',
},
{
displayName: 'Webhook Secret',
name: 'webhookSecret',
type: 'string',
typeOptions: { password: true },
displayOptions: {
show: {
validateSignature: [true],
},
},
default: '',
description: 'Segredo compartilhado para validação HMAC do webhook',
},
],
};
}
async webhook() {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
const event = this.getNodeParameter('event');
const designIdFilter = this.getNodeParameter('designIdFilter', '');
const folderIdFilter = this.getNodeParameter('folderIdFilter', '');
const userIdFilter = this.getNodeParameter('userIdFilter', '');
const validateSignature = this.getNodeParameter('validateSignature', true);
const webhookSecret = this.getNodeParameter('webhookSecret', '');
const body = this.getBodyData();
const headers = this.getHeaderData();
// Validação da assinatura HMAC se habilitada
if (validateSignature && webhookSecret) {
const crypto = require('crypto');
const signature = headers['x-canva-signature'];
if (!signature) {
console.log('Webhook rejeitado: Assinatura ausente');
return {
noWebhookResponse: true,
};
}
const expectedSignature = crypto
.createHmac('sha256', webhookSecret)
.update(JSON.stringify(body))
.digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(signature, 'hex'), Buffer.from(expectedSignature, 'hex'))) {
console.log('Webhook rejeitado: Assinatura inválida');
return {
noWebhookResponse: true,
};
}
}
// Verificar se é o evento esperado
if (body.event_type !== event) {
return {
noWebhookResponse: true,
};
}
// Aplicar filtros específicos baseados no tipo de evento
let shouldProcess = true;
// Filtros para eventos de design
if (designIdFilter && ['design.publish', 'design.share', 'design.update', 'comment.create', 'comment.resolve', 'export.complete', 'export.failed'].includes(event)) {
const designId = ((_b = (_a = body.data) === null || _a === void 0 ? void 0 : _a.design) === null || _b === void 0 ? void 0 : _b.id) || ((_c = body.data) === null || _c === void 0 ? void 0 : _c.design_id);
shouldProcess = designId === designIdFilter;
}
// Filtros para eventos de pasta
if (folderIdFilter && ['folder.access_requested', 'folder.share'].includes(event)) {
const folderId = ((_e = (_d = body.data) === null || _d === void 0 ? void 0 : _d.folder) === null || _e === void 0 ? void 0 : _e.id) || ((_f = body.data) === null || _f === void 0 ? void 0 : _f.folder_id);
shouldProcess = folderId === folderIdFilter;
}
// Filtros para eventos de usuário
if (userIdFilter && ['user.mention', 'comment.create', 'suggestion.create'].includes(event)) {
const userId = ((_h = (_g = body.data) === null || _g === void 0 ? void 0 : _g.user) === null || _h === void 0 ? void 0 : _h.id) || ((_k = (_j = body.data) === null || _j === void 0 ? void 0 : _j.mentioned_user) === null || _k === void 0 ? void 0 : _k.id) || ((_o = (_m = (_l = body.data) === null || _l === void 0 ? void 0 : _l.comment) === null || _m === void 0 ? void 0 : _m.author) === null || _o === void 0 ? void 0 : _o.id);
shouldProcess = userId === userIdFilter;
}
if (!shouldProcess) {
return {
noWebhookResponse: true,
};
}
// Enriquecer dados do webhook com informações úteis
const webhookData = {
event_type: body.event_type,
event_id: body.event_id,
timestamp: body.timestamp,
created_at: body.created_at,
data: body.data,
metadata: {
webhook_url: this.getNodeWebhookUrl('default'),
processed_at: new Date().toISOString(),
filters_applied: {
event,
design_id_filter: designIdFilter || null,
folder_id_filter: folderIdFilter || null,
user_id_filter: userIdFilter || null,
},
},
};
return {
webhookResponse: {
status: 200,
body: { received: true },
},
workflowData: [
[
{
json: webhookData,
},
],
],
};
}
}
exports.CanvaTrigger = CanvaTrigger;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FudmFUcmlnZ2VyLm5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9ub2Rlcy9DYW52YS9DYW52YVRyaWdnZXIubm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFPQSxNQUFhLFlBQVk7SUFBekI7UUFDQyxnQkFBVyxHQUF5QjtZQUNuQyxXQUFXLEVBQUUsZUFBZTtZQUM1QixJQUFJLEVBQUUsY0FBYztZQUNwQixJQUFJLEVBQUUsZUFBZTtZQUNyQixLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDbEIsT0FBTyxFQUFFLENBQUM7WUFDVixRQUFRLEVBQUUsMEJBQTBCO1lBQ3BDLFdBQVcsRUFBRSxvREFBb0Q7WUFDakUsUUFBUSxFQUFFO2dCQUNULElBQUksRUFBRSxlQUFlO2FBQ3JCO1lBQ0QsTUFBTSxFQUFFLEVBQUU7WUFDVixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakIsV0FBVyxFQUFFO2dCQUNaO29CQUNDLElBQUksRUFBRSxVQUFVO29CQUNoQixRQUFRLEVBQUUsSUFBSTtpQkFDZDthQUNEO1lBQ0QsUUFBUSxFQUFFO2dCQUNUO29CQUNDLElBQUksRUFBRSxTQUFTO29CQUNmLFVBQVUsRUFBRSxNQUFNO29CQUNsQixZQUFZLEVBQUUsWUFBWTtvQkFDMUIsSUFBSSxFQUFFLGVBQWU7aUJBQ3JCO2FBQ0Q7WUFDRCxVQUFVLEVBQUU7Z0JBQ1g7b0JBQ0MsV0FBVyxFQUFFLE9BQU87b0JBQ3BCLElBQUksRUFBRSxPQUFPO29CQUNiLElBQUksRUFBRSxTQUFTO29CQUNmLE9BQU8sRUFBRTt3QkFDUjs0QkFDQyxJQUFJLEVBQUUsc0JBQXNCOzRCQUM1QixLQUFLLEVBQUUsU0FBUzs0QkFDaEIsV0FBVyxFQUFFLCtDQUErQzt5QkFDNUQ7d0JBQ0Q7NEJBQ0MsSUFBSSxFQUFFLHVCQUF1Qjs0QkFDN0IsS0FBSyxFQUFFLHVCQUF1Qjs0QkFDOUIsV0FBVyxFQUFFLGtDQUFrQzt5QkFDL0M7d0JBQ0Q7NEJBQ0MsSUFBSSxFQUFFLGlCQUFpQjs0QkFDdkIsS0FBSyxFQUFFLGlCQUFpQjs0QkFDeEIsV0FBVyxFQUFFLHVCQUF1Qjt5QkFDcEM7d0JBQ0Q7NEJBQ0MsSUFBSSxFQUFFLHNCQUFzQjs0QkFDNUIsS0FBSyxFQUFFLGdCQUFnQjs0QkFDdkIsV0FBVyxFQUFFLHdDQUF3Qzt5QkFDckQ7d0JBQ0Q7NEJBQ0MsSUFBSSxFQUFFLHVCQUF1Qjs0QkFDN0IsS0FBSyxFQUFFLHVCQUF1Qjs0QkFDOUIsV0FBVyxFQUFFLGlDQUFpQzt5QkFDOUM7d0JBQ0Q7NEJBQ0MsSUFBSSxFQUFFLHNCQUFzQjs0QkFDNUIsS0FBSyxFQUFFLGdCQUFnQjs0QkFDdkIsV0FBVyxFQUFFLHVDQUF1Qzt5QkFDcEQ7d0JBQ0Q7NEJBQ0MsSUFBSSxFQUFFLHdCQUF3Qjs0QkFDOUIsS0FBSyxFQUFFLHdCQUF3Qjs0QkFDL0IsV0FBVyxFQUFFLDZCQUE2Qjt5QkFDMUM7d0JBQ0Q7NEJBQ0MsSUFBSSxFQUFFLG1DQUFtQzs0QkFDekMsS0FBSyxFQUFFLFlBQVk7NEJBQ25CLFdBQVcsRUFBRSxxREFBcUQ7eUJBQ2xFO3dCQUNEOzRCQUNDLElBQUksRUFBRSx1Q0FBdUM7NEJBQzdDLEtBQUssRUFBRSxnQkFBZ0I7NEJBQ3ZCLFdBQVcsRUFBRSxnQ0FBZ0M7eUJBQzdDO3FCQUNEO29CQUNELE9BQU8sRUFBRSxTQUFTO29CQUNsQixXQUFXLEVBQUUsZ0RBQWdEO2lCQUM3RDtnQkFDRDtvQkFDQyxXQUFXLEVBQUUsa0JBQWtCO29CQUMvQixJQUFJLEVBQUUsZ0JBQWdCO29CQUN0QixJQUFJLEVBQUUsUUFBUTtvQkFDZCxjQUFjLEVBQUU7d0JBQ2YsSUFBSSxFQUFFOzRCQUNMLEtBQUssRUFBRTtnQ0FDTixnQkFBZ0I7Z0NBQ2hCLGNBQWM7Z0NBQ2QsZUFBZTtnQ0FDZixnQkFBZ0I7Z0NBQ2hCLGlCQUFpQjtnQ0FDakIsaUJBQWlCO2dDQUNqQixlQUFlOzZCQUNmO3lCQUNEO3FCQUNEO29CQUNELE9BQU8sRUFBRSxFQUFFO29CQUNYLFdBQVcsRUFBRSxnREFBZ0Q7aUJBQzdEO2dCQUNEO29CQUNDLFdBQVcsRUFBRSxrQkFBa0I7b0JBQy9CLElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLElBQUksRUFBRSxRQUFRO29CQUNkLGNBQWMsRUFBRTt3QkFDZixJQUFJLEVBQUU7NEJBQ0wsS0FBSyxFQUFFO2dDQUNOLHlCQUF5QjtnQ0FDekIsY0FBYzs2QkFDZDt5QkFDRDtxQkFDRDtvQkFDRCxPQUFPLEVBQUUsRUFBRTtvQkFDWCxXQUFXLEVBQUUsK0NBQStDO2lCQUM1RDtnQkFDRDtvQkFDQyxXQUFXLEVBQUUsZ0JBQWdCO29CQUM3QixJQUFJLEVBQUUsY0FBYztvQkFDcEIsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsY0FBYyxFQUFFO3dCQUNmLElBQUksRUFBRTs0QkFDTCxLQUFLLEVBQUU7Z0NBQ04sY0FBYztnQ0FDZCxnQkFBZ0I7Z0NBQ2hCLG1CQUFtQjs2QkFDbkI7eUJBQ0Q7cUJBQ0Q7b0JBQ0QsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsV0FBVyxFQUFFLGlEQUFpRDtpQkFDOUQ7Z0JBQ0Q7b0JBQ0MsV0FBVyxFQUFFLG9CQUFvQjtvQkFDakMsSUFBSSxFQUFFLG1CQUFtQjtvQkFDekIsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsT0FBTyxFQUFFLElBQUk7b0JBQ2IsV0FBVyxFQUFFLDJEQUEyRDtpQkFDeEU7Z0JBQ0Q7b0JBQ0MsV0FBVyxFQUFFLGdCQUFnQjtvQkFDN0IsSUFBSSxFQUFFLGVBQWU7b0JBQ3JCLElBQUksRUFBRSxRQUFRO29CQUNkLFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7b0JBQy9CLGNBQWMsRUFBRTt3QkFDZixJQUFJLEVBQUU7NEJBQ0wsaUJBQWlCLEVBQUUsQ0FBQyxJQUFJLENBQUM7eUJBQ3pCO3FCQUNEO29CQUNELE9BQU8sRUFBRSxFQUFFO29CQUNYLFdBQVcsRUFBRSxzREFBc0Q7aUJBQ25FO2FBQ0Q7U0FDRCxDQUFDO0lBNEdILENBQUM7SUExR0EsS0FBSyxDQUFDLE9BQU87O1FBQ1osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBVyxDQUFDO1FBQ3ZELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQVcsQ0FBQztRQUM3RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFXLENBQUM7UUFDN0UsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxFQUFFLENBQVcsQ0FBQztRQUN6RSxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQVksQ0FBQztRQUN0RixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBVyxDQUFDO1FBRTNFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQVMsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFckMsNkNBQTZDO1FBQzdDLElBQUksaUJBQWlCLElBQUksYUFBYSxFQUFFLENBQUM7WUFDeEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBVyxDQUFDO1lBRXpELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO2dCQUNyRCxPQUFPO29CQUNOLGlCQUFpQixFQUFFLElBQUk7aUJBQ3ZCLENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNO2lCQUM5QixVQUFVLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQztpQkFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzVCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVoQixJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQ3JDLEVBQUUsQ0FBQztnQkFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7Z0JBQ3RELE9BQU87b0JBQ04saUJBQWlCLEVBQUUsSUFBSTtpQkFDdkIsQ0FBQztZQUNILENBQUM7UUFDRixDQUFDO1FBRUQsbUNBQW1DO1FBQ25DLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMvQixPQUFPO2dCQUNOLGlCQUFpQixFQUFFLElBQUk7YUFDdkIsQ0FBQztRQUNILENBQUM7UUFFRCx5REFBeUQ7UUFDekQsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBRXpCLGlDQUFpQztRQUNqQyxJQUFJLGNBQWMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEssTUFBTSxRQUFRLEdBQUcsQ0FBQSxNQUFBLE1BQUEsSUFBSSxDQUFDLElBQUksMENBQUUsTUFBTSwwQ0FBRSxFQUFFLE1BQUksTUFBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxTQUFTLENBQUEsQ0FBQztZQUMvRCxhQUFhLEdBQUcsUUFBUSxLQUFLLGNBQWMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsZ0NBQWdDO1FBQ2hDLElBQUksY0FBYyxJQUFJLENBQUMseUJBQXlCLEVBQUUsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkYsTUFBTSxRQUFRLEdBQUcsQ0FBQSxNQUFBLE1BQUEsSUFBSSxDQUFDLElBQUksMENBQUUsTUFBTSwwQ0FBRSxFQUFFLE1BQUksTUFBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxTQUFTLENBQUEsQ0FBQztZQUMvRCxhQUFhLEdBQUcsUUFBUSxLQUFLLGNBQWMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsa0NBQWtDO1FBQ2xDLElBQUksWUFBWSxJQUFJLENBQUMsY0FBYyxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0YsTUFBTSxNQUFNLEdBQUcsQ0FBQSxNQUFBLE1BQUEsSUFBSSxDQUFDLElBQUksMENBQUUsSUFBSSwwQ0FBRSxFQUFFLE1BQUksTUFBQSxNQUFBLElBQUksQ0FBQyxJQUFJLDBDQUFFLGNBQWMsMENBQUUsRUFBRSxDQUFBLEtBQUksTUFBQSxNQUFBLE1BQUEsSUFBSSxDQUFDLElBQUksMENBQUUsT0FBTywwQ0FBRSxNQUFNLDBDQUFFLEVBQUUsQ0FBQSxDQUFDO1lBQ3RHLGFBQWEsR0FBRyxNQUFNLEtBQUssWUFBWSxDQUFDO1FBQ3pDLENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDcEIsT0FBTztnQkFDTixpQkFBaUIsRUFBRSxJQUFJO2FBQ3ZCLENBQUM7UUFDSCxDQUFDO1FBRUQsb0RBQW9EO1FBQ3BELE1BQU0sV0FBVyxHQUFHO1lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixRQUFRLEVBQUU7Z0JBQ1QsV0FBVyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7Z0JBQzlDLFlBQVksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtnQkFDdEMsZUFBZSxFQUFFO29CQUNoQixLQUFLO29CQUNMLGdCQUFnQixFQUFFLGNBQWMsSUFBSSxJQUFJO29CQUN4QyxnQkFBZ0IsRUFBRSxjQUFjLElBQUksSUFBSTtvQkFDeEMsY0FBYyxFQUFFLFlBQVksSUFBSSxJQUFJO2lCQUNwQzthQUNEO1NBQ0QsQ0FBQztRQUVGLE9BQU87WUFDTixlQUFlLEVBQUU7Z0JBQ2hCLE1BQU0sRUFBRSxHQUFHO2dCQUNYLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7YUFDeEI7WUFDRCxZQUFZLEVBQUU7Z0JBQ2I7b0JBQ0M7d0JBQ0MsSUFBSSxFQUFFLFdBQVc7cUJBQ2pCO2lCQUNEO2FBQ0Q7U0FDRCxDQUFDO0lBQ0gsQ0FBQztDQUNEO0FBdlFELG9DQXVRQyJ9