Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@lvenezia
Last active December 28, 2023 01:54
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lvenezia/173737e5d254c4d855d61f3a789df909 to your computer and use it in GitHub Desktop.
Save lvenezia/173737e5d254c4d855d61f3a789df909 to your computer and use it in GitHub Desktop.
Create a new snippet from a blank template.
name: VonageExcelScriptLab
description: Embed a Vonage Business Communications dialer into Microsoft Excel Online
host: EXCEL
api_set: {}
script:
content: |+
function handleSelectionChanged(event) {
return Excel.run(function (context) {
var range = context.workbook.getSelectedRange().load();
return context.sync().then(function () {
const selectedContent = JSON.stringify(range.values, null, 4);
const rowString = JSON.stringify(range.rowIndex, null, 4);
const rowIndex = Number(rowString) + 1;
if (selectedContent.match("Dial")) {
placeCall(rowIndex);
}
});
}).catch(errorHandlerFunction);
}
function placeCall(row) {
return Excel.run(function (context) {
var toNumberRange = context.workbook.worksheets
.getItem("Sheet1")
.getRange("D" + row)
.load();
return context.sync().then(function () {
const toNumber = JSON.stringify(toNumberRange.values, null, 4);
//console.log("toNumber: " + toNumber);
VonageDialer.placeCall(toNumber);
});
}).catch(errorHandlerFunction);
}
function populateSampleData() {
return Excel.run(function (context) {
var worksheet = context.workbook.worksheets.getItem("Sheet1");
const data = [
["Company", "Contact Last", "Contact First", "Number", ""],
["Widget Zone", "Anderson", "Wendy", "555-555-5555", "Dial"],
["Widgets Galore", "Burns", "Ryan", "555-555-5555", "Dial"],
["Widgets Emporium", "Johnson", "Amanda", "555-555-5555", "Dial"]
];
var range = worksheet.getRange("A2:E5");
range.values = data;
range.format.autofitColumns();
return context.sync().then(function () { });
}).catch(errorHandlerFunction);
}
function translateContacts(excelData) {
excelData = JSON.parse(excelData);
let len = excelData.length,
contactsData = [],
obj = new Object(),
objString = "",
i;
for (i = 0; i < len; i += 1) {
if (excelData[i][4] == "Dial") {
obj["provider"] = "excel";
obj["id"] = i;
obj["label"] = excelData[i][2] + " " + excelData[i][1] + " of " + excelData[i][0];
obj["type"] = "Contact";
const ph = libphonenumber.parsePhoneNumber(excelData[i][3], countryCode);
obj["phoneNumber"] = ph.format("INTERNATIONAL").replace(/\D/g, "");
objString = JSON.stringify(obj);
contactsData.push(JSON.parse(objString));
}
}
return contactsData;
}
function filterContacts(query, contacts) {
const sortedContacts = contacts.sort(function (a, b) {
const labelA = a.label.toUpperCase(); // ignore upper and lowercase
const labelB = b.label.toUpperCase(); // ignore upper and lowercase
if (labelA < labelB) {
return -1;
}
if (labelA > labelB) {
return 1;
}
// names must be equal
return 0;
});
let filteredContacts = [];
for (let i = 0; i < sortedContacts.length; i++) {
if (
JSON.stringify(Object.values(sortedContacts[i]).filter(item => item !== "excel"))
.toUpperCase()
.indexOf(query.toUpperCase()) > 0
) {
filteredContacts.push(sortedContacts[i]);
const ph = libphonenumber.parsePhoneNumber(sortedContacts[i].phoneNumber, countryCode);
sortedContacts[i].phoneNumber = ph.format("INTERNATIONAL");
}
}
return filteredContacts;
}
function errorHandlerFunction(e) {
console.log(e);
}
const countryCode = "US";
VonageDialer.setCountryCode(countryCode);
VonageDialer.init(
{
features: {
contactsProvider: true,
openContact: true
}
},
(dialer) => {
dialer.registerSvgIcon(
"excel",
"data: image / svg + xml; utf8; base64, PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTkwIiBoZWlnaHQ9IjE2NiIgdmlld0JveD0iMCAwIDE5MCAxNjYiPjxkZWZzPjxyZWN0IGlkPSJqIiB3aWR0aD0iMTQyIiBoZWlnaHQ9IjE2NiIgcng9IjgiLz48bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI2LjI5NCUiIHgyPSIxMDMuNDAyJSIgeTE9IjAlIiB5Mj0iMTAzLjUlIj48c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjMDA3NDM4Ii8 + PHN0b3Agb2Zmc2V0PSI5Ny4zNCUiIHN0b3AtY29sb3I9IiMwMDhCNDQiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IGlkPSJtIiB3aWR0aD0iNzEiIGhlaWdodD0iNDIiIHk9IjQxIi8 + PHBhdHRlcm4gaWQ9Im4iIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB4PSItNTEyIiB5PSItNDcxIiBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIj48dXNlIHhsaW5rOmhyZWY9IiNhIi8 + PC9wYXR0ZXJuPjxmaWx0ZXIgaWQ9Im8iIHdpZHRoPSIxMDIuOCUiIGhlaWdodD0iMTA0LjglIiB4PSItMS40JSIgeT0iLTIuNCUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCI + PGZlT2Zmc2V0IGR4PSItMSIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd09mZnNldElubmVyMSIvPjxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93T2Zmc2V0SW5uZXIxIiBpbjI9IlNvdXJjZUFscGhhIiBrMj0iLTEiIGszPSIxIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgcmVzdWx0PSJzaGFkb3dJbm5lcklubmVyMSIvPjxmZUNvbG9yTWF0cml4IGluPSJzaGFkb3dJbm5lcklubmVyMSIgcmVzdWx0PSJzaGFkb3dNYXRyaXhJbm5lcjEiIHZhbHVlcz0iMCAwIDAgMCAxICAgMCAwIDAgMCAxICAgMCAwIDAgMCAxICAwIDAgMCAwLjEgMCIvPjxmZUdhdXNzaWFuQmx1ciBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93Qmx1cklubmVyMiIgc3RkRGV2aWF0aW9uPSIuNSIvPjxmZU9mZnNldCBkeT0iMSIgaW49InNoYWRvd0JsdXJJbm5lcjIiIHJlc3VsdD0ic2hhZG93T2Zmc2V0SW5uZXIyIi8 + PGZlQ29tcG9zaXRlIGluPSJzaGFkb3dPZmZzZXRJbm5lcjIiIGluMj0iU291cmNlQWxwaGEiIGsyPSItMSIgazM9IjEiIG9wZXJhdG9yPSJhcml0aG1ldGljIiByZXN1bHQ9InNoYWRvd0lubmVySW5uZXIyIi8 + PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd0lubmVySW5uZXIyIiByZXN1bHQ9InNoYWRvd01hdHJpeElubmVyMiIgdmFsdWVzPSIwIDAgMCAwIDAgICAwIDAgMCAwIDAgICAwIDAgMCAwIDAgIDAgMCAwIDAuMDggMCIvPjxmZU1lcmdlPjxmZU1lcmdlTm9kZSBpbj0ic2hhZG93TWF0cml4SW5uZXIxIi8 + PGZlTWVyZ2VOb2RlIGluPSJzaGFkb3dNYXRyaXhJbm5lcjIiLz48L2ZlTWVyZ2U + PC9maWx0ZXI + PGxpbmVhckdyYWRpZW50IGlkPSJwIiB4MT0iMTA3LjQ2NiUiIHgyPSI2LjI5NCUiIHkxPSIxMDcuODMxJSIgeTI9IjAlIj48c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjMDBENTc2Ii8 + PHN0b3Agb2Zmc2V0PSI5Ny4wMjYlIiBzdG9wLWNvbG9yPSIjMDBBMDU0Ii8 + PC9saW5lYXJHcmFkaWVudD48cmVjdCBpZD0icSIgd2lkdGg9IjcxIiBoZWlnaHQ9IjQyIiB4PSI3MSIgeT0iNDEiLz48cGF0dGVybiBpZD0iciIgd2lkdGg9IjUxMiIgaGVpZ2h0PSI1MTIiIHg9Ii00NDEiIHk9Ii00NzEiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjx1c2UgeGxpbms6aHJlZj0iI2IiLz48L3BhdHRlcm4 + PGZpbHRlciBpZD0icyIgd2lkdGg9IjE0My43JSIgaGVpZ2h0PSIxNzMuOCUiIHg9Ii0yMS44JSIgeT0iLTM2LjklIiBmaWx0ZXJVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPjxmZU9mZnNldCBkeT0iLTEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjEiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjEiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjEiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIxIiB2YWx1ZXM9IjAgMCAwIDAgMSAgIDAgMCAwIDAgMSAgIDAgMCAwIDAgMSAgMCAwIDAgMC4wNSAwIi8 + PGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dCbHVySW5uZXIyIiBzdGREZXZpYXRpb249IjEwIi8 + PGZlT2Zmc2V0IGR5PSIxMSIgaW49InNoYWRvd0JsdXJJbm5lcjIiIHJlc3VsdD0ic2hhZG93T2Zmc2V0SW5uZXIyIi8 + PGZlQ29tcG9zaXRlIGluPSJzaGFkb3dPZmZzZXRJbm5lcjIiIGluMj0iU291cmNlQWxwaGEiIGsyPSItMSIgazM9IjEiIG9wZXJhdG9yPSJhcml0aG1ldGljIiByZXN1bHQ9InNoYWRvd0lubmVySW5uZXIyIi8 + PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd0lubmVySW5uZXIyIiByZXN1bHQ9InNoYWRvd01hdHJpeElubmVyMiIgdmFsdWVzPSIwIDAgMCAwIDAgICAwIDAgMCAwIDAgICAwIDAgMCAwIDAgIDAgMCAwIDAuMTQgMCIvPjxmZU9mZnNldCBkeD0iMSIgZHk9IjEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjMiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMyIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjMiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjMiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIzIiB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4xNSAwIi8 + PGZlTWVyZ2U + PGZlTWVyZ2VOb2RlIGluPSJzaGFkb3dNYXRyaXhJbm5lcjEiLz48ZmVNZXJnZU5vZGUgaW49InNoYWRvd01hdHJpeElubmVyMiIvPjxmZU1lcmdlTm9kZSBpbj0ic2hhZG93TWF0cml4SW5uZXIzIi8 + PC9mZU1lcmdlPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0idCIgeDE9IjYuMjk0JSIgeDI9IjEwNy40NjYlIiB5MT0iMCUiIHkyPSIxMDcuODMxJSI + PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwN0U0MiIvPjxzdG9wIG9mZnNldD0iOTUuOTgzJSIgc3RvcC1jb2xvcj0iIzAwOUE1MCIvPjwvbGluZWFyR3JhZGllbnQ + PHJlY3QgaWQ9InUiIHdpZHRoPSI3MSIgaGVpZ2h0PSI0MiIgeT0iLTEiLz48cGF0dGVybiBpZD0idiIgd2lkdGg9IjUxMiIgaGVpZ2h0PSI1MTIiIHg9Ii01MTIiIHk9Ii01MTMiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjx1c2UgeGxpbms6aHJlZj0iI2MiLz48L3BhdHRlcm4 + PGZpbHRlciBpZD0idyIgd2lkdGg9IjEwMS40JSIgaGVpZ2h0PSIxMDIuNCUiIHg9Ii0uNyUiIHk9Ii0xLjIlIiBmaWx0ZXJVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPjxmZU9mZnNldCBkeT0iLTEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjEiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjEiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjEiIHZhbHVlcz0iMCAwIDAgMCAxICAgMCAwIDAgMCAxICAgMCAwIDAgMCAxICAwIDAgMCAwLjE1IDAiLz48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQgaWQ9IngiIHgxPSI2LjI5NCUiIHgyPSIxMDcuNDY2JSIgeTE9IjAlIiB5Mj0iMTA3LjgzMSUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiMwMEFENjEiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMEUxOEMiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IGlkPSJ5IiB3aWR0aD0iNzEiIGhlaWdodD0iNDIiIHg9IjcxIiB5PSItMSIvPjxwYXR0ZXJuIGlkPSJ6IiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgeD0iLTQ0MSIgeT0iLTUxMyIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSI + PHVzZSB4bGluazpocmVmPSIjZCIvPjwvcGF0dGVybj48ZmlsdGVyIGlkPSJBIiB3aWR0aD0iMTAyLjglIiBoZWlnaHQ9IjEwNC44JSIgeD0iLTEuNCUiIHk9Ii0yLjQlIiBmaWx0ZXJVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPjxmZU9mZnNldCBkeT0iLTEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjEiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjEiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjEiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIxIiB2YWx1ZXM9IjAgMCAwIDAgMSAgIDAgMCAwIDAgMSAgIDAgMCAwIDAgMSAgMCAwIDAgMC4xNSAwIi8 + PGZlT2Zmc2V0IGR4PSIyIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0SW5uZXIyIi8 + PGZlQ29tcG9zaXRlIGluPSJzaGFkb3dPZmZzZXRJbm5lcjIiIGluMj0iU291cmNlQWxwaGEiIGsyPSItMSIgazM9IjEiIG9wZXJhdG9yPSJhcml0aG1ldGljIiByZXN1bHQ9InNoYWRvd0lubmVySW5uZXIyIi8 + PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd0lubmVySW5uZXIyIiByZXN1bHQ9InNoYWRvd01hdHJpeElubmVyMiIgdmFsdWVzPSIwIDAgMCAwIDAgICAwIDAgMCAwIDAuNzA5ODAzOTIyICAgMCAwIDAgMCAwLjM3MjU0OTAyICAwIDAgMCAwLjYzIDAiLz48ZmVNZXJnZT48ZmVNZXJnZU5vZGUgaW49InNoYWRvd01hdHJpeElubmVyMSIvPjxmZU1lcmdlTm9kZSBpbj0ic2hhZG93TWF0cml4SW5uZXIyIi8 + PC9mZU1lcmdlPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iQiIgeDE9IjEwNy40NjYlIiB4Mj0iOS4zMDMlIiB5MT0iMTA3LjgzMSUiIHkyPSIzLjIwNyUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiMwMDNEMjAiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDRGMkEiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IGlkPSJDIiB3aWR0aD0iNzEiIGhlaWdodD0iNDIiIHk9IjgzIi8 + PHBhdHRlcm4gaWQ9IkQiIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB4PSItNTEyIiB5PSItNDI5IiBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIj48dXNlIHhsaW5rOmhyZWY9IiNlIi8 + PC9wYXR0ZXJuPjxmaWx0ZXIgaWQ9IkUiIHdpZHRoPSIxMDIuOCUiIGhlaWdodD0iMTA0LjglIiB4PSItMS40JSIgeT0iLTIuNCUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCI + PGZlT2Zmc2V0IGR4PSItMSIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd09mZnNldElubmVyMSIvPjxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93T2Zmc2V0SW5uZXIxIiBpbjI9IlNvdXJjZUFscGhhIiBrMj0iLTEiIGszPSIxIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgcmVzdWx0PSJzaGFkb3dJbm5lcklubmVyMSIvPjxmZUNvbG9yTWF0cml4IGluPSJzaGFkb3dJbm5lcklubmVyMSIgcmVzdWx0PSJzaGFkb3dNYXRyaXhJbm5lcjEiIHZhbHVlcz0iMCAwIDAgMCAxICAgMCAwIDAgMCAxICAgMCAwIDAgMCAxICAwIDAgMCAwLjcgMCIvPjxmZU9mZnNldCBkeD0iMiIgZHk9IjEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjIiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMiIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjIiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjIiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIyIiB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4wOCAwIi8 + PGZlTWVyZ2U + PGZlTWVyZ2VOb2RlIGluPSJzaGFkb3dNYXRyaXhJbm5lcjEiLz48ZmVNZXJnZU5vZGUgaW49InNoYWRvd01hdHJpeElubmVyMiIvPjwvZmVNZXJnZT48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQgaWQ9IkYiIHgxPSIxMDcuNDY2JSIgeDI9IjkuMzAzJSIgeTE9IjEwNy44MzElIiB5Mj0iMy4yMDclIj48c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjMDBDMTY1Ii8 + PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMDA4RDQ2Ii8 + PC9saW5lYXJHcmFkaWVudD48cmVjdCBpZD0iRyIgd2lkdGg9IjcxIiBoZWlnaHQ9IjQyIiB4PSI3MSIgeT0iODMiLz48cGF0dGVybiBpZD0iSCIgd2lkdGg9IjUxMiIgaGVpZ2h0PSI1MTIiIHg9Ii00NDEiIHk9Ii00MjkiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjx1c2UgeGxpbms6aHJlZj0iI2YiLz48L3BhdHRlcm4 + PGZpbHRlciBpZD0iSSIgd2lkdGg9IjEwMS40JSIgaGVpZ2h0PSIxMDIuNCUiIHg9Ii0uNyUiIHk9Ii0xLjIlIiBmaWx0ZXJVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPjxmZU9mZnNldCBkeT0iLTEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjEiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjEiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjEiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIxIiB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4xMiAwIi8 + PGZlT2Zmc2V0IGR4PSIxIiBkeT0iMSIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd09mZnNldElubmVyMiIvPjxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93T2Zmc2V0SW5uZXIyIiBpbjI9IlNvdXJjZUFscGhhIiBrMj0iLTEiIGszPSIxIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgcmVzdWx0PSJzaGFkb3dJbm5lcklubmVyMiIvPjxmZUNvbG9yTWF0cml4IGluPSJzaGFkb3dJbm5lcklubmVyMiIgcmVzdWx0PSJzaGFkb3dNYXRyaXhJbm5lcjIiIHZhbHVlcz0iMCAwIDAgMCAwICAgMCAwIDAgMCAwICAgMCAwIDAgMCAwICAwIDAgMCAwLjA1IDAiLz48ZmVNZXJnZT48ZmVNZXJnZU5vZGUgaW49InNoYWRvd01hdHJpeElubmVyMSIvPjxmZU1lcmdlTm9kZSBpbj0ic2hhZG93TWF0cml4SW5uZXIyIi8 + PC9mZU1lcmdlPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iSiIgeDE9IjEwNy40NjYlIiB4Mj0iOS4zMDMlIiB5MT0iMTA3LjgzMSUiIHkyPSIzLjIwNyUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiMwMDUyMkUiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDNCMjAiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IGlkPSJLIiB3aWR0aD0iNzEiIGhlaWdodD0iNDIiIHk9IjEyNSIvPjxwYXR0ZXJuIGlkPSJMIiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgeD0iLTUxMiIgeT0iLTM4NyIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSI + PHVzZSB4bGluazpocmVmPSIjZyIvPjwvcGF0dGVybj48ZmlsdGVyIGlkPSJNIiB3aWR0aD0iMTAyLjglIiBoZWlnaHQ9IjEwNC44JSIgeD0iLTEuNCUiIHk9Ii0yLjQlIiBmaWx0ZXJVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPjxmZU9mZnNldCBkeD0iLTEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjEiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjEiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjEiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIxIiB2YWx1ZXM9IjAgMCAwIDAgMSAgIDAgMCAwIDAgMSAgIDAgMCAwIDAgMSAgMCAwIDAgMC4xNSAwIi8 + PGZlT2Zmc2V0IGR4PSIxIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0SW5uZXIyIi8 + PGZlQ29tcG9zaXRlIGluPSJzaGFkb3dPZmZzZXRJbm5lcjIiIGluMj0iU291cmNlQWxwaGEiIGsyPSItMSIgazM9IjEiIG9wZXJhdG9yPSJhcml0aG1ldGljIiByZXN1bHQ9InNoYWRvd0lubmVySW5uZXIyIi8 + PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd0lubmVySW5uZXIyIiByZXN1bHQ9InNoYWRvd01hdHJpeElubmVyMiIgdmFsdWVzPSIwIDAgMCAwIDEgICAwIDAgMCAwIDEgICAwIDAgMCAwIDEgIDAgMCAwIDAuMTUgMCIvPjxmZU9mZnNldCBkeD0iMiIgZHk9IjEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjMiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMyIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjMiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjMiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIzIiB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4wOCAwIi8 + PGZlTWVyZ2U + PGZlTWVyZ2VOb2RlIGluPSJzaGFkb3dNYXRyaXhJbm5lcjEiLz48ZmVNZXJnZU5vZGUgaW49InNoYWRvd01hdHJpeElubmVyMiIvPjxmZU1lcmdlTm9kZSBpbj0ic2hhZG93TWF0cml4SW5uZXIzIi8 + PC9mZU1lcmdlPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iTiIgeDE9IjEwNy40NjYlIiB4Mj0iOS4zMDMlIiB5MT0iMTA3LjgzMSUiIHkyPSIzLjIwNyUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiMwMDZEM0QiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDRDMjkiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IGlkPSJPIiB3aWR0aD0iNzEiIGhlaWdodD0iNDIiIHg9IjcxIiB5PSIxMjUiLz48cGF0dGVybiBpZD0iUCIgd2lkdGg9IjUxMiIgaGVpZ2h0PSI1MTIiIHg9Ii00NDEiIHk9Ii0zODciIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjx1c2UgeGxpbms6aHJlZj0iI2giLz48L3BhdHRlcm4 + PGZpbHRlciBpZD0iUSIgd2lkdGg9IjEwMi44JSIgaGVpZ2h0PSIxMDQuOCUiIHg9Ii0xLjQlIiB5PSItMi40JSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94Ij48ZmVPZmZzZXQgZHg9Ii0xIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0SW5uZXIxIi8 + PGZlQ29tcG9zaXRlIGluPSJzaGFkb3dPZmZzZXRJbm5lcjEiIGluMj0iU291cmNlQWxwaGEiIGsyPSItMSIgazM9IjEiIG9wZXJhdG9yPSJhcml0aG1ldGljIiByZXN1bHQ9InNoYWRvd0lubmVySW5uZXIxIi8 + PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd0lubmVySW5uZXIxIiByZXN1bHQ9InNoYWRvd01hdHJpeElubmVyMSIgdmFsdWVzPSIwIDAgMCAwIDEgICAwIDAgMCAwIDEgICAwIDAgMCAwIDEgIDAgMCAwIDAuMDggMCIvPjxmZU9mZnNldCBkeD0iMiIgZHk9IjEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjIiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMiIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjIiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjIiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIyIiB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4wMSAwIi8 + PGZlTWVyZ2U + PGZlTWVyZ2VOb2RlIGluPSJzaGFkb3dNYXRyaXhJbm5lcjEiLz48ZmVNZXJnZU5vZGUgaW49InNoYWRvd01hdHJpeElubmVyMiIvPjwvZmVNZXJnZT48L2ZpbHRlcj48cmVjdCBpZD0iUiIgd2lkdGg9IjE0MiIgaGVpZ2h0PSIxNjYiIHJ4PSI4Ii8 + PGZpbHRlciBpZD0iUyIgd2lkdGg9IjExNyUiIGhlaWdodD0iMTE3JSIgeD0iLTguNSUiIHk9Ii04LjUlIiBmaWx0ZXJVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPjxmZUdhdXNzaWFuQmx1ciBpbj0iU291cmNlR3JhcGhpYyIgc3RkRGV2aWF0aW9uPSIzIi8 + PC9maWx0ZXI + PGxpbmVhckdyYWRpZW50IGlkPSJWIiB4MT0iMTEzLjE3NyUiIHgyPSIyLjE1MSUiIHkxPSIxMDQuNjczJSIgeTI9IjkuNzEzJSI + PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwODAzNCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwNEYyMSIvPjwvbGluZWFyR3JhZGllbnQ + PHJhZGlhbEdyYWRpZW50IGlkPSJXIiBjeD0iODYuNjAxJSIgY3k9Ijg0LjIxJSIgcj0iNjIuMzk4JSIgZng9Ijg2LjYwMSUiIGZ5PSI4NC4yMSUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiMwMTgxMzciLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDdFMzUiIHN0b3Atb3BhY2l0eT0iMCIvPjwvcmFkaWFsR3JhZGllbnQ + PHJlY3QgaWQ9IlUiIHdpZHRoPSI5NiIgaGVpZ2h0PSI5NiIgcng9IjgiLz48cGF0dGVybiBpZD0iWCIgd2lkdGg9IjUxMiIgaGVpZ2h0PSI1MTIiIHg9Ii01MTIiIHk9Ii01MTIiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjx1c2UgeGxpbms6aHJlZj0iI2kiLz48L3BhdHRlcm4 + PHJlY3QgaWQ9ImFhIiB3aWR0aD0iOTYiIGhlaWdodD0iOTgiIHk9Ii0xIiByeD0iOCIvPjxmaWx0ZXIgaWQ9IloiIHdpZHRoPSIxMDMuMSUiIGhlaWdodD0iMTAzLjElIiB4PSItMS42JSIgeT0iLTEuNSUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCI + PGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dCbHVySW5uZXIxIiBzdGREZXZpYXRpb249Ii4yNSIvPjxmZU9mZnNldCBkeD0iLTEiIGluPSJzaGFkb3dCbHVySW5uZXIxIiByZXN1bHQ9InNoYWRvd09mZnNldElubmVyMSIvPjxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93T2Zmc2V0SW5uZXIxIiBpbjI9IlNvdXJjZUFscGhhIiBrMj0iLTEiIGszPSIxIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgcmVzdWx0PSJzaGFkb3dJbm5lcklubmVyMSIvPjxmZUNvbG9yTWF0cml4IGluPSJzaGFkb3dJbm5lcklubmVyMSIgcmVzdWx0PSJzaGFkb3dNYXRyaXhJbm5lcjEiIHZhbHVlcz0iMCAwIDAgMCAwLjAxOTkyNjc3MzMgICAwIDAgMCAwIDAuNjU5NzMxMDggICAwIDAgMCAwIDAuMzEyNDA4NzQyICAwIDAgMCAxIDAiLz48ZmVHYXVzc2lhbkJsdXIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd0JsdXJJbm5lcjIiIHN0ZERldmlhdGlvbj0iLjUiLz48ZmVPZmZzZXQgZHg9IjIiIGluPSJzaGFkb3dCbHVySW5uZXIyIiByZXN1bHQ9InNoYWRvd09mZnNldElubmVyMiIvPjxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93T2Zmc2V0SW5uZXIyIiBpbjI9IlNvdXJjZUFscGhhIiBrMj0iLTEiIGszPSIxIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgcmVzdWx0PSJzaGFkb3dJbm5lcklubmVyMiIvPjxmZUNvbG9yTWF0cml4IGluPSJzaGFkb3dJbm5lcklubmVyMiIgcmVzdWx0PSJzaGFkb3dNYXRyaXhJbm5lcjIiIHZhbHVlcz0iMCAwIDAgMCAwICAgMCAwIDAgMCAwLjQ2NjY2NjY2NyAgIDAgMCAwIDAgMC4yNTA5ODAzOTIgIDAgMCAwIDEgMCIvPjxmZU1lcmdlPjxmZU1lcmdlTm9kZSBpbj0ic2hhZG93TWF0cml4SW5uZXIxIi8 + PGZlTWVyZ2VOb2RlIGluPSJzaGFkb3dNYXRyaXhJbm5lcjIiLz48L2ZlTWVyZ2U + PC9maWx0ZXI + PGxpbmVhckdyYWRpZW50IGlkPSJhZCIgeDE9IjI5LjQ2OCUiIHgyPSI5Ny45NjMlIiB5MT0iNTAlIiB5Mj0iNTAlIj48c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjRjBGMEYwIi8 + PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjRkZGIi8 + PC9saW5lYXJHcmFkaWVudD48cG9seWdvbiBpZD0iYWMiIHBvaW50cz0iMjUgNzMuMTA3IDQxLjc1NiA0Ni45NiAyNi41NzIgMjMgMzguMTQ0IDIzIDQ3Ljk3NyA0MS4wOTkgNTcuNjEgMjMgNjkuMDgyIDIzIDUzLjgzIDQ3LjMzNiA3MC41ODcgNzMuMTA3IDU4LjY0NyA3My4xMDcgNDcuNzc3IDUzLjc3OCAzNi44NzMgNzMuMTA3Ii8 + PGZpbHRlciBpZD0iYWIiIHdpZHRoPSIxNDEuNyUiIGhlaWdodD0iMTM3LjklIiB4PSItMjAuOCUiIHk9Ii0xNyUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCI + PGZlT2Zmc2V0IGR5PSIxIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0T3V0ZXIxIi8 + PGZlR2F1c3NpYW5CbHVyIGluPSJzaGFkb3dPZmZzZXRPdXRlcjEiIHJlc3VsdD0ic2hhZG93Qmx1ck91dGVyMSIgc3RkRGV2aWF0aW9uPSIzIi8 + PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd0JsdXJPdXRlcjEiIHJlc3VsdD0ic2hhZG93TWF0cml4T3V0ZXIxIiB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4xIDAiLz48ZmVPZmZzZXQgZHk9IjEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRPdXRlcjIiLz48ZmVHYXVzc2lhbkJsdXIgaW49InNoYWRvd09mZnNldE91dGVyMiIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIyIiBzdGREZXZpYXRpb249Ii41Ii8 + PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd0JsdXJPdXRlcjIiIHJlc3VsdD0ic2hhZG93TWF0cml4T3V0ZXIyIiB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4xIDAiLz48ZmVNZXJnZT48ZmVNZXJnZU5vZGUgaW49InNoYWRvd01hdHJpeE91dGVyMSIvPjxmZU1lcmdlTm9kZSBpbj0ic2hhZG93TWF0cml4T3V0ZXIyIi8 + PC9mZU1lcmdlPjwvZmlsdGVyPjwvZGVmcz48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ4KSI + PG1hc2sgaWQ9ImsiIGZpbGw9IiNmZmYiPjx1c2UgeGxpbms6aHJlZj0iI2oiLz48L21hc2s + PGcgbWFzaz0idXJsKCNrKSI + PHVzZSBmaWxsPSJ1cmwoI2wpIiB4bGluazpocmVmPSIjbSIvPjx1c2UgZmlsbD0idXJsKCNuKSIgZmlsbC1vcGFjaXR5PSIuMDEyIiB4bGluazpocmVmPSIjbSIvPjx1c2UgZmlsbD0iIzAwMCIgZmlsdGVyPSJ1cmwoI28pIiB4bGluazpocmVmPSIjbSIvPjwvZz48ZyBtYXNrPSJ1cmwoI2spIj48dXNlIGZpbGw9InVybCgjcCkiIHhsaW5rOmhyZWY9IiNxIi8 + PHVzZSBmaWxsPSJ1cmwoI3IpIiBmaWxsLW9wYWNpdHk9Ii4wMTIiIHhsaW5rOmhyZWY9IiNxIi8 + PHVzZSBmaWxsPSIjMDAwIiBmaWx0ZXI9InVybCgjcykiIHhsaW5rOmhyZWY9IiNxIi8 + PC9nPjxnIG1hc2s9InVybCgjaykiPjx1c2UgZmlsbD0idXJsKCN0KSIgeGxpbms6aHJlZj0iI3UiLz48dXNlIGZpbGw9InVybCgjdikiIGZpbGwtb3BhY2l0eT0iLjAxMiIgeGxpbms6aHJlZj0iI3UiLz48dXNlIGZpbGw9IiMwMDAiIGZpbHRlcj0idXJsKCN3KSIgeGxpbms6aHJlZj0iI3UiLz48L2c + PGcgbWFzaz0idXJsKCNrKSI + PHVzZSBmaWxsPSJ1cmwoI3gpIiB4bGluazpocmVmPSIjeSIvPjx1c2UgZmlsbD0idXJsKCN6KSIgZmlsbC1vcGFjaXR5PSIuMDEyIiB4bGluazpocmVmPSIjeSIvPjx1c2UgZmlsbD0iIzAwMCIgZmlsdGVyPSJ1cmwoI0EpIiB4bGluazpocmVmPSIjeSIvPjwvZz48ZyBtYXNrPSJ1cmwoI2spIj48dXNlIGZpbGw9InVybCgjQikiIHhsaW5rOmhyZWY9IiNDIi8 + PHVzZSBmaWxsPSJ1cmwoI0QpIiBmaWxsLW9wYWNpdHk9Ii4wMTIiIHhsaW5rOmhyZWY9IiNDIi8 + PHVzZSBmaWxsPSIjMDAwIiBmaWx0ZXI9InVybCgjRSkiIHhsaW5rOmhyZWY9IiNDIi8 + PC9nPjxnIG1hc2s9InVybCgjaykiPjx1c2UgZmlsbD0idXJsKCNGKSIgeGxpbms6aHJlZj0iI0ciLz48dXNlIGZpbGw9InVybCgjSCkiIGZpbGwtb3BhY2l0eT0iLjAxMiIgeGxpbms6aHJlZj0iI0ciLz48dXNlIGZpbGw9IiMwMDAiIGZpbHRlcj0idXJsKCNJKSIgeGxpbms6aHJlZj0iI0ciLz48L2c + PGcgbWFzaz0idXJsKCNrKSI + PHVzZSBmaWxsPSJ1cmwoI0opIiB4bGluazpocmVmPSIjSyIvPjx1c2UgZmlsbD0idXJsKCNMKSIgZmlsbC1vcGFjaXR5PSIuMDEyIiB4bGluazpocmVmPSIjSyIvPjx1c2UgZmlsbD0iIzAwMCIgZmlsdGVyPSJ1cmwoI00pIiB4bGluazpocmVmPSIjSyIvPjwvZz48ZyBtYXNrPSJ1cmwoI2spIj48dXNlIGZpbGw9InVybCgjTikiIHhsaW5rOmhyZWY9IiNPIi8 + PHVzZSBmaWxsPSJ1cmwoI1ApIiBmaWxsLW9wYWNpdHk9Ii4wMTIiIHhsaW5rOmhyZWY9IiNPIi8 + PHVzZSBmaWxsPSIjMDAwIiBmaWx0ZXI9InVybCgjUSkiIHhsaW5rOmhyZWY9IiNPIi8 + PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0OCkiPjxtYXNrIGlkPSJUIiBmaWxsPSIjZmZmIj48dXNlIHhsaW5rOmhyZWY9IiNSIi8 + PC9tYXNrPjxwYXRoIGZpbGw9IiMwMDAiIGZpbGwtb3BhY2l0eT0iLjEiIGQ9Ik0tNDAsMzcgTDQwLDM3IEM0NC40MTgyNzgsMzcgNDgsNDAuNTgxNzIyIDQ4LDQ1IEw0OCwxMjUgQzQ4LDEyOS40MTgyNzggMzQuNDE4Mjc4LDE0MyAzMCwxNDMgTC01MCwxNDMgQy01NC40MTgyNzgsMTQzIC01OCwxMzkuNDE4Mjc4IC01OCwxMzUgTC01OCw1NSBDLTU4LDUwLjU4MTcyMiAtNDQuNDE4Mjc4LDM3IC00MCwzNyBaIiBmaWx0ZXI9InVybCgjUykiIG1hc2s9InVybCgjVCkiLz48L2c + PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzNSkiPjxtYXNrIGlkPSJZIiBmaWxsPSIjZmZmIj48dXNlIHhsaW5rOmhyZWY9IiNVIi8 + PC9tYXNrPjx1c2UgZmlsbD0idXJsKCNWKSIgeGxpbms6aHJlZj0iI1UiLz48dXNlIGZpbGw9InVybCgjVykiIHhsaW5rOmhyZWY9IiNVIi8 + PHVzZSBmaWxsPSJ1cmwoI1gpIiBmaWxsLW9wYWNpdHk9Ii4wMTMiIHhsaW5rOmhyZWY9IiNVIi8 + PGcgZmlsbD0iIzAwMCIgbWFzaz0idXJsKCNZKSI + PHVzZSBmaWx0ZXI9InVybCgjWikiIHhsaW5rOmhyZWY9IiNhYSIvPjwvZz48ZyBtYXNrPSJ1cmwoI1kpIj48dXNlIGZpbGw9IiMwMDAiIGZpbHRlcj0idXJsKCNhYikiIHhsaW5rOmhyZWY9IiNhYyIvPjx1c2UgZmlsbD0idXJsKCNhZCkiIHhsaW5rOmhyZWY9IiNhYyIvPjwvZz48L2c + PC9nPjwvc3ZnPg =="
);
const searchContactables = (query, callback) => {
Excel.run(function(context) {
const worksheet = context.workbook.worksheets.getItem("Sheet1");
const range = worksheet.getRange("A3:E999");
range.load("values");
return context.sync().then(function() {
const excelData = JSON.stringify(range.values, null, 4);
const contactsData = translateContacts(excelData);
const filteredContacts = filterContacts(query.replace(/[^A-Za-z0-9_]/g, ""), contactsData);
callback(filteredContacts);
});
}).catch(errorHandlerFunction);
};
dialer.setOnSearchContactables(searchContactables);
dialer.setOnDialerEvent((event) => {
//search for contact
Excel.run(function(context) {
var worksheet = context.workbook.worksheets.getItem("Sheet1");
var range = worksheet.getRange("A3:E999");
range.load("values");
return context.sync().then(function() {
const excelData = JSON.stringify(range.values, null, 4);
const contactsData = translateContacts(excelData);
const query = "" + event.data.phoneNumber;
const filteredContacts = filterContacts(query.replace(/[^A-Za-z0-9_]/g, ""), contactsData);
const interactionContact = filteredContacts[0];
switch (event.type) {
case "CALL_START": {
if (filteredContacts.length > 0) {
dialer.setInteractionContact(event.data.id, {
provider: interactionContact.provider,
id: "" + interactionContact.id,
label: interactionContact.label,
type: interactionContact.type
});
}
break;
}
case "CALL_END": {
//console.log(event.data.contact); // <- carries the assigned contact object
break;
}
case "OPEN_CONTACT": {
//console.log("open contact event" + JSON.stringify(event));
const rowNumber = event.data.id + 3;
const rowString = "A" + rowNumber + ":D" + rowNumber;
const row = worksheet.getRange(rowString);
row.select();
break;
}
default: {
//console.log("Unhandled event", event);
}
}
});
}).catch(errorHandlerFunction);
});
}
);
Excel.run(function(context) {
//start with selection at upper left
var worksheet = context.workbook.worksheets.getItem("Sheet1");
var initSelection = worksheet.getRange("A1");
initSelection.select();
//format dial buttons
var range = worksheet.getRange("E:E");
const conditionalFormat = range.conditionalFormats.add(Excel.ConditionalFormatType.containsText);
conditionalFormat.textComparison.format.font.color = "white";
conditionalFormat.textComparison.format.fill.color = "purple";
conditionalFormat.textComparison.rule = {
operator: Excel.ConditionalTextOperator.contains,
text: "Dial"
};
//add handler for selection change
worksheet.onSelectionChanged.add(handleSelectionChanged);
return context.sync().then(function() {
//console.log("Event handler successfully registered for onSelectionChangedevent in the worksheet.");
});
}).catch(errorHandlerFunction);
language: typescript
template:
content: >-
<center><button onclick="populateSampleData()">Populate Sample
Data</button></center>
<div class='vonage-dialer-container'></div>
<script data-provider='uc' data-autoload="false"
src='https://apps.gunify.vonage.com/cti/common/vonage.dialer.sdk.js'>
</script>
<script
src="https://unpkg.com/libphonenumber-js@1.9.6/bundle/libphonenumber-max.js">
</script>
language: html
style:
content: |-
section.samples {
margin-top: 20px;
}
section.samples .ms-Button, section.setup .ms-Button {
display: block;
margin-bottom: 5px;
margin-left: 20px;
min-width: 80px;
}
language: css
libraries: |-
https://appsforoffice.microsoft.com/lib/1/hosted/office.js
@types/office-js
office-ui-fabric-js@1.4.0/dist/css/fabric.min.css
office-ui-fabric-js@1.4.0/dist/css/fabric.components.min.css
core-js@2.4.1/client/core.min.js
@types/core-js
jquery@3.1.1
@types/jquery@3.3.1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment