Skip to content

Commit

Permalink
core: base64 support for binary formats, uninitialized data and #764
Browse files Browse the repository at this point in the history
…fix (#766)
  • Loading branch information
even1024 authored Jun 20, 2022
1 parent cdc0ef5 commit 3688c58
Show file tree
Hide file tree
Showing 18 changed files with 192 additions and 64 deletions.
2 changes: 2 additions & 0 deletions api/tests/integration/ref/formats/smarts.py.out
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ CC[C+5]CCCCC
**** Load and Save as Molecule ****
[#6]-[#6]-[#6;+5]-[#6]-[#6]-[#6]-[#6]-[#6]
CC[C+5]CCCCC
**** Load and Save as Query with not list ****
[#6]-[#6]-[!#5!#6!#7]-[#6]-[#6]-[#6]-[#6]-[#6]-[#6]
35 changes: 35 additions & 0 deletions api/tests/integration/tests/formats/smarts.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,45 @@ def testSmarts(m):
M END
"""

notlist = """
-INDIGO-06202202172D
0 0 0 0 0 0 0 0 0 0 0 V3000
M V30 BEGIN CTAB
M V30 COUNTS 9 8 0 0 0
M V30 BEGIN ATOM
M V30 1 C 4.9359 -3.675 0.0 0
M V30 2 C 5.80192 -3.175 0.0 0
M V30 3 NOT[B,C,N] 6.66795 -3.675 0.0 0
M V30 4 C 7.53397 -3.175 0.0 0
M V30 5 C 8.4 -3.675 0.0 0
M V30 6 C 9.26603 -3.175 0.0 0
M V30 7 C 10.1321 -3.675 0.0 0
M V30 8 C 10.9981 -3.175 0.0 0
M V30 9 C 11.8641 -3.675 0.0 0
M V30 END ATOM
M V30 BEGIN BOND
M V30 1 1 1 2
M V30 2 1 2 3
M V30 3 1 3 4
M V30 4 1 4 5
M V30 5 1 5 6
M V30 6 1 6 7
M V30 7 1 7 8
M V30 8 1 8 9
M V30 END BOND
M V30 END CTAB
M END
"""

print("**** Load and Save as Query ****")
m = indigo.loadQueryMolecule(molstr)
testSmarts(m)

print("**** Load and Save as Molecule ****")
m = indigo.loadMolecule(molstr)
testSmarts(m)

print("**** Load and Save as Query with not list ****")
m = indigo.loadQueryMolecule(notlist)
print(m.smarts())
2 changes: 2 additions & 0 deletions api/wasm/indigo-ketcher/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ add_custom_target(${PROJECT_NAME}

add_custom_target(${PROJECT_NAME}-test
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/test.js ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/test64.cdx ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/test64.ket ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/
COMMAND node test
WORKING_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
DEPENDS ${PROJECT_NAME}
Expand Down
37 changes: 19 additions & 18 deletions api/wasm/indigo-ketcher/indigo-ketcher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,49 +238,50 @@ namespace indigo
IndigoRendererSession& operator=(IndigoRendererSession&&) = delete;
};

IndigoKetcherObject loadMoleculeOrReaction(cstring data)
IndigoKetcherObject loadMoleculeOrReaction(const std::string& data)
{
print_js("loadMoleculeOrReaction:");
print_js(data);
std::vector<std::string> exceptionMessages;
exceptionMessages.reserve(4);

int objectId = -1;
if (std::string(data).find("InChI") == 0)
if (data.find("InChI") == 0)
{
objectId = indigoInchiLoadMolecule(data);
objectId = indigoInchiLoadMolecule(data.c_str());
if (objectId >= 0)
return IndigoKetcherObject(objectId, IndigoKetcherObject::EKETMolecule);
}

objectId = indigoLoadReactionFromString(data);
// Let's try a simple molecule
print_js("try as molecule");
objectId = indigoLoadMoleculeFromBuffer(data.c_str(), data.size());
if (objectId >= 0)
{
print_js("try as reaction");
return IndigoKetcherObject(objectId, IndigoKetcherObject::EKETReaction);
return IndigoKetcherObject(objectId, IndigoKetcherObject::EKETMolecule);
}
exceptionMessages.emplace_back(indigoGetLastError());
// Let's try query reaction
objectId = indigoLoadQueryReactionFromString(data);

// Let's try reaction
print_js("try as reaction");
objectId = indigoLoadReactionFromBuffer(data.c_str(), data.size());
if (objectId >= 0)
{
print_js("try as query reaction");
return IndigoKetcherObject(objectId, IndigoKetcherObject::EKETReactionQuery);
return IndigoKetcherObject(objectId, IndigoKetcherObject::EKETReaction);
}
exceptionMessages.emplace_back(indigoGetLastError());
// Let's try a simple molecule
objectId = indigoLoadMoleculeFromString(data);
// Let's try query reaction
print_js("try as query reaction");
objectId = indigoLoadQueryReactionFromBuffer(data.c_str(), data.size());
if (objectId >= 0)
{
print_js("try as molecule");
return IndigoKetcherObject(objectId, IndigoKetcherObject::EKETMolecule);
return IndigoKetcherObject(objectId, IndigoKetcherObject::EKETReactionQuery);
}
exceptionMessages.emplace_back(indigoGetLastError());
// Let's try query molecule
objectId = indigoLoadQueryMoleculeFromString(data);
print_js("try as query molecule");
objectId = indigoLoadQueryMoleculeFromBuffer(data.c_str(), data.size());
if (objectId >= 0)
{
print_js("try as query molecule");
return IndigoKetcherObject(objectId, IndigoKetcherObject::EKETMoleculeQuery);
}
exceptionMessages.emplace_back(indigoGetLastError());
Expand All @@ -306,7 +307,7 @@ namespace indigo
{
const IndigoSession session;
indigoSetOptions(options);
IndigoKetcherObject iko = loadMoleculeOrReaction(data.c_str());
IndigoKetcherObject iko = loadMoleculeOrReaction(data);
return iko.toString(options, outputFormat.size() ? outputFormat : "ket");
}

Expand Down
11 changes: 11 additions & 0 deletions api/wasm/indigo-ketcher/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,17 @@ M END
assert.equal(inchi_aux, "InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H\nAuxInfo=1/0/N:1,2,6,3,5,4/E:(1,2,3,4,5,6)/rA:6CCCCCC/rB:d1;s2;d3;s4;s1d5;/rC:;;;;;;");
options.delete();
});

test("convert", "cdx_to_ket", () => {
let options = new indigo.MapStringString();
var fs = require('fs');
const cdx_data = fs.readFileSync("test64.cdx");
const ket = indigo.convert(cdx_data, "ket", options);
const ket_data = indigo.convert(fs.readFileSync("test64.ket"),"ket", options);
assert.equal(ket, ket_data);
options.delete();
});

}

// Dearomatize
Expand Down
1 change: 1 addition & 0 deletions api/wasm/indigo-ketcher/test64.cdx
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
base64::VmpDRDAxMDAEAwIBAAAAAAAAAAAAAACAAAAAAAMAFgAAAENoZW1EcmF3IDEzLjAuMi4zMDIxCAAKAAAAdGVzdC5jZHgEAhAAZ58aAWamkQCEK2ACDqXSAQEJCAAAgBYAAAAGAAIJCAAAwHYCAMAiAg0IAQABCAcBAAE6BAEAATsEAQAARQQBAAE8BAEAAEoEAQAADAYBAAEPBgEAAQ0GAQAAQgQBAABDBAEAAEQEAQAADggCANAHCggIAAMAYADIAAMACwgIAAQAAADwAAMACQgEADOzAgAICAQAAAACAAcIBAAAAAEABggEAAAABAAFCAQAAAAeAAQIAgB4AAMIBAAAAHgAIwgBAAUMCAEAACgIAQABKQgBAAEqCAEAASsIAQAoLAgBAAotCAEAAS4IAQAAAggQAAAAJAAAACQAAAAkAAAAJAABAwIAAAACAwIAAQAAA1YADgD///////8AAAAAAAD//wAAAAD/////AAAAAP//AAAAAP////8AAAAA/////wAA///Z2bOz/////8vLs7OAgP////+AgP//gID//4CAv7/o6OfnlZUAASQAAAACAAMA5AQFAEFyaWFsBADkBA8AVGltZXMgTmV3IFJvbWFuAAh4AAADAAACWAJYAAAAABkNE1f/qf+yGXETngNnBSgD/AACAAACWAJYAAAAABkNE1cAAQBkAGQAAAABAAEBAQAAAAEnDwABAAEAAAAAAAAAAAAAAAAAAgAZAZAAAAAAAGAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAALQLAgAAALULFAAAAENoZW1pY2FsIEZvcm11bGE6ILYLDgAAAEV4YWN0IE1hc3M6ILcLFAAAAE1vbGVjdWxhciBXZWlnaHQ6ILgLBwAAAG0vejoguQsWAAAARWxlbWVudGFsIEFuYWx5c2lzOiC6CxEAAABCb2lsaW5nIFBvaW50OiC7CxEAAABNZWx0aW5nIFBvaW50OiC8CxEAAABDcml0aWNhbCBUZW1wOiC9CxEAAABDcml0aWNhbCBQcmVzOiC+CxAAAABDcml0aWNhbCBWb2w6IL8LEAAAAEdpYmJzIEVuZXJneTogwAsJAAAATG9nIFA6IMELBgAAAE1SOiDCCw8AAABIZW5yeSdzIExhdzogwwsQAAAASGVhdCBvZiBGb3JtOiDECwgAAAB0UFNBOiDFCwkAAABDTG9nUDogxgsHAAAAQ01SOiDHCwgAAABMb2dTOiDICwcAAABwS2E6IAGAaRcAAAQCEAAAAAAAAAAAAAAAoAUAADgEEggEAAAAOAQTCAQAAACgBRYIBAAAACQAGAgEAAAAJAAUCAQAAAAAABkIAAAQCAIAAgAPCAIAAgARCAEAAQOAwRYAAAQCEABnnxoBZqaRAIQrYAIOpdIBCgACAMACBgUBAAUEgMIWAAAAAggAMzPeAXoU+gAKAAIAxQI7BAEAATcEAQABAAAEgMMWAAAAAggAMzPPAVwPFAEKAAIAxgI7BAEAATcEAQABAAAEgMQWAAAAAggAMzOxAVwPFAEKAAIAxwI7BAEAATcEAQABAAAEgMUWAAAAAggAMzPPAZkZ4AAKAAIAyAI7BAEAAQIEAgAIACsEAgAAAEgEAAA3BAEAAQaAAAAAAAACCACZGdMBMjPcAAQCEABEpMoBMjPcADMz0wH//+MAIwgBAAACBwIAAAAABw0AAQAAAAMAYADIAAMATwAAAAAEgMYWAAAAAggAMzOiAXoU+gAKAAIAyQI7BAEAAQIEAgAHACsEAgABAEgEAAA3BAEAAQaAAAAAAAACCACZGaYBE679AAQCEAAhwp0BkzzvAJkZpgETrv0AIwgBAP8BBwEA/wIHAgAAAAUHAQADAAcOAAEAAAADAGAAyAADAE5IAAAAAASAxxYAAAACCAAzMwsCXA8UAQoAAgDPAjsEAQABMAQBAAc3BAEAAjEEEAAGFwAABxcAAAAAAAAFFwAAEYAAAAAAAA0CAAAACAAGAHN0ZXJlbwaAAAAAAAACCACIaAYCrdMOAQQCEADMDAACrdMOAVX1BwI9PhkBBwcCAAAAAgcCAAAAAAcPAAEAAAADAAIAlgAAAChSKQAAAAAAAASAyBYAAAACCAAzM/wBPQouAQoAAgDQAjsEAQABNwQBAAEAAASAyRYAAAACCAAzM/wBehT6AAoAAgDRAjsEAQABAgQCAAcAKwQCAAEASAQAADcEAQABBoAAAAAAAAIIAJkZAAITrv0ABAIQACHC9wGTPO8AmRkAAhOu/QAjCAEA/wEHAQD/AgcCAAAABQcBAAMABw4AAQAAAAMAYADIAAMATkgAAAAABIDKFgAAAAIIADMzCwIeBUgBCgACANICOwQBAAECBAIACAArBAIAAABIBAAANwQBAAEGgAAAAAAAAggAmRkPArceRAEEAhAARKQGArceRAEzMw8ChOtLASMIAQAAAgcCAAAAAAcNAAEAAAADAGAAyAADAE8AAAAABIDLFgAAAAIIAFF4DwJmZtUACgACAOECOwQBAAE3BAEAAQAABIDMFgAAAAIIAOE6CQJcD7gACgACAOICOwQBAAE3BAEAAQAABIDNFgAAAAIIAB6FHwLh+qMACgACAOMCOwQBAAE3BAEAAQAABIDOFgAAAAIIAMwMPAIAQK0ACgACAOQCOwQBAAE3BAEAAQAABIDPFgAAAAIIAAAALAKFq94ACgACAOUCOwQBAAE3BAEAAQAABIDQFgAAAAIIAD1KQgKZmcoACgACAOYCOwQBAAE3BAEAAQAABIDRFgAAAAIIAB5FXAKZmdkACgACAOcCOwQBAAECBAIABwArBAIAAQBIBAAANwQBAAEGgAAAAAAAAggAhCtgAjIz3QAEAhAADNRXArLBzgCEK2ACMjPdACMIAQD/AQcBAP8CBwIAAAAFBwEAAwAHDgABAAAAAwBgAMgAAwBOSAAAAAAEgNIWAAAAAggAPQpWAqPw9gAKAAIA6AI7BAEAATcEAQABAAAEgNMWAAAAAggAMzM4AnoU+gAKAAIA6QI7BAEAATcEAQABAAAEgNQWAAAAAggAMzMpAlwPFAEKAAIA6gI7BAEAATcEAQABAAAEgNUWAAAAAggAMzPPAR4FSAEKAAIA7AI7BAEAATAEAQAHNwQBAAMxBBAAFRcAABYXAAAUFwAAAAAAABGAAAAAAAANAgAAAAgABgBzdGVyZW8GgAAAAAAAAggAJCLOAXxxOwEEAhAAaMbHAXxxOwHxrs8BHHJFAQcHAgAAAAIHAgAAAAAHDwABAAAAAwACAJYAAAAoUykAAAAAAAAEgNYWAAAAAggAMzOxAR4FSAEKAAIA7QI7BAEAATcEAQABAAAEgNcWAAAAAggAMzPeAT0KLgEKAAIA7gI7BAEAAQIEAgAHACsEAgABAEgEAAA3BAEAAQaAAAAAAAACCACZGeIB1qMxAQQCEAAhwtkBVjIjAZkZ4gHWozEBIwgBAP8BBwEA/wIHAgAAAAUHAQADAAcOAAEAAAADAGAAyAADAE5IAAAAAASA2BYAAAACCAAzM6IBAABiAQoAAgDvAjsEAQABAgQCAAgAKwQCAAAASAQAADcEAQABBoAAAAAAAAIIAJkZpgGZGV4BBAIQAESknQGZGV4BMzOmAWbmZQEjCAEAAAIHAgAAAAAHDQABAAAAAwBgAMgAAwBPAAAAAASA2RYAAAACCAAU7vcB9aigAQoAAgD+AjsEAQABNwQBAAEAAASA2hYAAAACCACFK/4BAAC+AQoAAgD/AjsEAQABNwQBAAEAAASA2xYAAAACCABH4ecBehTSAQoAAgAAAzsEAQABNwQBAAEAAASA3BYAAAACCACZWcsBXM/IAQoAAgABAzsEAQABNwQBAAEAAASA3RYAAAACCABmZtsB12OXAQoAAgACAzsEAQABNwQBAAEAAASA3hYAAAACCAAoHMUBwnWrAQoAAgADAzsEAQABNwQBAAEAAASA3xYAAAACCABHIasBwnWcAQoAAgAEAzsEAQABAgQCAAcAKwQCAAEASAQAADcEAQABBoAAAAAAAAIIAK0HrwEo3JgBBAIQADWwpgEo3JgBrQevAahNpwEjCAEAAAIHAgAAAAUHAQABAAcOAAEAAAADAGAAyAADAE5IAAAAAASA4BYAAAACCAAoXLEBuB5/AQoAAgAFAzsEAQABNwQBAAEAAASA4RYAAAACCAAzM88B4fp7AQoAAgAGAzsEAQABNwQBAAEAAASA4hYAAAACCAAzM94BAABiAQoAAgAHAzsEAQABNwQBAAEAAASA4xYAAAACCAAzM4QBehT6AAoAAgAIAzsEAQABNwQBAAEAAASA5BYAAAACCAAzM1cBXA8UAQoAAgAJAzsEAQABAgQCAAcAKwQCAAEASAQAADcEAQABBoAAAAAAAAIIAJkZWwHCdRABBAIQACHCUgHCdRABmRlbAULnHgEjCAEAAAIHAgAAAAUHAQABAAcOAAEAAAADAGAAyAAAAE5IAAAAAASA5RYAAAACCAAzM3UBXA8UAQoAAgAKAzsEAQABMAQBAAc3BAEAAzEEEAAaFwAAGRcAABsXAAAAAAAAEYAAAAAAAA0CAAAACAAGAHN0ZXJlbwaAAAAAAAACCADuTn8BpQgPAQQCEAAz83gBpQgPAbvbgAFFCRkBBwcCAAAAAgcCAAAAAAcPAAEAAAADAAIAlgAAAChTKQAAAAAAAASA5hYAAAACCAAzM4QBPQouAQoAAgALAzsEAQABMAQBAAc3BAEAAjEEEAAbFwAAHBcAAB0XAAAAAAAAEYAAAAAAAA0CAAAACAAGAHN0ZXJlbwaAAAAAAAACCABSlYoB9wYhAQQCEACWOYQB9wYhAR8ijAGHcSsBBwcCAAAAAgcCAAAAAAcPAAEAAAADAAIAlgAAAChSKQAAAAAAAASA5xYAAAACCAAzM3UBHgVIAQoAAgAMAzsEAQABNwQBAAEAAASA6BYAAAACCAAzM6IBPQouAQoAAgANAzsEAQABAgQCAAgAKwQCAAAASAQAADcEAQABBoAAAAAAAAIIAJkZpgHWIyoBBAIQAESknQHWIyoBMzOmAaPwMQEjCAEAAAIHAgAAAAUHAQADAAcNAAEAAAADAGAAyAAAAE8AAAAABIDpFgAAAAIIADMzdQGZGeAACgACAA4DOwQBAAECBAIACAArBAIAAABIBAAANwQBAAEGgAAAAAAAAggAmRl5ATIz3AAEAhAARKRwATIz3AAzM3kB///jACMIAQAAAgcCAAAAAAcNAAEAAAADAGAAyAAAAE8AAAAABIDqFgAAAAIIADMzSAF6FPoACgACAA8DOwQBAAE3BAEAAQAABIDrFgAAAAIIADMzKgF6FPoACgACABADOwQBAAECBAIACAArBAIAAABIBAAANwQBAAEGgAAAAAAAAggAmRkuARMu9gAEAhAARKQlARMu9gAzMy4B4Pr9ACMIAQAAAgcCAAAAAAcNAAEAAAADAGAAyAAAAE8AAAAABIDsFgAAAAIIADMzVwGZGeAACgACABEDOwQBAAE3BAEAAQAABIDtFgAAAAIIADMzSAG4HsYACgACABIDOwQBAAE3BAEAAQAABIDuFgAAAAIIADMzKgG4HsYACgACABMDOwQBAAE3BAEAAQAABIDvFgAAAAIIADMzGwHXI6wACgACABQDOwQBAAE3BAEAAQAABIDwFgAAAAIIADMzKgFmJpIACgACABUDOwQBAAE3BAEAAQAABIDxFgAAAAIIADMzSAFmJpIACgACABYDOwQBAAE3BAEAAQAABIDyFgAAAAIIADMzVwHXI6wACgACABcDOwQBAAE3BAEAAQAABYDzFgAACgACAMECDQYBAAEEBgQAwhYAAAUGBADJFgAAEAYCAAMACgYBAAEAAAWA9BYAAAoAAgDCAg0GAQABBAYEAMgWAAAFBgQA1xYAABAGAgADAAoGAQABAAAFgPUWAAAKAAIAwwINBgEAAQQGBADWFgAABQYEAOgWAAAQBgIAAwAKBgEAAQAABYD2FgAACgACAMQCDQYBAAEEBgQA4xYAAAUGBADGFgAAEAYCAAQACgYBAAEAAAWA9xYAAAoAAgDKAg0GAQABBAYEAMIWAAAFBgQAwxYAAAoGAQABAAAFgPgWAAAKAAIAywINBgEAAQQGBADDFgAABQYEAMQWAAAKBgEAAQAABYD5FgAACgACAMwCDQYBAAEEBgQAwhYAAAUGBADFFgAAAAYCAAIACgYBAAEAAAWA+hYAAAoAAgDNAg0GAQABBAYEAMQWAAAFBgQAxhYAAAoGAQABAAAFgPsWAAAKAAIAzgINBgEAAQQGBADPFgAABQYEAMsWAAAKBgEAAQAABYD8FgAACgACANMCDQYBAAEEBgQAzBYAAAUGBADLFgAAAAYCAAIAAwYCAAIACgYBAAELBhAAAAAAAP0WAAD7FgAAAAAAAAAABYD9FgAACgACANQCDQYBAAEEBgQAzRYAAAUGBADMFgAACgYBAAEAAAWA/hYAAAoAAgDVAg0GAQABBAYEAM4WAAAFBgQAzRYAAAAGAgACAAMGAgACAAoGAQABCwYQAAAAAAD/FgAA/RYAAAAAAAAAAAWA/xYAAAoAAgDWAg0GAQABBAYEANAWAAAFBgQAzhYAAAoGAQABAAAFgAAXAAAKAAIA1wINBgEAAQQGBADTFgAABQYEAM8WAAAKBgEAAQAABYABFwAACgACANgCDQYBAAEEBgQA0BYAAAUGBADPFgAAAAYCAAIAAwYCAAEACgYBAAELBhAA/xYAAAIXAAAAFwAA+xYAAAAABYACFwAACgACANkCDQYBAAEEBgQA0RYAAAUGBADQFgAACgYBAAEAAAWAAxcAAAoAAgDaAg0GAQABBAYEANIWAAAFBgQA0RYAAAoGAQABAAAFgAQXAAAKAAIA2wINBgEAAQQGBADTFgAABQYEANIWAAAABgIAAgADBgIAAgAKBgEAAwsGEAAJFwAAABcAAAMXAAAAAAAAEYAAAAAAAA0CAAAACAAGAHN0ZXJlbwaAAAAAAAACCABOlEoCBTT8AAQCEACSOEQCBTT8ABshTAKfzQUBBwcCAAAAAgcCAAAAAAcPAAEAAAADAAIAlgAAAChaKQAAAAAAAAWABRcAAAoAAgDcAg0GAQABBAYEANQWAAAFBgQAxxYAAAEGAgAHAAoGAQABAAAFgAYXAAAKAAIA3QINBgEAAQQGBADHFgAABQYEAMgWAAAKBgEAAQAABYAHFwAACgACAN4CDQYBAAEEBgQAxxYAAAUGBADJFgAACgYBAAEAAAWACBcAAAoAAgDfAg0GAQABBAYEAMgWAAAFBgQAyhYAAAAGAgACAAoGAQABAAAFgAkXAAAKAAIA4AINBgEAAQQGBADUFgAABQYEANMWAAAKBgEAAQAABYAKFwAACgACAOsCDQYBAAEEBgQA3RYAAAUGBADZFgAACgYBAAEAAAWACxcAAAoAAgDwAg0GAQABBAYEANoWAAAFBgQA2RYAAAAGAgACAAMGAgACAAoGAQABCwYQAAAAAAAMFwAAChcAAAAAAAAAAAWADBcAAAoAAgDxAg0GAQABBAYEANsWAAAFBgQA2hYAAAoGAQABAAAFgA0XAAAKAAIA8gINBgEAAQQGBADcFgAABQYEANsWAAAABgIAAgADBgIAAgAKBgEAAQsGEAAAAAAADhcAAAwXAAAAAAAAAAAFgA4XAAAKAAIA8wINBgEAAQQGBADeFgAABQYEANwWAAAKBgEAAQAABYAPFwAACgACAPQCDQYBAAEEBgQA4RYAAAUGBADdFgAACgYBAAEAAAWAEBcAAAoAAgD1Ag0GAQABBAYEAN4WAAAFBgQA3RYAAAAGAgACAAMGAgABAAoGAQABCwYQAA4XAAARFwAADxcAAAoXAAAAAAWAERcAAAoAAgD2Ag0GAQABBAYEAN8WAAAFBgQA3hYAAAoGAQABAAAFgBIXAAAKAAIA9wINBgEAAQQGBADgFgAABQYEAN8WAAAKBgEAAQAABYATFwAACgACAPgCDQYBAAEEBgQA4RYAAAUGBADgFgAAAAYCAAIAAwYCAAIACgYBAAMLBhAAGBcAAA8XAAASFwAAAAAAABGAAAAAAAANAgAAAAgABgBzdGVyZW8GgAAAAAAAAggA9S/CAbtBcAEEAhAAOdS7AbtBcAHBvMMBVdt5AQcHAgAAAAIHAgAAAAAHDwABAAAAAwACAJYAAAAoWikAAAAAAAAFgBQXAAAKAAIA+QINBgEAAQQGBADiFgAABQYEANUWAAABBgIABAAKBgEAAQAABYAVFwAACgACAPoCDQYBAAEEBgQA1RYAAAUGBADWFgAACgYBAAEAAAWAFhcAAAoAAgD7Ag0GAQABBAYEANUWAAAFBgQA1xYAAAoGAQABAAAFgBcXAAAKAAIA/AINBgEAAQQGBADWFgAABQYEANgWAAAABgIAAgAKBgEAAQAABYAYFwAACgACAP0CDQYBAAEEBgQA4hYAAAUGBADhFgAACgYBAAEAAAWAGRcAAAoAAgAYAw0GAQABBAYEAOUWAAAFBgQA5BYAAAEGAgAGAAoGAQABAAAFgBoXAAAKAAIAGQMNBgEAAQQGBADjFgAABQYEAOUWAAAKBgEAAQAABYAbFwAACgACABoDDQYBAAEEBgQA5RYAAAUGBADmFgAACgYBAAEAAAWAHBcAAAoAAgAbAw0GAQABBAYEAOYWAAAFBgQA5xYAAAEGAgAGAAoGAQABAAAFgB0XAAAKAAIAHAMNBgEAAQQGBADmFgAABQYEAOgWAAAKBgEAAQAABYAeFwAACgACAB0DDQYBAAEEBgQA4xYAAAUGBADpFgAAAAYCAAIACgYBAAEAAAWAHxcAAAoAAgAeAw0GAQABBAYEAOoWAAAFBgQA6xYAAAAGAgACAAoGAQABAAAFgCAXAAAKAAIAHwMNBgEAAQQGBADqFgAABQYEAOwWAAAKBgEAAQAABYAhFwAACgACACADDQYBAAEEBgQA7RYAAAUGBADuFgAACgYBAAEAAAWAIhcAAAoAAgAhAw0GAQABBAYEAO4WAAAFBgQA7xYAAAAGAgACAAMGAgABAAoGAQABCwYQACEXAAAAAAAAAAAAACMXAAAAAAWAIxcAAAoAAgAiAw0GAQABBAYEAO8WAAAFBgQA8BYAAAoGAQABAAAFgCQXAAAKAAIAIwMNBgEAAQQGBADwFgAABQYEAPEWAAAABgIAAgADBgIAAQAKBgEAAQsGEAAjFwAAAAAAAAAAAAAlFwAAAAAFgCUXAAAKAAIAJAMNBgEAAQQGBADxFgAABQYEAPIWAAAKBgEAAQAABYAmFwAACgACACUDDQYBAAEEBgQA7RYAAAUGBADyFgAAAAYCAAIAAwYCAAIACgYBAAELBhAAJxcAACEXAAAlFwAAAAAAAAAABYAnFwAACgACACYDDQYBAAEEBgQA7BYAAAUGBADtFgAACgYBAAEAAAWAKBcAAAoAAgAnAw0GAQABBAYEAOQWAAAFBgQA6hYAAAoGAQABAAAAAAAAAAAAAA==
Loading

0 comments on commit 3688c58

Please sign in to comment.