{"id":419,"date":"2007-05-01T19:59:07","date_gmt":"2007-05-01T19:59:07","guid":{"rendered":"http:\/\/neosmart.net\/blog\/2007\/smartassembly\/"},"modified":"2013-08-26T18:16:07","modified_gmt":"2013-08-26T23:16:07","slug":"smartassembly","status":"publish","type":"post","link":"https:\/\/neosmart.net\/blog\/smartassembly\/","title":{"rendered":"{smartassembly} reviewed"},"content":{"rendered":"<p align=\"left\"><img class=\"colorbox-419\"  decoding=\"async\" src=\"https:\/\/farm3.static.flickr.com\/2609\/4108966580_0725e8a388_o.png\" align=\"middle\" border=\"0\" hspace=\"0\" vspace=\"0\" \/><br \/>\n  \n<\/p>\n<p>Programs. They start off in the IDE as nothing more than a blank page, then (with the blood, sweat, and toil of programmers and many sleepless nights) they turn into volumes of monospaced text, a standing testament to the dedication of programmers and the way they work. Then from the myriads of the source code and the magic of the compiler comes the executable file, the fruit of all the efforts. No one really sees the actual work that went into it: all they see is a file that runs and a program that works.\n<\/p>\n<p>Well, that&#8217;s the way it&#8217;s supposed to go. But with Java and .NET, it doesn&#8217;t really work that way. These frameworks\/virtual-machines rely on the concept of virtual machines, compiling to Byte Code (Java) or MSIL (.NET). What <em>looks like<\/em> an executable file is actually source code being passed on to the framework for translation and execution. So your source code is never safe, and it&#8217;s never really compiled.\n<\/p>\n<p>We&#8217;ve been using .NET for our programs at NeoSmart Technologies for years now, and we&#8217;ve never really come across this as a problem, simply because our software&#8217;s always been and always will be freeware. However, in recent months we&#8217;ve seen some of our more popular programs like <a href=\"http:\/\/neosmart.net\/EasyBCD\/\" rel=\"follow\">EasyBCD<\/a> being decompiled and its source-code stolen left and right by those that don&#8217;t know any better. So we set off looking for the best obfuscation tool for the job, and found much more than what we were looking for.\n<\/p>\n<p><!--more--><\/p>\n<p>We were originally looking for an obfuscation tool, but then we found <a href=\"http:\/\/www.red-gate.com\/products\/dotnet-development\/smartassembly\/\" rel=\"follow\">{smartassembly}<\/a> by Cachupa (<a href=\"http:\/\/neosmart.net\/gallery\/album\/view\/apps\/smartassembly\" rel=\"follow\">screenshots!<\/a>) is much more than that. It&#8217;s a relatively name compared to the other \u201cbig names\u201d in software obfuscation, but in our testing, it&#8217;s the very best tool for the job; designed to impress, easy to use, incredibly powerful, and very intelligent (for lack of a better word) in the way it addresses and overcomes the various issues regarding the complete optimization and protection of .NET Assemblies.\n<\/p>\n<p>We contacted Cachupa and were given a full license so we could test all of {smartassembly}&#8217;s features, and we have to say &#8211; we&#8217;re very impressed.\n<\/p>\n<p>{smartassembly} isn&#8217;t just the best obfuscator we&#8217;ve tested,<sup id=\"rf1-419\"><a href=\"#fn1-419\" title=\"Compared with Pre-Emptive Software&rsquo;s DotFuscator, Remotesoft&rsquo;s Salamander, CodeVeil, XenoCode, and more\" rel=\"footnote\">1<\/a><\/sup> but also an all-in-one optimization, deployment, and improvement tool; offering a range of nifty tools and features that contribute to performance enhancements, better error tracking, and most importantly of all: the best obfuscation we&#8217;ve come across.\n<\/p>\n<p>The remainder of this review is broken-up into 3 sections: <a href=\"http:\/\/neosmart.net\/blog\/smartassembly\/2\/\" rel=\"follow\"><strong>Optimization<\/strong><\/a>, <a href=\"http:\/\/neosmart.net\/blog\/smartassembly\/3\/\" rel=\"follow\"><strong>Obfuscation<\/strong><\/a>, and <a href=\"http:\/\/neosmart.net\/blog\/smartassembly\/4\/\" rel=\"follow\"><strong>Deployment<\/strong><\/a>. And of course, there&#8217;s a <a href=\"http:\/\/neosmart.net\/blog\/smartassembly\/5\/\" rel=\"follow\"><strong>Conclusion<\/strong><\/a> as well.\n<\/p>\n<p><!--nextpage--><\/p>\n<h3>{smartassembly} &amp; Optimization<br \/>\n<\/h3>\n<p><strong><\/strong>Although we came across {smartassembly} while searching for the best obfuscation tool, we&#8217;re most impressed in some of the amazing improvements to .NET assemblies in terms of optimization and performance in our test runs. Throughout this review, we&#8217;ve focused on getting a real-world look at things, and for this section, we just put our <a href=\"http:\/\/neosmart.net\/EasyBCD\/\" rel=\"follow\">EasyBCD<\/a> through the motions, and were duly impressed.\n<\/p>\n<p><strong>Memory Usage Enhancements<\/strong>\n<\/p>\n<p>{smartassembly} has a couple of excellent features aimed at improving the memory usage of your .NET assemblies. There are a couple of options that can be enabled, but first, here&#8217;s a before-and-after:\n<\/p>\n<p><a title=\"Un-Optimized EasyBCD\" href=\"http:\/\/neosmart.net\/gallery\/photo\/view\/apps\/smartassembly\/Un-Optimized+EasyBCD\/o\/\" rel=\"follow\"><img class=\"colorbox-419\"  decoding=\"async\" src=\"https:\/\/farm3.static.flickr.com\/2650\/4108966704_01d72d8dd9_o.png\" align=\"bottom\" border=\"0\" hspace=\"0\" vspace=\"0\" width=\"300\" \/><\/a>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a title=\"{smartassembly}-optimized EasyBCD\" href=\"http:\/\/neosmart.net\/gallery\/photo\/view\/apps\/smartassembly\/Optimized+EasyBCD\/o\/\" rel=\"follow\"><img class=\"colorbox-419\"  decoding=\"async\" src=\"https:\/\/farm3.static.flickr.com\/2630\/4108966670_7b4036b1b9_o.png\" align=\"bottom\" border=\"0\" hspace=\"0\" vspace=\"0\" width=\"300\" \/><\/a>\n<\/p>\n<p>{smartassembly} uses several different techniques to bring down the memory usage.\n<\/p>\n<p>We asked the developers of {smartassembly} for some of the specifics, and they told us that by default the CLR reserves a ton of memory for .NET assemblies &#8211; whether or not they request it. So {smartassembly} intelligently detects when the CPU is idle (or thereabout) and <a href=\"http:\/\/neosmart.net\/gallery\/photo\/view\/apps\/smartassembly\/Miscellanious+Optimizations\/o\/\" rel=\"follow\">increases or decreases the amount of reserved memory<\/a> for your assembly according to its requirements &#8211; &#8220;automated&#8221; GC in a sense, except that memory may or may not have ever been in use.<br \/>\n  \n<\/p>\n<\/p>\n<p>In that same vein, {smartassembly} (with the benefit of literally having access to your source code thanks to the way .NET is designed) marks any and all classes that don&#8217;t have any detectable &#8220;child&#8221; classes inheriting from them as &#8220;sealed&#8221; thereby reducing the amount of memory and CPU used by the CLR during run-time to determine what functions should be made available to other classes and libraries.\n<\/p>\n<p><strong>Improved Size and CPU Requirements<\/strong><br \/>\n  \n<\/p>\n<p>One of the unique techniques used by {smartassembly} to improve the performance of .NET assemblies involves <a href=\"http:\/\/neosmart.net\/gallery\/photo\/view\/apps\/smartassembly\/Embedding+Dependencies\/o\/\" rel=\"follow\">not loading all of the required dependencies<br \/>\n  <br \/><\/a>of the main application at once. This is similar to inline vs. external functions in C++, except the dependencies &#8211; once requested &#8211; are expanded into the memory-space and then have the same performance as the main application itself. Effectively, this is an intelligent compromise between performance and bloat, especially in large applications that rarely have all options activated at once. In our tests, it depends on the size (and quantity) of the external libraries and dependencies being used by the application in question, but by only loading the main assembly into the memory then dynamically decompressing the dependencies (packed with a mild compression algorithm) as one-time occurrence can end up with a huge performance benefit.\n<\/p>\n<p>{smartassembly} also takes a heuristics approach with regards to detecting unused code and dependencies, then simply <a href=\"http:\/\/neosmart.net\/gallery\/photo\/view\/apps\/smartassembly\/Code+Pruning\/o\/\" rel=\"follow\">cutting them out of the compiled software<\/a>. Depending on the exact make-up of your program, this has several improvements including securing as-of-yet unimplemented code from prying eyes (think of all those Easter Eggs!), decreasing the executable assembly&#8217;s file size, and improving memory usage.<br \/>\n  \n<\/p>\n<\/p>\n<p><strong>General Improvements<\/strong>\n<\/p>\n<p>{smartassembly} has one more feature that can make a real difference: it can merge all dependencies and libraries that your application relies on directly into your own code. Then when the time comes to apply the above-mentioned improvements, all those bulky libraries that you only use a function or two from are suddenly subjected to intense filtering and pruning. If you&#8217;re using some heavy UI libraries (like DevEx), this can be a real God-send. Besides the drastic improvements to the size of your application, this leads to snappier code and easier deployment &#8211; no need to muck around with dependencies in your package manager.\n<\/p>\n<p><!--nextpage--><\/p>\n<h3>Obfuscation Techniques &amp; Security in {smartassembly}<br \/>\n<\/h3>\n<p>Obfuscation: it&#8217;s what brought us to {smartassembly} in the first place. While {smartassembly} isn&#8217;t in the market as just an obfuscation utility, we feel it really shines here. We&#8217;ve tried almost all other .NET Obfuscation utilities, from Remotesoft&#8217;s Salamander, Pre-Emptive&#8217;s DotFuscator, 9Rays, Spice, XenoCode, CodeVeil, .NET Reactor, and just about everything else in-between. There are tools like Salamander that are mainly decompiling utilities that give you &#8220;immunity&#8221; from themselves, stuff like DotFuscator which claim to have tons of advanced options that we just can&#8217;t seem to locate, and others that do a decent all-around job. But nothing really stacks up like {smartassembly} in our testing.\n<\/p>\n<p>We obfuscated EasyBCD using the <a href=\"http:\/\/neosmart.net\/gallery\/photo\/view\/apps\/smartassembly\/Obfuscation+Techniques\/o\/\" rel=\"follow\">maximum protection<\/a> &#8211; which isn&#8217;t really recommended because of certain possible incompatibilities especially for library authors &#8211; and set off to try to decompile the now-obfuscated code in dozens of decompiling suites and services.\n<\/p>\n<p>But that&#8217;s not all the protection {smartassembly} has to offer, so we didn&#8217;t just stop right there. Anyone using secret strings (passwords, secret URIs, swear words for method names, etc.) should know the danger of having obfuscated code but fully-legible text &#8211; that&#8217;s where the <a href=\"http:\/\/neosmart.net\/gallery\/photo\/view\/apps\/smartassembly\/String+Encoding\/o\/\" rel=\"follow\">string encoding features<\/a> come in. We&#8217;re not exactly sure what encryption techniques\/ciphers are being used by {smartassembly} to encode the passwords in the executable then decode them on-the-fly during runtime nor were we able to find out &#8211; but it seems secure enough for most purposes. We ran Syser Debugger (version 1.8) and tried to intercept a password we knew beforehand but weren&#8217;t able to get to it &#8211; but we didn&#8217;t lose any sleep over it either, so don&#8217;t take this to the bank.\n<\/p>\n<p>The most interesting obfuscation technique we saw used in {smartassembly} isn&#8217;t so much <em>obfuscation<\/em> as it is out right <em>deception<\/em> &#8211; but when someone is trying to steal your source code (and the gallons of blood and sweat that come along with it), we doubt you&#8217;ll spend any sleepless nights feeling guilty about the moral consequences of <a href=\"http:\/\/neosmart.net\/gallery\/photo\/view\/apps\/smartassembly\/Adding+Obstacles\/o\/\" rel=\"follow\">placing false metadata<\/a> in your assemblies codebase. It seems that {smartassembly} is capable of adding a tiny bit of code to baffle ILDASM and any other ILDASM-dependant decompilers. Certain decompilers flagged the assembly as &#8220;non-.NET&#8221; though we&#8217;re not sure if {smartassembly} actually adds any non-managed code to the final assembly or not.\n<\/p>\n<p><strong>Trying to Decompile EasyBCD&#8230;<\/strong>\n<\/p>\n<p>Once we applied all these layers of security to EasyBCD 1.6 (no, you can&#8217;t see it yet!), we set off trying to crack the security we just put in place. We tested {smartassembly}&#8217;s obfuscation techniques against the following tools:\n<\/p>\n<ul>\n<li>.NET Reactor<\/li>\n<li>RemoteSoft Salamander Decompiler<\/li>\n<li>.NET Reflector<\/li>\n<li>Spices<\/li>\n<li>Dis#<\/li>\n<li>Jungle Creature&#8217;s Decompiler.NET<\/li>\n<\/ul>\n<p>It passed. 2 of the tools failed to even recognize EasyBCD as a .NET assembly (while the others assured us it was). The rest showed weird combinations of non-letters, arrows, and other gibberish nonsense.\n<\/p>\n<p>We&#8217;ve finally a found a tool that as-advertised, no beating around the bush or promising the sky. Event RemoteSoft&#8217;s Salamander with it&#8217;s &#8220;de-obfuscate(turn any obfuscated code into recompilable format)&#8221; [sic] feature failed to do its magic. We&#8217;re duly impressed. Of course, any security tool worth its salt should feature some sort of <a href=\"http:\/\/neosmart.net\/gallery\/photo\/view\/apps\/smartassembly\/Strong+Name+Signing\/o\/\" rel=\"follow\">strong-key signing<\/a> &#8211; fully compatible with the .NET 2.0 Framework standard, of course.\n<\/p>\n<p><!--nextpage--><\/p>\n<h3>Handling Unhandled Exceptions &#8211; The Right Way<br \/>\n<\/h3>\n<p>One of {smartassembly}&#8217;s &#8220;more marketed&#8221; features is the unhandled exception handler. Confused? It does just what it&#8217;s name implies!\n<\/p>\n<p>Everyone has seen the annoying pop-up messages that appear when an application crashes in Windows XP+. It claims it&#8217;s going to &#8220;inform Microsoft&#8221; and &#8220;let you know&#8221; when a solution is found. As developers, we&#8217;ve never been contacted by Microsoft (or even anyone claiming to <em>be<\/em> Microsoft) telling us our application crashed and asking us to fix it. So {smartassembly} lets you take matters into your own hands.\n<\/p>\n<p> Instead of calling up Microsoft&#8217;s own error-reporting agent and just wasting bandwidth all around, {smartassembly} <a href=\"http:\/\/neosmart.net\/gallery\/photo\/view\/apps\/smartassembly\/Handling+Unhandled+Exceptions\/o\/\" rel=\"follow\">can configure your application<\/a> to use its own servers to <a href=\"http:\/\/farm3.static.flickr.com\/2702\/4108200471_41ae8aaa95_o.png\" rel=\"follow\">report unhandled exceptions<\/a>. When you purchase a license key, you&#8217;re given an account on Cachupa server which accepts (any number of) exception reports and lets you see a log of all errors. And if you created a PDB debug file when you created your {smartassembly}-optimized program, you can use that to view a stack trace.\n<\/p>\n<p><a href=\"http:\/\/neosmart.net\/gallery\/photo\/view\/apps\/smartassembly\/Error+Reporting\/o\/\" rel=\"follow\"><img class=\"colorbox-419\"  decoding=\"async\" src=\"https:\/\/farm3.static.flickr.com\/2702\/4108200471_41ae8aaa95_o.png\" align=\"bottom\" border=\"0\" hspace=\"0\" vspace=\"0\" \/><\/a>\n<\/p>\n<p>The {smartassembly}-optimized error-reporting client logs the exception with the remote server, and from your own PC you can use your {smartassembly} install to browse recent exceptions &#8211; just like an email client.<br \/>\n  \n<\/p>\n<\/p>\n<p><a href=\"http:\/\/neosmart.net\/gallery\/photo\/view\/apps\/smartassembly\/Exception+Overview\/o\/\" rel=\"follow\"><img class=\"colorbox-419\"  decoding=\"async\" src=\"https:\/\/farm3.static.flickr.com\/2644\/4108966532_97cc9a8a62_o.png\" align=\"bottom\" border=\"0\" hspace=\"0\" vspace=\"0\" width=\"500\" \/><\/a>\n<\/p>\n<p>If you generated the PDB file (and no reason why you shouldn&#8217;t), you can use the combination of the stack trace, detailed bug reports (together with the platform and configuration) to fix just about anything.\n<\/p>\n<p>While we haven&#8217;t encountered the need for this particular feature with EasyBCD and our other applications which generally don&#8217;t have many issues, but when they <em>do<\/em> fail they fail at a low-level (leaving the user helpless!) and don&#8217;t fire up exceptions, we can easily imagine circumstances under which this feature becomes absolutely essential &#8211; especially when dealing with millions of users running an uptime-critical application like a Instant Messaging client or a web server.\n<\/p>\n<p><!--nextpage--><\/p>\n<h3>Final Thoughts on {smartassembly}<br \/>\n<\/h3>\n<p>{smartassembly} is an amazing utility, and belongs in any serious programmer or organizations arsenal when it comes to proper development, deployment, and bug tracking\/cyclic-feedback.\n<\/p>\n<p>There are a couple of things that might throw off a newcomer to {smartassembly}, chief of which is the interface. It&#8217;s innovative and easy-to-use, but to someone coming to {smartassembly} from another obfuscation suite or even straight out of the Visual Studio IDE, it&#8217;s radically different.\n<\/p>\n<p>It doesn&#8217;t offer much control to the end user with regards exactly what gets obfuscated and what doesn&#8217;t, which obfuscation techniques are used and where they&#8217;re employed, but the end result is just great.\n<\/p>\n<p>Unlike some of the other applications we tested, {smartassembly}-obfuscated programs couldn&#8217;t be re-compiled from decompiled source, and it really did protect our intellectual investments &#8211; so far as we tested it at any rate. More importantly, the final obfuscated result run properly and without a hitch. When we obfuscated EasyBCD with XenoCode and CodeVeil, we were surprised to find out the executable file didn&#8217;t even run &#8211; with XenoCode it errored out before the Windows Form could even be generated, and with CodeVeil it gave an unhandled exception right afterwards.\n<\/p>\n<p>{smartassembly} is definitely competitively-priced. Not many other obfuscation and optimization suites are priced in the sub-$500 range, and certainly nothing that preforms this well. Yet for the casual developer, 400 USD can seem like a hefty price to pay for some peace of mind &#8211; but that&#8217;s .NET for you&#8230; <del datetime=\"20070501\">One more nice thing about the {smartassembly} pricing is that you can have up to 4 developers using the same license without paying a penny more &#8211; that&#8217;s more than what we can say for most other software development suites out there.<\/del><sup id=\"rf2-419\"><a href=\"#fn2-419\" title=\"We misread this data in particular &ndash; it&rsquo;s actually $399 a user for up-to 4 users, then it&rsquo;s a discounted rate.\" rel=\"footnote\">2<\/a><\/sup>\n<\/p>\n<p>Another quirk in {smartassembly} other than the lack of fine-control is the build times. While it optimizes applications pretty fast, if you opt to use the &#8220;Dependency Embedding&#8221; and &#8220;Dependency Merging&#8221; features <ins>with certain large libraries<\/ins> you&#8217;ll find that your P4 can easily sit there producing the final assembly for around 30 minutes easy.<sup id=\"rf3-419\"><a href=\"#fn3-419\" title=\"In attempting to merge &amp; embed the DXperience UI Library, {smartassembly} proved to take quite a bit of time. But for all other libraries the process was snappy and finished in well under 2 minutes. According to {smartassembly}&rsquo;s developers this was a one-time quirk.\" rel=\"footnote\">3<\/a><\/sup> But that&#8217;s a small price to pay for the performance enhancements for your users, the peace-of-mind knowing your code (and gallons of sweat and blood) is safe from prying eyes and greedy hands. Hopefully future versions will feature improvements to the output engine&#8217;s compiling speed.\n<\/p>\n<p>&nbsp;\n<\/p>\n<p><strong>All in all, we give {smartassembly} 9 stars out of 10. If only {smartassembly} had an extra bit of fine-tuning that give it the final push it needs to be a perfect 10\/10.<\/strong><\/p>\n<hr class=\"footnotes\"><ol class=\"footnotes\"><li id=\"fn1-419\"><p>Compared with Pre-Emptive Software&#8217;s DotFuscator, Remotesoft&#8217;s Salamander, CodeVeil, XenoCode, and more&nbsp;<a href=\"#rf1-419\" class=\"backlink\" title=\"Jump back to footnote 1 in the text.\">&#8617;<\/a><\/p><\/li><li id=\"fn2-419\"><p>We misread this data in particular &#8211; it&#8217;s actually $399 a user for up-to 4 users, then it&#8217;s <a href=\"http:\/\/www.red-gate.com\/products\/dotnet-development\/smartassembly\/\" rel=\"follow\">a discounted rate<\/a>.&nbsp;<a href=\"#rf2-419\" class=\"backlink\" title=\"Jump back to footnote 2 in the text.\">&#8617;<\/a><\/p><\/li><li id=\"fn3-419\"><p>In attempting to merge &amp; embed the DXperience UI Library, {smartassembly} proved to take quite a bit of time. But for all other libraries the process was snappy and finished in well under 2 minutes. According to {smartassembly}&#8217;s developers this was a one-time quirk.&nbsp;<a href=\"#rf3-419\" class=\"backlink\" title=\"Jump back to footnote 3 in the text.\">&#8617;<\/a><\/p><\/li><\/ol>","protected":false},"excerpt":{"rendered":"<p>Programs. They start off in the IDE as nothing more than a blank page, then (with the blood, sweat, and toil of programmers and many sleepless nights) they turn into volumes of monospaced text, a standing testament to the dedication &hellip; <a href=\"https:\/\/neosmart.net\/blog\/smartassembly\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[91,368,360,371,369,370],"class_list":["post-419","post","type-post","status-publish","format-standard","hentry","category-software","tag-net","tag-smartassembly","tag-coding","tag-deployment","tag-obfuscation","tag-optimization"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p4xDa-6L","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/neosmart.net\/blog\/wp-json\/wp\/v2\/posts\/419","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/neosmart.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/neosmart.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/neosmart.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/neosmart.net\/blog\/wp-json\/wp\/v2\/comments?post=419"}],"version-history":[{"count":22,"href":"https:\/\/neosmart.net\/blog\/wp-json\/wp\/v2\/posts\/419\/revisions"}],"predecessor-version":[{"id":2348,"href":"https:\/\/neosmart.net\/blog\/wp-json\/wp\/v2\/posts\/419\/revisions\/2348"}],"wp:attachment":[{"href":"https:\/\/neosmart.net\/blog\/wp-json\/wp\/v2\/media?parent=419"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/neosmart.net\/blog\/wp-json\/wp\/v2\/categories?post=419"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/neosmart.net\/blog\/wp-json\/wp\/v2\/tags?post=419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}