ODTUG Aggregator ODTUG Blogs http://localhost:8080 Tue, 20 Feb 2018 16:29:14 +0000 http://aggrssgator.com/ ODTUG Kscope Community Service Day Renamed to Honor Its Founder https://www.odtug.com/p/bl/et/blogaid=769&source=1 ODTUG Community Service Day Renamed ‘Kathleen McCasland Community Service Day’. User group honors its founder and reflects on past 10 years of community service across the nation. ODTUG https://www.odtug.com/p/bl/et/blogaid=769&source=1 Tue Feb 20 2018 14:07:41 GMT-0500 (EST) Filter predicates with NVL on mandatory columns using the index http://rwijk.blogspot.com/2018/02/filter-predicates-with-nvl-on-mandatory.html Rob van Wijk tag:blogger.com,1999:blog-7395977411859619892.post-7248321624725289741 Mon Feb 19 2018 16:43:00 GMT-0500 (EST) Oracle ERP DB Exadata migration + AC-50480: Internal error occurred + ORA-12154 http://jaffardba.blogspot.com/2018/02/oracle-erp-db-exadata-migration-ac.html <div dir="ltr" style="text-align: left;" trbidi="on">I was recently involved in a project to migrate an Oracle ERP database to an Exadata server. The ERP database was a non-RAC Oracle 12cR1 running on RHEL with Oracle EBusiness suite 12.1.3.<br /><br />The migration involved only migrating the ERP database from traditional storage/server technologies to Exadata machine. Upgrade from non-RAC database to RAC. The application remains on the same host. Though similar migration projects were successfully done earlier, this time, I faced a tough challenge resolving autoconfig issues. Here are the details of the issue and how I resolved the problem.<br /><br />Downtime was not an issue, hence, I opted out for an RMAN backup and restore approach. In nutshell, the following was done:<br /><br /><ul style="text-align: left;"><li>Prepared the Oracle home for ERP on Exadata and applied all recommended patches on the home.</li><li>Performed all mandatory steps required for ERP Oracle Home.</li><li>After graceful shutdown of application tier, ERP database was stopped and started in MOUNT state to proceed with RMAN full backup (this is the approach I used, though, many different approaches can be achieved).</li><li>Copied the files to target (Exadata system) and complete the recovery procedure.</li><li>Through manual approach, converted the non-RAC database to RAC mode and completed the post migration steps.</li></ul><span style="color: blue;">Its mandatory to run catbundle script after the database migration to avoid issues like blank login page and issues changing the passwords. Some of you might defer with my advice, but, I faced this at multiple clients. So, I decided to make this as a practice right after migration.</span> <br /><ul style="text-align: left;"><li>The autoconfig on database nodes were successful. However, when autoconfig was executed on application tier, it completed with warnings. The autoconfig,log has the following errors:</li></ul><span style="font-family: &quot;Courier New&quot;, Courier, monospace;">Updating s_tnsmode to 'generateTNS'<br />UpdateContext exited with status: 0<br />AC-50480: Internal error occurred: java.lang.Exception: Error while generating listener.ora.<br />Error generating tnsnames.ora from the database, temporary tnsnames.ora will be generated using templates<br />Instantiating Tools tnsnames.ora<br />Tools tnsnames.ora instantiated<br />Web tnsnames.ora instantiated</span><br /><br />The NetServiceHandler.log reported the following error:<br /><br /><span style="font-family: &quot;Courier New&quot;, Courier, monospace;">SQLPLUS Executable : /oracle/PROD/apps/tech_st/10.1.2/bin/sqlplus<br /><br /><br />SQL*Plus: Release 10.1.0.5.0 - Production on Thu Feb 15 21:27:02 2018<br /><br />Copyright (c) 1982, 2005, Oracle.&nbsp; All rights reserved.<br /><br />Enter value for 1: Enter value for 2: ERROR:<br />ORA-12154: TNS:could not resolve the connect identifier specified<br /><br />Unable to generate listener.ora from database<br />Using default listener.ora file</span><br /><br />&nbsp;After googling for the solution, the common workaround was the following:<br /><ol style="text-align: left;"><li>Clean up the entries from fnd_nodes using the EXEC FND_CONC_CLONE.SETUP_CLEAN;</li><li>Run the autoconfig on Dbtier and run the autoconfig on App tier</li></ol>&nbsp;Unfortunately this doesn't helped us in our case.<br /><br />When I looked at the host names in the FND_NODES for database, the hostname was registered against the management hostname (Exadata has management, public IPs). Though client opened ports for Public hostname, they didn't opened the firewall against the management network. Though we have multiple IPs (management and public), the DB server can only take one hostname. So, if you are on Exadata, you need to ensure what is the hostname registered on the server, despite the different IPs.<br />After allowing firewall to open the LISTENER ports through management IP, the autoconfig on App tier went successfully and we manage to connect the application.<br /><br />The bottom line is, when you are on Exadata for ERP databases, you need to watchout for the hostnames and the ports opened against IPs from application server.<br /><br /><br /></div> The Human Fly tag:blogger.com,1999:blog-19771507.post-2764292139543369687 Sun Feb 18 2018 07:24:00 GMT-0500 (EST) Announcing Breakout with Blockchain – Emerging Technology at ODTUG Kscope18 https://kscope18.odtug.com/p/bl/et/blogaid=768&source=1 ODTUG is excited to announce new content coming to ODTUG Kscope18! This year, we will be introducing our members to Blockchain and the new Oracle Blockchain Cloud Service. If you're curious about leveraging distributed ledger technology in an enterprise environment, ODTUG Kscope has you covered! ODTUG https://kscope18.odtug.com/p/bl/et/blogaid=768&source=1 Fri Feb 16 2018 14:10:40 GMT-0500 (EST) Announcing Breakout with Blockchain – Emerging Technology at ODTUG Kscope18 https://www.odtug.com/p/bl/et/blogaid=768&source=1 ODTUG is excited to announce new content coming to ODTUG Kscope18! This year, we will be introducing our members to Blockchain and the new Oracle Blockchain Cloud Service. If you're curious about leveraging distributed ledger technology in an enterprise environment, ODTUG Kscope has you covered! ODTUG https://www.odtug.com/p/bl/et/blogaid=768&source=1 Fri Feb 16 2018 14:10:40 GMT-0500 (EST) Interactive Grid Column Read Only Control http://www.explorer.uk.com/interactive-grid-column-read-control/ <p class="p1"><span class="s1">I thought it would be interesting to share my findings on the <i>Read Only</i> setting for Interactive Grid (IG) Columns.</span></p> <p class="p1"><span class="s1">The <i>Read Only</i> attribute has been around for many years – so why write a blog about it in 2018? Well, something has changed with the Read Only attribute for Interactive Grid columns &#8211; here is a picture of the setting which you may not have noticed.</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image001-1.png" rel="lightbox[6492]"><img class="aligncenter size-full wp-image-6493" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image001-1.png" alt="" width="369" height="113" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image001-1.png 369w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image001-1-300x92.png 300w" sizes="(max-width: 369px) 100vw, 369px" /></a></p> <p class="p1"><span class="s1">The options for the <b>Execute</b> attribute are <b>For Each Row</b> and <b>Once</b>. The documentation says:</span></p> <p class="p1"><span class="s1"><i>If you refer to Columns in your read only condition, you </i></span><span class="s2"><i>must</i></span><span class="s1"><i> specify </i><b><i>For Each Row</i></b><i> in order for the condition to be evaluated for each row of the Interactive Grid. Otherwise, set to </i><b><i>Once</i></b><i> to evaluate the condition only one time for the region.</i></span></p> <p class="p1"><span class="s1">But it defaults to <b>Once</b>. Even though the documentation says I </span><span class="s2">must</span><span class="s1"> specify <b>For Each Row </b>when I use the <i>Read Only</i> attribute for an IG column <b>and</b> the Execute attribute </span><em><span class="s2">only</span></em><span class="s1"> appears for IG Columns. It may be a case of changing the default to <b>For Each Row</b> as an improvement for a future release of APEX, but I’m so tempted to break that rule and see what happens.</span></p> <p class="p1"><span class="s1">To start with, I’m going to conform to the documentation and try the <b>For Each Row </b>setting on my <i>IG </i>column. I’m going to set the <i>Type</i> to <b>Always</b> and set the <i>Execute</i> <b>For Each Row</b> on my <i>Commission pct</i> column.</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image002.png" rel="lightbox[6492]"><img class="aligncenter size-full wp-image-6494" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image002.png" alt="" width="1347" height="332" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image002.png 1347w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image002-300x74.png 300w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image002-768x189.png 768w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image002-1024x252.png 1024w" sizes="(max-width: 1347px) 100vw, 1347px" /></a></p> <p class="p1"><span class="s1">This has worked out rather well; my whole column is now read only and obviously read only because the column has greyed-out. Excellent. </span></p> <p class="p1"><span class="s1">However, you may have noticed that only Job Ids SA_MAN &amp; SA_REP have a value <i>Commission pct</i>. So let’s modify this a bit more to only allow the user to modify the <i>Commission pct</i> for employees with a Job Id of SA_MAN or SA_REP. </span></p> <p class="p1"><span class="s1">For this, I’m going to use this Read Only criteria on my <i>Commission pct</i> column.</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image004-1.png" rel="lightbox[6492]"><img class="aligncenter size-full wp-image-6496" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image004-1.png" alt="" width="370" height="179" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image004-1.png 370w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image004-1-300x145.png 300w" sizes="(max-width: 370px) 100vw, 370px" /></a></p> <p class="p1"><span class="s1">When we apply this and try to edit our IG we see this:</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image005-1.png" rel="lightbox[6492]"><img class="aligncenter size-full wp-image-6497" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image005-1.png" alt="" width="1300" height="300" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image005-1.png 1300w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image005-1-300x69.png 300w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image005-1-768x177.png 768w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image005-1-1024x236.png 1024w" sizes="(max-width: 1300px) 100vw, 1300px" /></a></p> <p class="p1"><span class="s1">As you can see, only some rows are read only. Pretty cool right?</span></p> <p class="p1"><span class="s1">Now let’s try the same thing but change the Execute value from <b>For Each Row</b> to <b>Once</b></span></p> <p class="p1"><span class="s1">When we apply this and try to edit our IG we see this:</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image007-1.png" rel="lightbox[6492]"><img class="aligncenter size-full wp-image-6498" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image007-1.png" alt="" width="1299" height="302" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image007-1.png 1299w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image007-1-300x70.png 300w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image007-1-768x179.png 768w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image007-1-1024x238.png 1024w" sizes="(max-width: 1299px) 100vw, 1299px" /></a></p> <p class="p1"><span class="s1">It has partially worked; the Commission Pct column is actually read only, but there are no visual clues here (i.e. the column has not greyed-out) – which is a UX issue for my users.</span></p> <p class="p1"><span class="s1">In fact, this column has changed to <i>Read Only</i> by pure fluke. What actually happens is that when you change Execute to <b>Once</b>, APEX loses all visibility of IG column values. Therefore JOB_ID returns the value NULL once – and since NULL is neither contained in SA_MAN nor SA_REP, it, therefore, meets the read only criteria and subsequently sets the column to read only.</span></p> <p class="p1"><span class="s1">In fact, through several tests of several combinations of the <i>Read Only</i> setting; this really is an undesirable situation and <b>Once</b> should never be used in conjunction with IG columns.</span></p> <p class="p1"><span class="s1">So when do you use <b>Once</b>? Well, it works <i>okay</i> when you are referencing page items; for example, I created a switch (P10_SWITCH) which controls when my <i>Commission pct</i> column is <i>Read Only</i>.</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image009-1.png" rel="lightbox[6492]"><img class="aligncenter size-full wp-image-6499" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image009-1.png" alt="" width="375" height="179" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image009-1.png 375w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image009-1-300x143.png 300w" sizes="(max-width: 375px) 100vw, 375px" /></a></p> <p class="p1"><span class="s1">Again this works well – but that visual clue is missing again. For the users, they need this clue. </span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image010.png" rel="lightbox[6492]"><img class="aligncenter size-full wp-image-6500" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image010.png" alt="" width="1127" height="301" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image010.png 1127w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image010-300x80.png 300w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image010-768x205.png 768w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image010-1024x273.png 1024w" sizes="(max-width: 1127px) 100vw, 1127px" /></a></p> <p class="p1"><span class="s1">So, for now, why not always use Execute<b> For Each Row</b>?<span class="Apple-converted-space">  U</span>nless things change, I am using Execute <b>For Each Row</b> to keep this as declarative as possible. There is an overhead of using For Each Row…</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image012.png" rel="lightbox[6492]"><img class="aligncenter size-full wp-image-6501" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image012.png" alt="" width="994" height="300" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image012.png 994w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image012-300x91.png 300w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image012-768x232.png 768w" sizes="(max-width: 994px) 100vw, 994px" /></a></p> <p class="p1"><span class="s1">… but as long as you accept this – then this may be your solution.</span></p> <p class="p1"><span class="s1">It’s always good to keep an eye on any potential changes to this, and other, IG features. However what I wanted to provide you with, in this blog, is an overview of the Execute attribute so that you can understand it a little better and apply it to your applications.</span></p> <p>The post <a rel="nofollow" href="http://www.explorer.uk.com/interactive-grid-column-read-control/">Interactive Grid Column Read Only Control</a> appeared first on <a rel="nofollow" href="http://www.explorer.uk.com">Explorer | Award Winning UK Oracle Partner</a>.</p> admin http://www.explorer.uk.com/?p=6492 Fri Feb 16 2018 06:03:45 GMT-0500 (EST) Oracle APEX Interactive report date order by http://lschilde.blogspot.com/2018/02/oracle-apex-interactive-report-date.html <div dir="ltr" style="text-align: left;" trbidi="on"><h2 class="MsoNormal" style="line-height: normal; text-align: justify;"><b><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 18.0pt;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">Interactive report date order by</span></span></span></b></h2><h2 class="MsoNormal" style="line-height: normal; text-align: justify;"><b><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 18.0pt;">&nbsp;</span></b></h2><h3 class="MsoNormal" style="line-height: normal; text-align: left;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">D<span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">ECODE over CASE statement</span></span></h3><h3 class="MsoNormal" style="line-height: normal; text-align: left;"></h3><h4 class="MsoNormal" style="line-height: normal; text-align: left;"><b><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 12.0pt;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><br /></span></span></span></span></b></h4><h4 class="MsoNormal" style="line-height: normal; text-align: left;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">Oracle APEX - IR <span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">sort order not working?</span></span></span></h4><br /><div style="text-align: justify;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">We all know and love Interactive reports</span> in APEX. This is a quick post showing a <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">typical user case where sort order <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">was <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">rude to a customer</span>.</span></span> </span>&nbsp; <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><br /></span></span></span></span></span></span></span></span><br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-QA2NxHlUpME/WoEs-Qadu3I/AAAAAAAALt0/h-tIg-nPv3Ykub42IWu1ExxgsHh3kWKswCLcBGAs/s1600/CaptureX1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="566" data-original-width="233" height="640" src="https://3.bp.blogspot.com/-QA2NxHlUpME/WoEs-Qadu3I/AAAAAAAALt0/h-tIg-nPv3Ykub42IWu1ExxgsHh3kWKswCLcBGAs/s640/CaptureX1.JPG" width="260" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Why?</span></span></span></span></span></span></span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Looking at the so<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">urce code for this region no<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">t</span>hing jumps out:</span></span></span></span></span></span></span></span></span></span></span></span><br /><blockquote class="tr_bq"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;Courier New&quot;,Courier,monospace;">SELECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; event_id,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; DECODE (evf.start_date_did, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, null, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; evdat.calendar_date)<br />&nbsp;&nbsp;&nbsp;&nbsp; AS event_start_date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;FROM event_fact evf<br />&nbsp;JOIN date_dim evdat <br />&nbsp;&nbsp;&nbsp; ON evdat.date_did = evf.start_date_did&nbsp;&nbsp;&nbsp; </span></span></span></span></span></span></span></span></span></span></span></blockquote><br /> <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">For some reason APEX <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">was seeing this date as a varchar. But again why would this not work if column returned is defined as date in a table.</span></span></span></span></span></span></span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Digging deeper into a problem <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">we looked at definition of DEC<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">O</span>DE function and notice<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">d this:&nbsp;</span></span></span></span></span></span></span></span></span></span></span></span><br /><blockquote class="tr_bq"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">"..If the first <em>result</em> is NULL, then the <em>return</em> value is converted to VARCHAR2."</span></span></span></span></span></span></span></span></span></span></span></span></blockquote><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Great this as usual confirms that we have an iss<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ue in the query not in APEX itself.&nbsp;</span></span></span></span></span></span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Workarounds:&nbsp;</span></span></span></span></span></span></span></span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">1. R<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ewrite your query to use<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"> a date over a NULL in your decode statement</span></span></span></span></span></span></span></span></span></span></span><br /><blockquote class="tr_bq"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;Courier New&quot;,Courier,monospace;">SELECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; event_id,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; DECODE (evf.start_date_did, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, <span style="background-color: yellow;">to_date('01-JAN-1900', 'dd-mon-yyyy')</span>, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; evdat.calendar_date)<br />&nbsp;&nbsp;&nbsp;&nbsp; AS event_start_date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;FROM event_fact evf<br />&nbsp;JOIN date_dim evdat <br />&nbsp;&nbsp;&nbsp; ON evdat.date_did = evf.start_date_did</span></span></span></span></span></span></span></span></span></span></blockquote><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Or <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">even better use <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">CASE</span> statement<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">:&nbsp;</span></span></span></span></div><div style="text-align: justify;"><blockquote class="tr_bq"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;Courier New&quot;,Courier,monospace;">SELECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;Courier New&quot;,Courier,monospace;">&nbsp;&nbsp;&nbsp;&nbsp; event_id,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;Courier New&quot;,Courier,monospace;">&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: yellow;">CASE </span></span></span></span></span></span><span style="background-color: yellow;"><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;Courier New&quot;,Courier,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN evf.start_date_did != 0 </span></span></span></span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;Courier New&quot;,Courier,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THEN evdat.calendar_date END&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;Courier New&quot;,Courier,monospace;"><span style="background-color: yellow;">&nbsp;&nbsp;&nbsp;&nbsp; AS event_start_date</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;Courier New&quot;,Courier,monospace;">&nbsp;FROM event_fact evf</span></span></span></span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;Courier New&quot;,Courier,monospace;">&nbsp;JOIN date_dim evdat </span></span></span></span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;Courier New&quot;,Courier,monospace;">&nbsp;&nbsp;&nbsp; ON evdat.date_did = evf.start_date_did&nbsp;&nbsp; </span></span></span></span></span></blockquote></div><div style="text-align: justify;"><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Summary, <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">there is a difference between <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">DECODE and CAS<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">E statement working with <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">NULLS </span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">whi<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ch can c<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">a<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">use similar iss<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ues </span></span></span></span></span></span></span></span>so be warned and keep an eye out.&nbsp;</span></span></span></div><div style="text-align: justify;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><br /></span></span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Happy APEXing,</span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Lino </span></span></div></div> SLino tag:blogger.com,1999:blog-8185384792158425670.post-4120811747898743020 Fri Feb 16 2018 01:15:00 GMT-0500 (EST) my favorite Apex 5.2 new features https://svenweller.wordpress.com/2018/02/15/my-favorite-apex-5-2-new-features/ <h2>Introduction</h2> <p>Apex 5.2 is still in early adopter phase 1. It looks as if there will be a second early adopter phase. And probably after that Apex 5.2 will be released. </p> <p>The following statements are highly speculational. There are based upon my observations in the early adopter cloud version (apexea.oracle.com) and based upon various talks from Apex team members.</p> <p>Remember: It is possible that some of the features that are already there or that are promised, will not make it into the final version.</p> <p><a href="https://apex.oracle.com/pls/apex/f?p=520052:FEATURES" target="_blank">New features doc/app</a></p> <h2>Create application features</h2> <p>The wizard to create a new application now has a blueprint functionality. This means during application creation we add standard modules to the application that are frequently requested.</p> <h3>Choose/Create Application Icon</h3> <p>This is part of the blueprint functionality. We can now choose from a very limited set of icons, adjust the color and we will get an svg in static application files (#APP_IMAGES#app-icon.svg) that can be used everywhere.</p> <p><img data-attachment-id="7710" data-permalink="https://svenweller.wordpress.com/2018/01/17/apex-5-0-5-2-logo-text-with-icon/apex52_bluepring_dialog3/" data-orig-file="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=809" data-orig-size="964,602" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Apex52_bluepring_dialog3" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=809?w=809" src="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=809" alt="Apex52_bluepring_dialog3" class="alignnone size-full wp-image-7710" srcset="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=809 809w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=150 150w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=300 300w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=768 768w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png 964w" sizes="(max-width: 809px) 100vw, 809px" /></p> <p>I blogged about it already and showed a way how to use the created icon also inside the logo header. See <a href="https://svenweller.wordpress.com/2018/01/17/apex-5-0-5-2-logo-text-with-icon/" target="_blank">Apex 5.0-5.2 Logo Text with Icon</a></p> <h3>Quick SQL</h3> <p>Quick SQL is a shorthand way for creating a datamodel.</p> <p>It is not really an Apex 5.2 feature. However it is a packaged application that was created for 5.2 but is made available already now. This is part of the <a href="https://apex.oracle.com/lowcode/" target="_blank">low code</a> movement.</p> <p>Check out the shortlink to the public quicksql application: <a href="https://apex.oracle.com/en/quicksql/" target="_blank">https://apex.oracle.com/quicksql/</a></p> <h2>Interactive Grid (IG) features</h2> <p>As expected IGs still get a lot of love. Some bugfixes but also several enhancements. Here are my favorite new features.</p> <h3>url based filtering</h3> <p>This can not be tested yet. However John Snyders mentioned it <a href="http://hardlikesoftware.com/weblog/2018/02/07/apex-5-2-interactive-grid/" target="_blank">here</a>. </p> <p>With Interactive Reports we can set filters by adding some parameters to the url for that page. The same is absolutly needed for Grids.</p> <h3>copy down functionality</h3> <p>In the future there will be a way to copy data from one cell of an IG to all empty cells that are below it. Many customers asked me already for this when presenting IGs.</p> <p><img data-attachment-id="7729" data-permalink="https://svenweller.wordpress.com/2018/02/15/my-favorite-apex-5-2-new-features/apex52_copydown/" data-orig-file="https://svenweller.files.wordpress.com/2018/02/apex52_copydown.png?w=809" data-orig-size="558,508" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="apex52_copydown" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/02/apex52_copydown.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/02/apex52_copydown.png?w=809?w=558" src="https://svenweller.files.wordpress.com/2018/02/apex52_copydown.png?w=809" alt="apex52_copydown" class="alignnone size-full wp-image-7729" srcset="https://svenweller.files.wordpress.com/2018/02/apex52_copydown.png 558w, https://svenweller.files.wordpress.com/2018/02/apex52_copydown.png?w=150 150w, https://svenweller.files.wordpress.com/2018/02/apex52_copydown.png?w=300 300w" sizes="(max-width: 558px) 100vw, 558px" /><br /> I&#8217;m not sure how easy it will be to use. Currently it doesn#t seem to be finalised yet. I hope the apex development team finds a decent way to implement it (=easy for the end user).</p> <p>As you can see in the screenshot there is also a copy to clipboard function (ctrl+C)!</p> <h2>components</h2> <h3>Oracle JET upgraded to version 4.1</h3> <p>4.1 is a huge step forward. Apex 5.1 included Oracle JET 2.0.2 (if I remember correctly). The Oracle JET team pushes enhancements very rapidly and frequently. So it is good to have a fairly recent version included now. However at the time when Apex 5.2 will be public, Oracle JET might again be several versions in front.</p> <h3>remote databases</h3> <p>Classical reports (and some other components too) can now be based upon a remote database source.</p> <p>I wasn&#8217;t able to test this feature thoroughly in the cloud version. I hope it means we can now use tables over database links (=remote databases) as a source for our wizard. This is a very typical scenario in company environments. Use apex to access a different Oracle database where the business data resides, but where no apex is installed.</p> <h2>general stuff</h2> <h3>Spotlight search</h3> <p>The search functionality inside page builder was hugely improved. Get familiar with it!</p> <p><img data-attachment-id="7733" data-permalink="https://svenweller.wordpress.com/2018/02/15/my-favorite-apex-5-2-new-features/apex52_spotlight_search/" data-orig-file="https://svenweller.files.wordpress.com/2018/02/apex52_spotlight_search.png?w=809" data-orig-size="717,357" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="apex52_spotlight_search" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/02/apex52_spotlight_search.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/02/apex52_spotlight_search.png?w=809?w=717" src="https://svenweller.files.wordpress.com/2018/02/apex52_spotlight_search.png?w=809" alt="apex52_spotlight_search" class="alignnone size-full wp-image-7733" srcset="https://svenweller.files.wordpress.com/2018/02/apex52_spotlight_search.png 717w, https://svenweller.files.wordpress.com/2018/02/apex52_spotlight_search.png?w=150 150w, https://svenweller.files.wordpress.com/2018/02/apex52_spotlight_search.png?w=300 300w" sizes="(max-width: 717px) 100vw, 717px" /></p> <h3>Sticky property filters</h3> <p>The property pane in the page designer can now be searched. And this search can be pinned. So that the same filter is applied for all items that we click upon. This is very useful!</p> <p><img data-attachment-id="7732" data-permalink="https://svenweller.wordpress.com/2018/02/15/my-favorite-apex-5-2-new-features/apex52_pin_filter/" data-orig-file="https://svenweller.files.wordpress.com/2018/02/apex52_pin_filter.png?w=809" data-orig-size="431,227" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="apex52_pin_filter" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/02/apex52_pin_filter.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/02/apex52_pin_filter.png?w=809?w=431" src="https://svenweller.files.wordpress.com/2018/02/apex52_pin_filter.png?w=809" alt="apex52_pin_filter" class="alignnone size-full wp-image-7732" srcset="https://svenweller.files.wordpress.com/2018/02/apex52_pin_filter.png 431w, https://svenweller.files.wordpress.com/2018/02/apex52_pin_filter.png?w=150 150w, https://svenweller.files.wordpress.com/2018/02/apex52_pin_filter.png?w=300 300w" sizes="(max-width: 431px) 100vw, 431px" /></p> <h3>Dev toolbar enhancements</h3> <p>Page timing info. Looks nice. I&#8217;m not sure how useful, but I sometimes refer to the page timings. Having a better graphical presentation is certainly interesting.</p> <p><img data-attachment-id="7730" data-permalink="https://svenweller.wordpress.com/2018/02/15/my-favorite-apex-5-2-new-features/apex52_page_timing_infos/" data-orig-file="https://svenweller.files.wordpress.com/2018/02/apex52_page_timing_infos.png?w=809" data-orig-size="1572,796" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="apex52_page_timing_infos" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/02/apex52_page_timing_infos.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/02/apex52_page_timing_infos.png?w=809?w=809" src="https://svenweller.files.wordpress.com/2018/02/apex52_page_timing_infos.png?w=809" alt="apex52_page_timing_infos" class="alignnone size-full wp-image-7730" srcset="https://svenweller.files.wordpress.com/2018/02/apex52_page_timing_infos.png?w=809 809w, https://svenweller.files.wordpress.com/2018/02/apex52_page_timing_infos.png?w=150 150w, https://svenweller.files.wordpress.com/2018/02/apex52_page_timing_infos.png?w=300 300w, https://svenweller.files.wordpress.com/2018/02/apex52_page_timing_infos.png?w=768 768w, https://svenweller.files.wordpress.com/2018/02/apex52_page_timing_infos.png?w=1024 1024w, https://svenweller.files.wordpress.com/2018/02/apex52_page_timing_infos.png 1572w" sizes="(max-width: 809px) 100vw, 809px" /></p> <p>Javascript errors on the page are now marked on the developer toolbar.<br /> <img data-attachment-id="7731" data-permalink="https://svenweller.wordpress.com/2018/02/15/my-favorite-apex-5-2-new-features/apex52_devbar_with_jserror/" data-orig-file="https://svenweller.files.wordpress.com/2018/02/apex52_devbar_with_jserror.png?w=809" data-orig-size="1136,119" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="apex52_devbar_with_JSerror" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/02/apex52_devbar_with_jserror.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/02/apex52_devbar_with_jserror.png?w=809?w=809" src="https://svenweller.files.wordpress.com/2018/02/apex52_devbar_with_jserror.png?w=809" alt="apex52_devbar_with_JSerror" class="alignnone size-full wp-image-7731" srcset="https://svenweller.files.wordpress.com/2018/02/apex52_devbar_with_jserror.png?w=809 809w, https://svenweller.files.wordpress.com/2018/02/apex52_devbar_with_jserror.png?w=150 150w, https://svenweller.files.wordpress.com/2018/02/apex52_devbar_with_jserror.png?w=300 300w, https://svenweller.files.wordpress.com/2018/02/apex52_devbar_with_jserror.png?w=768 768w, https://svenweller.files.wordpress.com/2018/02/apex52_devbar_with_jserror.png?w=1024 1024w, https://svenweller.files.wordpress.com/2018/02/apex52_devbar_with_jserror.png 1136w" sizes="(max-width: 809px) 100vw, 809px" /></p> <h3>REST/JSON support</h3> <p>There are major enhancements with regards to rest modules and consuming rest web sources. </p> <p>I didn&#8217;t have time to test them yet. But it is definitly a way into the right direction. </p> <h2>Additional notes</h3> <h3>compatibility mode</h3> <p>There is no compatibility mode 5.2. It seems as if this is intended. Somebody already addressed this as an issue, and this was the response:</p> <blockquote><p> &#8220;Thank you for your feedback. Unbelievable, but APEX 5.2 doesn&#8217;t contain any change of behaviour &#8230;&#8221;</p></blockquote> <h3>Quo Vadis IR?</h3> <p>IGs have an improved way to do conditional highlighting. Already in Apex 5.1.<br /> We can now highlight a column depending on the value of another column. </p> <p>This was way overdue. </p> <p>Unfortunatly this is still not possible for Interactive Reports. </p> <p>Here is how the highlighting dialog looks for IRs vs. IGs<br /> <a href='https://svenweller.wordpress.com/2018/02/15/my-favorite-apex-5-2-new-features/apex52_highlight_ir/'><img width="150" height="109" src="https://svenweller.files.wordpress.com/2018/02/apex52_highlight_ir.png?w=150&#038;h=109" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://svenweller.files.wordpress.com/2018/02/apex52_highlight_ir.png?w=150&#038;h=109 150w, https://svenweller.files.wordpress.com/2018/02/apex52_highlight_ir.png?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="7728" data-permalink="https://svenweller.wordpress.com/2018/02/15/my-favorite-apex-5-2-new-features/apex52_highlight_ir/" data-orig-file="https://svenweller.files.wordpress.com/2018/02/apex52_highlight_ir.png" data-orig-size="615,446" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="apex52_highlight_IR" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/02/apex52_highlight_ir.png?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/02/apex52_highlight_ir.png?w=615" /></a> <a href='https://svenweller.wordpress.com/2018/02/15/my-favorite-apex-5-2-new-features/apex52_highlight_ig/'><img width="150" height="109" src="https://svenweller.files.wordpress.com/2018/02/apex52_highlight_ig.png?w=150&#038;h=109" class="attachment-thumbnail size-thumbnail" alt="" srcset="https://svenweller.files.wordpress.com/2018/02/apex52_highlight_ig.png?w=150&#038;h=109 150w, https://svenweller.files.wordpress.com/2018/02/apex52_highlight_ig.png?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="7727" data-permalink="https://svenweller.wordpress.com/2018/02/15/my-favorite-apex-5-2-new-features/apex52_highlight_ig/" data-orig-file="https://svenweller.files.wordpress.com/2018/02/apex52_highlight_ig.png" data-orig-size="801,581" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="apex52_highlight_IG" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/02/apex52_highlight_ig.png?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/02/apex52_highlight_ig.png?w=801" /></a> </p> <p>I have the feeling that IRs are now the step child of the apex team. It is the declared goal to eventually replace IRs with IGs. I support that vision for the future. However we are still far away from that (pivot functionality missing, and some others). During that transition, IR shouldn&#8217;t be left out of enhancements. </p> <h3>Charts</h3> <p>There are some new charts included. Especially Gantt Charts might be of some interest. However I don&#8217;t particuarly missed them in the past. </p> <p>Oracle Jet includes a few very unique chart types. I would like to see declarative support for <em>all</em> of them. But my favorite Oracle JET chart types are <a href="http://www.oracle.com/webfolder/technetwork/jet/jetCookbook.html?component=diagram&amp;demo=containers" target="_blank">diagrams (container layout)</a>, <a href="http://www.oracle.com/webfolder/technetwork/jet/jetCookbook.html?component=nBox&amp;demo=grouping" target="_blank">NBox</a> and the <a href="http://www.oracle.com/webfolder/technetwork/jet/jetCookbook.html?component=pictoChart&amp;demo=fractions" target="_blank">PictoChart</a>.</p> <h3>Conclusion</h3> <p>Some small enhancements that really should have made it into the previous version already (url based IG filtering for example). But also some major steps into the right direction (REST+JSON support). </p> <p>I like!</p> svenweller http://svenweller.wordpress.com/?p=7726 Thu Feb 15 2018 14:12:34 GMT-0500 (EST) Report query with optional parameters https://jeffkemponoracle.com/2018/02/report-query-with-optional-parameters/ <p>I received a question today from a developer who wanted to write a single static SQL query that could handle multiple optional parameters &#8211; i.e. the user might choose to leave one or more of the parameters NULL, and they&#8217;d expect the query to ignore those parameters. This is a quite common requirement for generic reporting screens, and there are two different methods commonly used to solve it.</p> <p>Their sample query, using bind variables (natch), never returned any rows if any of the bind variables were null:</p> <pre class="brush: sql; title: ; notranslate"> SELECT * FROM emp WHERE job = :P_JOB AND dept = :P_DEPT AND city = :P_CITY </pre> <p>This is expected, of course, because &#8220;x = null&#8221; <em>always</em> evaluates to &#8220;unknown&#8221;, and this causes the rows to be omitted.</p> <p><strong>Option 1: add &#8220;OR v NOT NULL&#8221;</strong>, e.g.</p> <pre class="brush: sql; title: ; notranslate"> SELECT * FROM emp WHERE (job = :P_JOB OR :P_JOB IS NULL) AND (dept = :P_DEPT OR :P_DEPT IS NULL) AND (city = :P_CITY OR :P_CITY IS NULL) </pre> <p><strong>Option 2: use NVL</strong>, e.g.</p> <pre class="brush: sql; title: ; notranslate"> SELECT * FROM emp WHERE job = NVL(:P_JOB, job) AND dept = NVL(:P_DEPT, dept) AND city = NVL(:P_CITY, city) </pre> <p>If the columns in the table do <b>not</b> have NOT NULL constraints on them, Option #2 will fail to return rows that have NULL in the relevant column &#8211; regardless of whether the user parameter is null or not. This is because &#8220;job = job&#8221; will always be &#8220;unknown&#8221; if job is null. In this case, Option #1 must be used.</p> <p>If the columns <b>do</b> have NOT NULL constraints on them, then both Option #1 and Option #2 will work just fine. However, given the choice I would use Option #2 in order to take advantage of the <a href="https://connor-mcdonald.com/2018/02/13/nvl-vs-coalesce/">potential performance optimisation</a> that Oracle 12 can do with these types of NVL queries. There is a 3rd option, which is identical to Option #2 except that it uses the COALESCE function instead of NVL &#8211; but I would avoid this option as it will not get the performance optimisation.</p> <p>On the other hand, if any of the attributes is the result of a costly operation (e.g. a function call), I would always use Option #1 (&#8220;OR NULL&#8221;) instead, because the NVL does not use short-circuit evaluation to avoid multiple function calls.</p> <p>If there is a mix of columns that have NOT NULL constraints and others that don&#8217;t, I don&#8217;t really see any problem with mixing the two methods, e.g. in the case where dept has a NOT NULL constraint but job and city don&#8217;t:</p> <pre class="brush: sql; title: ; notranslate"> SELECT * FROM emp WHERE (job = :P_JOB OR :P_JOB IS NULL) AND dept = NVL(:P_DEPT, dept) AND (city = :P_CITY OR :P_CITY IS NULL) </pre> <p>Here&#8217;s a question for you to think about. What if the <em>business rule</em> states that the report should omit records where a column is null (i.e. the column may have nulls but they don&#8217;t want those records to ever appear in the report)? You may as well use NVL, e.g. in the case where dept has a NOT NULL constraint, but job and city don&#8217;t, but the report should omit records where job is null:</p> <pre class="brush: sql; title: ; notranslate"> SELECT * FROM emp WHERE job = NVL(:P_JOB, job) AND dept = NVL(:P_DEPT, dept) AND (city = :P_CITY OR :P_CITY IS NULL) </pre> <p>You might argue that future developers might be confused by the above query; it&#8217;s not exactly clear whether the developer <em>intended</em> to omit the records with null jobs, or if they made a mistake. Code comments might help, but alternatively you might choose to make the rule explicit, e.g.:</p> <pre class="brush: sql; title: ; notranslate"> SELECT * FROM emp WHERE job = NVL(:P_JOB, job) AND job IS NOT NULL AND dept = NVL(:P_DEPT, dept) AND (city = :P_CITY OR :P_CITY IS NULL) </pre> <p>If you feel strongly about this one way or another, please leave your comments below <img src="https://s.w.org/images/core/emoji/2.4/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p> <p>This topic is a reminder that when there are multiple possible solutions to a problem, the choice should not be taken arbitrarily; and we should avoid enshrining one choice in any standards document as the &#8220;one true way&#8221;. This is because the answer is often &#8220;it depends&#8221; &#8211; different options may be valid for different scenarios, and have advantages and disadvantages that need to be taken into account.</p> <p><strong>Further Reading</strong></p> <ul> <li><a href="https://jonathanlewis.wordpress.com/2018/02/13/coalesce-v-nvl/">Coalesce v. NVL &#8211; Jonathan Lewis</a></li> <li><a href="https://jonathanlewis.wordpress.com/2018/02/13/coalesce-v-nvl/">Coalesce v. NVL &#8211; Connor McDonald</a></li> <li><a href="https://jonathanlewis.wordpress.com/2018/02/14/join-factorization/">Join Factorization &#8211; Jonathan Lewis</a></li> </ul> Jeffrey Kemp https://jeffkemponoracle.com/?p=4947 Wed Feb 14 2018 21:15:15 GMT-0500 (EST) Como devolver más de 500 filas de resultado cuando procesamos una consulta de servicio RESTful http://feedproxy.google.com/~r/DescubriendoElMundoDeOracle/~3/2whd8gj8xq8/como-devolver-mas-de-500-filas-de.html <!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:AllowPNG/> </o:OfficeDocumentSettings></xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves/> <w:TrackFormatting/> <w:PunctuationKerning/> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:EnableOpenTypeKerning/> <w:DontFlipMirrorIndents/> <w:OverrideTableStyleHps/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="&#45;-"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument></xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false" DefSemiHidden="false" DefQFormat="false" DefPriority="99" LatentStyleCount="375"> <w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 7"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 8"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 9"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 9"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Indent"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="header"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footer"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index heading"/> <w:LsdException Locked="false" Priority="35" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="caption"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of figures"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope address"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope return"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote reference"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation reference"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="line number"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="page number"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote reference"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of authorities"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="macro"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="toa heading"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 5"/> <w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Closing"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Signature"/> <w:LsdException Locked="false" Priority="1" SemiHidden="true" UnhideWhenUsed="true" Name="Default Paragraph Font"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Message Header"/> <w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Salutation"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Date"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Note Heading"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Block Text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Hyperlink"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="FollowedHyperlink"/> <w:LsdException Locked="false" Priority="22" QFrmat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Document Map"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Plain Text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="E-mail Signature"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Top of Form"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Bottom of Form"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal (Web)"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Acronym"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Address"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Cite"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Code"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Definition"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Keyboard"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Preformatted"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Sample"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Typewriter"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Variable"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Table"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation subject"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="No List"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 7"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 8"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 7"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 8"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Contemporary"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Elegant"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Professional"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Balloon Text"/> <w:LsdException Locked="false" Priority="39" Name="Table Grid"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Theme"/> <w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" Name="Light List"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" SemiHidden="true" Name="Revision"/> <w:LsdException Locked="false" Priority="34" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" SemiHidden="true" UnhideWhenUsed="true" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/> <w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/> <w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/> <w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/> <w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/> <w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/> <w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 1"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 2"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 3"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 4"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 5"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 6"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 6"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 6"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 1"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 2"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 3"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 4"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 5"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 6"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 6"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Mention"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Smart Hyperlink"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Hashtag"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Unresolved Mention"/> </w:LatentStyles></xml><![endif]--><!--[if gte mso 10]><style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin-top:0in; mso-para-margin-right:0in; mso-para-margin-bottom:8.0pt; mso-para-margin-left:0in; line-height:107%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} </style><![endif]--> <br /><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span lang="ES" style="font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;">Aprovecho de escribir este post porque el otro día un desarrollador en Apex me contactó por una consulta el cual él no podía mostrar en su servicio web más de 500 filas, que es el valor por defecto cuando instalamos el ORDS.</span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><br /></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span lang="ES" style="font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;">Para este caso él dispone del ORDS </span><span lang="ES" style="color: black; font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;">con Oracle Apex y un servidor Glassfish.</span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><br /></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span lang="ES" style="color: black; font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;">Para manejar el máximo de rows utilizamos el parámetro <b>jdbc.maxRows</b> dentro del archivo default.xml en la configuración del ORDS.</span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><br /></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span lang="ES" style="color: black; font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;">Es muy importante colocar la <b style="mso-bidi-font-weight: normal;">m </b>en minúscula de <b style="mso-bidi-font-weight: normal;">max</b>, ya que en la documentación el parámetro sale escrito así: <b>jdbc.MaxRows</b>, y escrito de esta forma en el archivo default.xml no funciona.</span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><br /></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span lang="ES" style="color: black; font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;">Accedemos al archivo default.xml de la configuración de nuestro ORDS e ingresamos la siguiente línea:&nbsp;</span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><br /></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span lang="ES" style="color: black; font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;"><span lang="ES" style="color: black; font-size: 12pt;">&lt;entry key="jdbc.maxRows"&gt;numero-de-filas&lt;/entry&gt;</span></span></span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span lang="ES" style="color: black; font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;"></span></span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><br /></div><div class="MsoNormal" style="line-height: normal;"><span style="font-family: inherit;"><span style="font-size: small;"><span lang="ES" style="color: black;"><span lang="ES" style="color: black;">Por ejemplo:</span></span></span></span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span lang="ES" style="color: black; font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;"><span lang="ES" style="color: black; font-size: 12pt;">&nbsp;</span></span> </span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;"><span lang="ES" style="color: black; font-size: 12pt;">&lt;entry key="jdbc.maxRows"&gt;1000&lt;/entry&gt;</span></span></div><div class="MsoNormal"><span lang="ES" style="mso-ansi-language: ES;"><span style="color: black; font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;"><span lang="ES" style="mso-ansi-language: ES;"><span style="color: black; font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;"><span lang="ES" style="mso-ansi-language: ES;"><br /></span></span></span></span></span></div><div class="MsoNormal"><span lang="ES" style="mso-ansi-language: ES;"></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-_ErgNrc0dIw/WoSJhle2w3I/AAAAAAAALqY/tUG-1WkilKsbqvVVurc1Pxo8XM4gg7RhQCLcBGAs/s1600/default-xml.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="721" data-original-width="954" height="301" src="https://3.bp.blogspot.com/-_ErgNrc0dIw/WoSJhle2w3I/AAAAAAAALqY/tUG-1WkilKsbqvVVurc1Pxo8XM4gg7RhQCLcBGAs/s400/default-xml.jpg" width="400" /></a></div><!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:AllowPNG/> </o:OfficeDocumentSettings></xml><![endif]--><br /><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves/> <w:TrackFormatting/> <w:PunctuationKerning/> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:EnableOpenTypeKerning/> <w:DontFlipMirrorIndents/> <w:OverrideTableStyleHps/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="&#45;-"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument></xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false" DefSemiHidden="false" DefQFormat="false" DefPriority="99" LatentStyleCount="375"> <w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 7"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 8"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 9"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 9"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Indent"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="header"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footer"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index heading"/> <w:LsdException Locked="false" Priority="35" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="caption"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of figures"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope address"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope return"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote reference"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation reference"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="line number"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="page number"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote reference"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of authorities"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="macro"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="toa heading"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 5"/> <w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Closing"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Signature"/> <w:LsdException Locked="false" Priority="1" SemiHidden="true" UnhideWhenUsed="true" Name="Default Paragraph Font"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Message Header"/> <w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Salutation"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Date"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Note Heading"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Block Text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Hyperlink"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="FollowedHyperlink"/> <w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Document Map"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Plain Text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="E-mail Signature"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Top of Form"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Bottom of Form"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal (Web)"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Acronym"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Address"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Cite"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Code"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Definition"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Keyboard"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Preformatted"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Sample"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Typewriter"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Variable"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Table"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation subject"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="No List"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 7"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 8"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 7"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 8"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Contemporary"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Elegant"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Professional"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Balloon Text"/> <w:LsdException Locked="false" Priority="39" Name="Table Grid"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Theme"/> <w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" Name="Light List"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" SemiHidden="true" Name="Revision"/> <w:LsdException Locked="false" Priority="34" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" SemiHidden="true" UnhideWhenUsed="true" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/> <w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/> <w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/> <w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/> <w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/> <w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/> <w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 1"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 2"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 3"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 4"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 5"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 6"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 6"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 6"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 1"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 2"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 3"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 4"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 5"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 6"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 6"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Mention"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Smart Hyperlink"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Hashtag"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Unresolved Mention"/> </w:LatentStyles></xml><![endif]--><!--[if gte mso 10]><style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin-top:0in; mso-para-margin-right:0in; mso-para-margin-bottom:8.0pt; mso-para-margin-left:0in; line-height:107%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} </style><![endif]--> <br /><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span lang="ES" style="color: black; font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;">En el siguiente link tenemos información de los diferentes parámetros que se pueden configurar en el ORDS.</span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><br /></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span lang="ES" style="color: black; font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;"><a href="https://docs.oracle.com/cd/E37099_01/doc.20/e25066/config_file.htm#AELIG7204"><span style="color: blue;">https://docs.oracle.com/cd/E37099_01/doc.20/e25066/config_file.htm#AELIG7204</span></a></span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><br /></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span lang="ES" style="color: black; font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;">Si bien el parámetro por defecto es 500, y no tiene ningún máximo, el máximo de filas va a depender de la configuración y los recursos del hardware ya que hacer que devuelva todas las filas, en el caso que sean miles y miles de filas puede producir que el servidor colapse.</span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><br /></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span lang="ES" style="color: black; font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;">Una vez cambiado el parámetro o agregado si no se encuentra el parámetro en el archivo se debe reiniciar el servidor de Glassfish.</span></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><br /></div><div class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto;"><span lang="ES" style="color: black; font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;">¡Bueno espero le sirva a otra persona este post! </span></div><br /><span style="color: black; font-family: &quot;times new roman&quot; , serif; font-size: 12.0pt;"><br /></span><img src="http://feeds.feedburner.com/~r/DescubriendoElMundoDeOracle/~4/2whd8gj8xq8" height="1" width="1" alt=""/> Clarisa J. Maman Orfali tag:blogger.com,1999:blog-1315583943401206186.post-687290627601769398 Wed Feb 14 2018 14:20:00 GMT-0500 (EST) Cómo Crear una Región de Búsquedas Personalizada en Oracle APEX 5.1 http://feedproxy.google.com/~r/DescubriendoElMundoDeOracle/~3/ta4jJaKlv3o/como-crear-una-region-de-busquedas.html En este artículo quiero compartir una de las tantas formas de crear una región de tipo búsquedas personalizada en nuestra aplicación en <a href="https://apex.oracle.com/es/" target="">Oracle Application Express 5.1</a>.<br /> <br />Al finalizar este artículo obtendrás una página como la que se visualiza abajo:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-W-0D5Q0ICi0/WoSFilh2efI/AAAAAAAALqM/l4K7dffTLJUMZOWOLeeKjEewklU2GpAZACLcBGAs/s1600/img1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="869" data-original-width="1331" height="260" src="https://3.bp.blogspot.com/-W-0D5Q0ICi0/WoSFilh2efI/AAAAAAAALqM/l4K7dffTLJUMZOWOLeeKjEewklU2GpAZACLcBGAs/s400/img1.jpg" width="400" />&nbsp;</a></div><div class="separator" style="clear: both; text-align: left;"><br /></div>Para este demo vamos a utilizar las siguientes tablas: EMP y DEPT.<br /> <br />En la tabla EMP he agregado la siguiente columna:<br /> <ul><li>ACTIVE – Varchar2(1)</li></ul>En esta columna colocaremos Y o N para representar si el empleado está activo o no.<br /><br />Seguir leyendo el artículo completo en <a href="http://www.oracle.com/technetwork/es/articles/apex/crear-busquedas-apex5-1-4350959-esa.html" target="_blank">OTN </a><img src="http://feeds.feedburner.com/~r/DescubriendoElMundoDeOracle/~4/ta4jJaKlv3o" height="1" width="1" alt=""/> Clarisa J. Maman Orfali tag:blogger.com,1999:blog-1315583943401206186.post-1228027252723291147 Wed Feb 14 2018 13:54:00 GMT-0500 (EST) Easier maintenance of standard APEX buttons http://dickdral.blogspot.com/2018/02/easier-maintenance-of-standard-apex.html One of the strong points of APEX is the use of templates. Combining templates with template options and attributes you can end up with HTML objects that are declarative and in most cases do exactly what you want. When you want to make general changes to these objects just change the template or the underlying CSS. This is a very good implementation of the DRY (Don't Repeat Yourself) principle.<br /><br />However when generating pages with APEX you generate many identical buttons (CREATE,SUBMIT,DELETE,CANCEL,NEW)&nbsp;for which the label is a hard coded property for each instance of the button (not so DRY). If you there is the need to change the labels ( maybe for a translation ), you will have to go through the entire application and change all the relevant instances of the buttons.<br />It gets even harder (or more nagging) when after finishing the application you are asked to apply another look-and-feel including a left-side icon.<br /><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-81pklPAv5sg/WoRZRWnoArI/AAAAAAAAAns/-qaBIsiuAbspb_RDAmfyzOetpu3d64uawCLcBGAs/s1600/Schermafbeelding%2B2018-02-14%2Bom%2B16.43.42.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="112" data-original-width="420" height="85" src="https://4.bp.blogspot.com/-81pklPAv5sg/WoRZRWnoArI/AAAAAAAAAns/-qaBIsiuAbspb_RDAmfyzOetpu3d64uawCLcBGAs/s320/Schermafbeelding%2B2018-02-14%2Bom%2B16.43.42.png" width="320" /></a></div><br />So you have to change the button on the left to the button on the right.<br />For each button you need to:<br />- select the button<br />- apply the CSS class<br />- apply the icon CSS class<br />- open the template options (default icon position is right)<br />- change the icon position<br />- close the template options<br />A lot of work, and that times the number of buttons in your application. That is a lot of work and by its repetitive nature very error prone.<br />All these scattered definitions are not very DRY either.<br /><br />A solution I use is to create specific button templates for the most used buttons (CREATE,SUBMIT,DELETE,CANCEL,NEW). The button templates are based on the <b>Text with icon</b> button:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-9iqN7G-6FJY/WoRVj4kFaDI/AAAAAAAAAnM/Vi1tdBRS9iw27Q-02kgO1Ui0_3XpTsmNwCLcBGAs/s1600/Schermafbeelding%2B2018-02-14%2Bom%2B16.14.09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="236" data-original-width="1600" height="94" src="https://1.bp.blogspot.com/-9iqN7G-6FJY/WoRVj4kFaDI/AAAAAAAAAnM/Vi1tdBRS9iw27Q-02kgO1Ui0_3XpTsmNwCLcBGAs/s640/Schermafbeelding%2B2018-02-14%2Bom%2B16.14.09.png" width="640" /></a></div><br /><br />New button templates are created by copying the <b>Text with icon </b>template and adapting it to your needs.In my applications for example for the Save Button, this looks like:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-hwryif5pz1w/WoRVqnYBo6I/AAAAAAAAAnQ/4fPcVEF413Y65US7EESIBiqJUxSvrdd4wCLcBGAs/s1600/Schermafbeelding%2B2018-02-14%2Bom%2B16.26.10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="306" data-original-width="1600" height="122" src="https://2.bp.blogspot.com/-hwryif5pz1w/WoRVqnYBo6I/AAAAAAAAAnQ/4fPcVEF413Y65US7EESIBiqJUxSvrdd4wCLcBGAs/s640/Schermafbeelding%2B2018-02-14%2Bom%2B16.26.10.png" width="640" /></a></div><br />The label is hard coded to <b>Save</b>&nbsp;and the left icon class <b>fa fa-save</b>&nbsp;refers to the save icon (the floppy disk). As we are using the left icon, the code for the right icon is omitted. The class <b>t-Button--iconLeft</b>&nbsp;is needed to display the left icon. And finally the class <b>delphy-hot</b>&nbsp;defines the specific look-and-feel for this application suite.<br /><br />Now all that needs to be done is to apply these specific templates to the buttons. This took me about half an hour for a medium sized application.<br />Instead of the list of actions mentioned above you just need to:<br />- select the button<br />- change the button template<br />Look at the animated GIF below to see how fast the change can be applied.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-a8SwYmPWYDs/WoRYM5dFceI/AAAAAAAAAng/Rxeg_recLf4vPUVtqaVpdhtjznzLliPCwCLcBGAs/s1600/9cb98f0437d474004f3df709598782e0.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="546" data-original-width="866" height="251" src="https://3.bp.blogspot.com/-a8SwYmPWYDs/WoRYM5dFceI/AAAAAAAAAng/Rxeg_recLf4vPUVtqaVpdhtjznzLliPCwCLcBGAs/s400/9cb98f0437d474004f3df709598782e0.gif" width="400" /></a></div><br /><br />Once you have got all the button templates referenced, you can easily change the look-and-feel of all the buttons just by changing the corresponding templates.<br /><div><br /></div>If you have several applications with the same look-and-feel you can copy the templates from one application to another. After copying you can adapt to the application, for example by translating the labels.<br /><br />Happy APEXing ;-)<br /><br /><br /><br /><br /> Dick Dral tag:blogger.com,1999:blog-4312362131290962824.post-8797220213492290268 Wed Feb 14 2018 10:53:00 GMT-0500 (EST) APEX Interactive Grid: Preventing Lost Updates & Record Locking http://www.explorer.uk.com/apex-interactive-grid-preventing-lost-updates-record-locking/ <p class="p1"><span class="s1">I was recently asked about the Interactive Grid (IG) configuration settings that are associated with Locking and Preventing Lost updates. “<i>Aren’t they the same thing?</i>” I was asked&#8230;</span></p> <p><img class="size-large wp-image-6488 aligncenter" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/Lost.Record.Updates-936x1024.jpg" alt="" width="800" height="875" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/Lost.Record.Updates-936x1024.jpg 936w, http://www.explorer.uk.com/wp-content/uploads/2018/02/Lost.Record.Updates-274x300.jpg 274w, http://www.explorer.uk.com/wp-content/uploads/2018/02/Lost.Record.Updates-768x840.jpg 768w, http://www.explorer.uk.com/wp-content/uploads/2018/02/Lost.Record.Updates.jpg 1560w" sizes="(max-width: 800px) 100vw, 800px" /></p> <p class="p1"><span class="s1">Actually, no; they are not the same thing. However, they are both there to protect your data and therefore it is worth spending a little time to explore their true behaviour to understand them a little better.</span></p> <h2 class="p1"><span class="s1"><b>Preventing Lost Updates</b></span></h2> <p class="p1"><span class="s1">What are we trying to achieve here? As per most of my previous blogs … this is best explained with an example. The one am going to use has been taken from the Official APEX Documentation:</span></p> <ol class="ol1"> <li class="li2"><span class="s1">User A queries employee (EMP) records.</span></li> <li class="li2"><span class="s1">User B queries the same employee records.</span></li> <li class="li2"><span class="s1">User B updates employee details for EMPNO = 7839 and applies (commits) the changes to the database.</span></li> <li class="li2"><span class="s1">User A updates employee details for EMPNO = 7839 and is attempting to apply the changes to the database.</span></li> </ol> <p>You guessed it &#8230; User B is on the verge of losing all their data entry work, which is going to be overwritten with the changes from User A. Therefore, it is a competition between user A and B; whoever saves first is going to lose their changes and whoever saves last is going to keep their changes.</p> <p class="p2"><span class="s1">Luckily, the IG process has a setting called <i>Prevent Lost Updates</i> which is set to On by default. If you really need the behaviour described in the scenario above, then you can always set it to off on your IG Process.</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image003.png" rel="lightbox[6466]"><img class="aligncenter size-full wp-image-6468" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image003.png" alt="" width="376" height="221" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image003.png 376w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image003-300x176.png 300w" sizes="(max-width: 376px) 100vw, 376px" /></a></p> <p class="p1"><span class="s1">By enabling the <i>Prevent Lost Updates</i> setting it changes the above scenario around, so now the <em>first to save </em>gets to keep their changes, and an error message will be displayed to the user who is <i>last to save</i>. The <em>last to save</em> will now be unable to save their changes and will have to re-query their record. The IG has a <i>Refresh Rows</i> feature specifically for this scenario whereby the user can refresh records from the database &#8211; this picks up the latest changes from other users.</span></p> <p class="p1"><span class="s1">To ensure you have the <i>Prevent Lost Updates</i> feature fully configured, you’ll need to ensure your IG Process has <i>Prevent Lost Updates</i> set to Yes. Then select which <i>Lost Update Type</i> to use &#8211; you will find this on your Interactive Grid Attributes.</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image005.png" rel="lightbox[6466]"><img class="aligncenter size-full wp-image-6469" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image005.png" alt="" width="379" height="305" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image005.png 379w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image005-300x241.png 300w" sizes="(max-width: 379px) 100vw, 379px" /></a></p> <p class="p1"><span class="s1">There are two types to choose from; <b>Row Values</b> (default) and <b>Row Version Column</b>. The general approach for both is the same; prevention of lost updates is achieved by re-querying the record just before saving to ensure the column values have not changed. In the case of <i>Row Values</i> it checks all updatable columns, and in case of <i>Row Version Column</i>, a single specified column is checked.</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image007.png" rel="lightbox[6466]"><img class="aligncenter size-full wp-image-6470" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image007.png" alt="" width="868" height="171" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image007.png 868w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image007-300x59.png 300w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image007-768x151.png 768w" sizes="(max-width: 868px) 100vw, 868px" /></a></p> <p class="p1"><span class="s1">In the case of the <b>Row Version Column</b>; the documentation describes “<i>a column which is incremented every time a record is updated</i>”. Coincidently, this is exactly how I understood a version column to work, e.g. an automatic incrementing numerical column. When trying an example of this it works really well – lost updates were prevented. I even tried this with other columns of differing datatypes, e.g. When I used a LAST_UPDATED_DATE column it also worked. In an act of rebellion against the documentation, I even tried a <i>decrementing</i> column – this also worked and proves that all that is necessary is that the column value has not changed at the point of saving the IG.</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image009.png" rel="lightbox[6466]"><img class="aligncenter size-full wp-image-6471" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image009.png" alt="" width="375" height="351" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image009.png 375w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image009-300x281.png 300w" sizes="(max-width: 375px) 100vw, 375px" /></a></p> <p class="p1"><span class="s1">In the case of <b>Row Values</b>, according to the documentation, it creates “<i>a checksum of all updatable columns</i>”. That sentence threw me at first when I saw <i>Display Only</i> columns (even Read Only columns) being included in the checksum; after a few tests, I confirmed that regardless of whether the IG column is <i>Display Only/Read Only</i> or not, the IG is going to update the DB with the value of that column. Therefore, when you read “<i>a checksum of all updatable columns</i>” take this to mean <em>“a checksum of all Interactive Grid columns where their Source has a Type of Database Column and the Query Only attribute is set to No”</em>.</span></p> <p class="p1"><span class="s1">When a Lost Update has been prevented, you’ll see this error message:</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image011.png" rel="lightbox[6466]"><img class="aligncenter size-full wp-image-6472" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image011.png" alt="" width="635" height="116" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image011.png 635w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image011-300x55.png 300w" sizes="(max-width: 635px) 100vw, 635px" /></a></p> <p class="p1"><span class="s1">I know that many error messages have a user-friendly version; so I checked a users session and … unfortunately, it reads the same. I guess you have to hope your users are technical.</span></p> <p class="p1"><span class="s1">When it comes to locking rows; there’s a nifty approach when combining with the P<i>revent Lost Updates</i> and the <i>Lock Row</i> setting. Whenever you set <i>Prevent Lost Updates</i> to Yes, it is going to perform a checksum of the existing DB record (based on the method and whatever you set as the PK, e.g. the ROWID) &#8211; so it needs to visit the DB to obtain these values to calculate the checksum. Whilst it is obtaining these values, if you set <i>Lock Row</i> to Yes, then APEX appends a “<i>for update NOWAIT</i>” to that select statement. Therefore the lock and the values it needs for the checksum can be achieved in one hit.</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image013.png" rel="lightbox[6466]"><img class="aligncenter size-full wp-image-6473" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image013.png" alt="" width="869" height="156" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image013.png 869w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image013-300x54.png 300w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image013-768x138.png 768w" sizes="(max-width: 869px) 100vw, 869px" /></a></p> <p class="p1"><span class="s1">If you set <i>Prevent Lost Update</i>s to No and set <i>Lock Record</i> to Yes then APEX will still fetch the record with a “<i>for update NOWAIT</i>”; it just never applies the checksum.</span></p> <p class="p1"><span class="s1">The overhead of <i>Prevent Lost Updates</i> and <i>Lock Record</i> averaged 0.00410 seconds in my tests. Which is well worth activating to prevent lost changes.</span></p> <p class="p1"><span class="s1">Once again, the user is informed of the lock, and it too has a very technical error message to log with their IT department.</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image015.png" rel="lightbox[6466]"><img class="aligncenter size-full wp-image-6474" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image015.png" alt="" width="635" height="135" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image015.png 635w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image015-300x64.png 300w" sizes="(max-width: 635px) 100vw, 635px" /></a></p> <p class="p1"><span class="s1">With APEX enforcing the NOWAIT row lock, there is no real declarative control you have of this; for example, the DB supports the <i>WAIT integer seconds</i> feature &#8211; should you be prepared to wait for a lock to become free (not to mention the SKIP LOCKED feature which would be undesirable in this context). APEX does not support this nor any other locking parameters declaratively.</span></p> <p class="p1"><span class="s1">Be aware that the NOWAIT lock cannot be applied for every interactive grid; for example, IGs based on a collection. In this scenario, it makes no sense as the APEX_COLLECTIONS object is a complex view with constructs which prohibit the FOR_UPDATE clause &#8211; namely the DISTINCT operator, CURSOR expression, set operators, group by clause and aggregate functions. Not only for collections, but the same applies to those constructs in any complex SQL you may use in your query source.</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image017.png" rel="lightbox[6466]"><img class="aligncenter size-full wp-image-6475" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image017.png" alt="" width="636" height="161" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image017.png 636w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image017-300x76.png 300w" sizes="(max-width: 636px) 100vw, 636px" /></a></p> <p class="p1"><span class="s1">So what can you do when you encounter the above when using a collection? If collections are session specific, are you fine to disable the lock? Or maybe &#8230; you should write your own locking code?</span></p> <p class="p1"><span class="s1">There is actually an option to lock rows with PL/SQL Code … but it sadly doesn’t work in APEX 5.1 or 5.2EA1. Any code (it really doesn’t matter if it validates or not) is not evaluated which is a real shame and you have to use a workaround. Apparently the PL/SQL code to lock the row <em>should</em> be available for testing in the next EA update.</span></p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/02/image019.png" rel="lightbox[6466]"><img class="aligncenter size-full wp-image-6476" src="http://www.explorer.uk.com/wp-content/uploads/2018/02/image019.png" alt="" width="374" height="303" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/02/image019.png 374w, http://www.explorer.uk.com/wp-content/uploads/2018/02/image019-300x243.png 300w" sizes="(max-width: 374px) 100vw, 374px" /></a></p> <p class="p1"><span class="s1">The workaround can be applied by creating a PL/SQL process on your editable IG region and having this fire before your IG process. In my tests, though I can’t combine it with an apex_error to report the error in a nicer way because the process will wait for the lock to be released even with a NOWAIT.</span></p> <p class="p1"><span class="s1">So how can we update a collection through an IG process? We’ll need to access the APEX_COLLECTION API, so we have to change the Target Type to PL/SQL. This is going to work for us; but can we also prevent lost updates? – Well yes, the checksum will still be generated using your selected <i>Lost Update Type</i> setting. Be aware it just can’t be locked due to the prohibited constructs of the APEX_COLLECTIONS view.</span></p> <p class="p1"><span class="s1">This brings us to views or joins. In a join over 2 tables (e.g. Employee and Job) this is a problematic and possibly requires a rethink in this approach. The question to ask yourself is what do you expect to happen when you press save? Is it suited to an Editable \Interactive Grid; could it be split into master-detail IG set or is one table (Job) just used as a lookup for another column (employee.job_id)?</span></p> <p class="p1"><span class="s1">Should you </span><span class="s2">really</span><span class="s1"> need this type of set up; you can set the Target Type to table/View and choose a single table (employees for example). Setting the other columns (e.g. Job table columns) to Query only, you can still lock the (employees) table providing you use a PK on that table. You can still prevent lost updates in this method too as the lock applies to the table in the Target Type and the checksum does not apply to Query Only columns – i.e. the lock and checksum can only apply to a single table.</span></p> <p class="p1"><span class="s1">So there you have it; Preventing Lost Updates and Record Locking are enabled by default on your IG, making your data secure and robust. Preventing Lost Updates can adapt to your schema design by using record versioning columns and Record Locking can be disabled or manually configured. All this is performed out of the box and rapidly by the APEX Framework making developers more productive and feature focussed.</span></p> <p>&nbsp;</p> <p>The post <a rel="nofollow" href="http://www.explorer.uk.com/apex-interactive-grid-preventing-lost-updates-record-locking/">APEX Interactive Grid: Preventing Lost Updates &#038; Record Locking</a> appeared first on <a rel="nofollow" href="http://www.explorer.uk.com">Explorer | Award Winning UK Oracle Partner</a>.</p> admin http://www.explorer.uk.com/?p=6466 Mon Feb 12 2018 03:58:34 GMT-0500 (EST) Oracle Cloud Infrastructure services and third-party backup tools (CloudBerry) http://jaffardba.blogspot.com/2018/02/oracle-cloud-infrastructure-services.html <div dir="ltr" style="text-align: left;" trbidi="on">As part of the Cloud Infrastructure services, Oracle offers below persistent I/O intensive block storage and high-throughput storage options, which is manageable through the console and by CLI:<br /><br /><ul style="text-align: left;"><li>Oracle Cloud Infrastructure Block Volumes</li><li>Oracle Cloud Infrastructure Object Storage</li><li>Oracle Cloud Infrastructure Archive Storage</li><li>Oracle Cloud Infrastructure File Storage</li><li>Oracle Cloud Infrastructure Data Transfer Service</li></ul>&nbsp;To understand the details, features, pricing and etc, visit the URL below:<br />&nbsp;<a href="https://cloud.oracle.com/en_US/infrastructure/storage">https://cloud.oracle.com/en_US/infrastructure/storage</a><br /><br />One of the customers was struggling to delete the backup data from the Oracle Cloud to avoid the charges. Oracle support requested to use the CloudBerry tools for easy management. Below is the excerpt from the CloudBerry website :<br /><br />"With CloudBerry Backup you can use Oracle Storage Cloud Service as a cost-effective, remote backup solution for your enterprise data and applications. By backing up your data and applications to Oracle Storage Cloud Service, you can avoid large capital and operating expenditures in acquiring and maintaining storage hardware. By automating your backup routine to run at scheduled intervals, you can further reduce the operating cost of running your backup process. In the event of a disaster at your site, the data is safe in a remote location, and you can restore it quickly to your production systems"<br /><br />CloudBerry offers below Oracle tools : <br /><ul style="text-align: left;"><li>CloudBerry Explorer</li><li>CloudBerry Backup</li><li>CloudBerry Managed Backup</li><li>CloudBerry Drive</li></ul>&nbsp;Visit their website to explore more about these tools:<br /><br /><a href="https://www.cloudberrylab.com/solutions/oracle-cloud">https://www.cloudberrylab.com/solutions/oracle-cloud</a><br /><br />We then used CloudBerry Backup tool (15 days free trail) to move the backup files from the Oracle cloud storage and removed it from the cloud.<br /><br />You may download the 15 days free trail and give a try. <br /><br /><br /><div><div><br /><br /></div></div></div> The Human Fly tag:blogger.com,1999:blog-19771507.post-546231357585952724 Mon Feb 12 2018 03:46:00 GMT-0500 (EST) Oracle APEX Plugin Performance https://blog.danielhochleitner.de/2018/02/11/oracle-apex-plugin-performance/ <p><a href="https://orclapex.io/ords/f?p=PLG_PERFORMANCE" target="_blank"><img data-attachment-id="276" data-permalink="https://blog.danielhochleitner.de/2018/02/11/oracle-apex-plugin-performance/plugin_performance/" data-orig-file="https://blogdanielhochleitner.files.wordpress.com/2018/02/plugin_performance.png" data-orig-size="3360,1812" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="plugin performance test" data-image-description="" data-medium-file="https://blogdanielhochleitner.files.wordpress.com/2018/02/plugin_performance.png?w=300" data-large-file="https://blogdanielhochleitner.files.wordpress.com/2018/02/plugin_performance.png?w=1024&#038;h=552" src="https://blogdanielhochleitner.files.wordpress.com/2018/02/plugin_performance.png?w=1024&#038;h=552" alt="" width="1024" height="552" class="aligncenter size-large wp-image-276" srcset="https://blogdanielhochleitner.files.wordpress.com/2018/02/plugin_performance.png?w=1024&amp;h=552 1024w, https://blogdanielhochleitner.files.wordpress.com/2018/02/plugin_performance.png?w=2048&amp;h=1104 2048w, https://blogdanielhochleitner.files.wordpress.com/2018/02/plugin_performance.png?w=150&amp;h=81 150w, https://blogdanielhochleitner.files.wordpress.com/2018/02/plugin_performance.png?w=300&amp;h=162 300w, https://blogdanielhochleitner.files.wordpress.com/2018/02/plugin_performance.png?w=768&amp;h=414 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p> <p>Last week a customer of mine hired me to look into performance issues they had at larger forms within their APEX inhouse app.<br /> After digging into it, I recognized that they used a lot of plugins in this particular app (~ 90), and of course a lot of known ones from the community like Select2 or Dropzone.</p> <p>The problematic pages were mostly larger forms with a lot of items, in this case also a lot of plugin items, like mentioned above Select2. This item type plugin was used around 30 times on this page&#8230;</p> <p>So first I had a look into the debug output of the page and I saw that most of the output was the PL/SQL source code of this plugin. So 30 times the APEX engine had to parse and execute the complete PL/SQL source of Select2, and the newest version of it has 773 lines of PL/SQL code&#8230;</p> <p>The second problem I found was that all static files of the plugin (e.g JavaScript and CSS files) came from the database, you will see that in the debug output in APEX &gt; 5.0 environments on the file path of the files that are loaded, e.g:</p> <pre class="brush: plain; title: ; notranslate"> Load JavaScript file=demo/r/140/files/plugin/53116667758949585/v1/select2-apex.js </pre> <p>File paths which contain the virtual directory &#8220;/r/&#8221; shows us that the file being loaded comes from the DB, so each time a static file was loaded it hits the DB which returns a BLOB. Of course browsers will cache such a file after getting it once, but in my opinion the best place for static files is the web server itself not the DB&#8230;</p> <p><strong>So I found 2 problems in this case:</strong><br /> 1) Large PL/SQL code of a plugin<br /> 2) Plugin static files are loaded from DB</p> <p><a href="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_before.png" target="_blank" rel="noopener"><img data-attachment-id="264" data-permalink="https://blog.danielhochleitner.de/2018/02/11/oracle-apex-plugin-performance/apex_plugin_source_before/" data-orig-file="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_before.png" data-orig-size="3354,1906" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="apex_plugin_source_before" data-image-description="" data-medium-file="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_before.png?w=300&#038;h=170" data-large-file="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_before.png?w=1024" src="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_before.png?w=300&#038;h=170" alt="" width="300" height="170" class="alignnone size-medium wp-image-264" srcset="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_before.png?w=300&amp;h=170 300w, https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_before.png?w=598&amp;h=340 598w, https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_before.png?w=150&amp;h=85 150w" sizes="(max-width: 300px) 100vw, 300px" /></a><a href="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_before.png" target="_blank" rel="noopener"><img data-attachment-id="263" data-permalink="https://blog.danielhochleitner.de/2018/02/11/oracle-apex-plugin-performance/apex_plugin_files_before/" data-orig-file="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_before.png" data-orig-size="3358,1678" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="apex_plugin_files_before" data-image-description="" data-medium-file="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_before.png?w=300&#038;h=150" data-large-file="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_before.png?w=1024" src="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_before.png?w=300&#038;h=150" alt="" width="300" height="150" class="alignnone size-medium wp-image-263" srcset="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_before.png?w=300&amp;h=150 300w, https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_before.png?w=600&amp;h=300 600w, https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_before.png?w=150&amp;h=75 150w" sizes="(max-width: 300px) 100vw, 300px" /></a></p> <p><strong>A possible solution for both:</strong><br /> 1) Transfer the PL/SQL code from the plugin to a real DB object, e.g a PL/SQL package<br /> 2) Transfer all plugin static files to the web server</p> <p>After creating a PL/SQL package (e.g. select2_plg_pkg) with the copied source code from the plugin and moving all static files to the web server, the plugin looked like this:</p> <p><a href="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_after1.png" target="_blank" rel="noopener"><img data-attachment-id="271" data-permalink="https://blog.danielhochleitner.de/2018/02/11/oracle-apex-plugin-performance/apex_plugin_source_after/" data-orig-file="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_after1.png" data-orig-size="3358,1884" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="apex_plugin_source_after" data-image-description="" data-medium-file="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_after1.png?w=300&#038;h=168" data-large-file="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_after1.png?w=1024" src="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_after1.png?w=300&#038;h=168" alt="" width="300" height="168" class="alignnone size-medium wp-image-271" srcset="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_after1.png?w=300&amp;h=168 300w, https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_after1.png?w=600&amp;h=336 600w, https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_source_after1.png?w=150&amp;h=84 150w" sizes="(max-width: 300px) 100vw, 300px" /></a><a href="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_after.png" target="_blank" rel="noopener"><img data-attachment-id="272" data-permalink="https://blog.danielhochleitner.de/2018/02/11/oracle-apex-plugin-performance/apex_plugin_files_after/" data-orig-file="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_after.png" data-orig-size="3358,1552" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="apex_plugin_files_after" data-image-description="" data-medium-file="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_after.png?w=300&#038;h=139" data-large-file="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_after.png?w=1024" src="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_after.png?w=300&#038;h=139" alt="" width="300" height="139" class="alignnone size-medium wp-image-272" srcset="https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_after.png?w=300&amp;h=139 300w, https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_after.png?w=600&amp;h=278 600w, https://blogdanielhochleitner.files.wordpress.com/2018/02/apex_plugin_files_after.png?w=150&amp;h=69 150w" sizes="(max-width: 300px) 100vw, 300px" /></a></p> <p>So lets compare the page performance before and after the changes (30 Select2 items / 2 Dropzone Regions).<br /> With the orginal plugins the page rendering took: ~ 4.3 seconds<br /> With the modified plugins the page rendering took: ~ 1.3 seconds</p> <p>This is an performance improvement of ~330% !! So the page is 3x faster in rendering than before. To be honest I didn´t expect such an performance increase by changing the plugin code&#8230;</p> <p>If you want to see it in action, here´s a little demo app:<br /> <a href="https://orclapex.io/ords/f?p=PLG_PERFORMANCE" target="_blank">https://orclapex.io/ords/f?p=PLG_PERFORMANCE</a><br /> Use demo / demo for login!</p> <p><strong>Conclusion:</strong><br /> As best practise learns us to have as less code in APEX as possible (e.g only function calls), this is also valid for plugins. So be careful in using plugins and always try to review the code. In this case the plugins are not bad coded or something like that, instead it´s the most easy way to share plugins with others, having files and PL/SQL source code inside the plugin. This means that you only need the plugin export SQL file to import and use it.</p> <p>But some plugins have a lot of source code (here over 700 lines) which makes it problemtatic using such a plugin many times on a page, because this source code have to be parsed again and again.</p> <p>If you decide to also improve the performance of your plugins like I told you here, be careful, thus the plugin now consists of several parts:<br /> &#8211; the plugin export SQL file<br /> &#8211; the static files / folder<br /> &#8211; the pl/sql package<br /> And if you want to share your plugin or use it in another application you have to import all 3 parts of it!</p> <p>Another disadvantage would be, if an plugin developer updates the open source plugin you have to catch up the changes by yourself, because you have changed some logic inside of the plugin before&#8230;</p> Daniel Hochleitner http://blog.danielhochleitner.de/?p=258 Sun Feb 11 2018 15:39:24 GMT-0500 (EST) Switch and Radio as Pill Custom Colors http://max-tremblay.blogspot.com/2018/02/switch-and-radio-as-pill-custom-colors.html <div class="separator" style="display: none;"><a href="https://3.bp.blogspot.com/-cD2_R9KvNoI/Wn-7-bZgXxI/AAAAAAAABp4/92MsI_MX_0YK1guUrdrmsozBLZudClXsACLcBGAs/s1600/custom_color.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1120" data-original-width="888" height="320" src="https://3.bp.blogspot.com/-cD2_R9KvNoI/Wn-7-bZgXxI/AAAAAAAABp4/92MsI_MX_0YK1guUrdrmsozBLZudClXsACLcBGAs/s320/custom_color.png" width="253" /></a></div>There are two easy ways to have Toggle-like items in your applications.<br /><br />One way is by using the Switch item type that will like this:<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-ucz5DsIUWEI/Wn-p3kbxwaI/AAAAAAAABog/657M3JLSRJoBT6p7io9UeyFHMtHWAbFqACLcBGAs/s1600/switch_item.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="98" data-original-width="416" height="75" src="https://2.bp.blogspot.com/-ucz5DsIUWEI/Wn-p3kbxwaI/AAAAAAAABog/657M3JLSRJoBT6p7io9UeyFHMtHWAbFqACLcBGAs/s320/switch_item.png" width="320" /></a></div><br />If your switch items are displayed as select lists rather than as toggle items, you will need to go in your application's Shared Components, then in the Components Settings and edit the Switch item to change the Display Style attribute to Switch.<br /><br />Another way is by using a Radio item. You'll need to change some attributes so that the item is displayed as a toggle.<br /><br />First, you'll need to change the Number of Columns attributes to at least the amount of values you have. I like to use 999 so that if a new value is added to the list, I won't have to change the attribute again.<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-wczH25ygal0/Wn-pKGLxxpI/AAAAAAAABoY/EP2cbYiDMDoVLWNE-OT8hXlEU_csEHnhgCEwYBhgL/s1600/radio_as_pill_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="618" data-original-width="952" height="207" src="https://4.bp.blogspot.com/-wczH25ygal0/Wn-pKGLxxpI/AAAAAAAABoY/EP2cbYiDMDoVLWNE-OT8hXlEU_csEHnhgCEwYBhgL/s320/radio_as_pill_1.png" width="320" /></a></div><br />Then you'll need to change the Template Options so that the Radio Group Display is set to "Display as Pill Button".<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-YyWXN1Mh1Sw/Wn-pKPpGNFI/AAAAAAAABoU/WN2XGNX7AWgJxr3-XNUxyTSub74KpKFtACEwYBhgL/s1600/radio_as_pill_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1012" data-original-width="1036" height="312" src="https://4.bp.blogspot.com/-YyWXN1Mh1Sw/Wn-pKPpGNFI/AAAAAAAABoU/WN2XGNX7AWgJxr3-XNUxyTSub74KpKFtACEwYBhgL/s320/radio_as_pill_2.png" width="320" /></a></div>You will get a radio item that looks like this:<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-ray_3jIP20M/Wn-p3v5rXuI/AAAAAAAABok/l1LuxoVZ5eMB5Md0fWhyK2mB7o9yrwtaACLcBGAs/s1600/radio_Item.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="98" data-original-width="450" height="69" src="https://2.bp.blogspot.com/-ray_3jIP20M/Wn-p3v5rXuI/AAAAAAAABok/l1LuxoVZ5eMB5Md0fWhyK2mB7o9yrwtaACLcBGAs/s320/radio_Item.png" width="320" /></a></div><br />Now, let's customize their colors.<br /><br /><h2>Custom On/Off Colors</h2>Let's define this CSS<br /><blockquote class="tr_bq"><pre class="line-numbers"><code class="language-css">/* Custom On/Off Color - No Color */<br />.t-Form-fieldContainer--radioButtonGroup .customOnOffColor.apex-item-radio input:checked + label,<br />.customOnOffColor.apex-button-group input:checked+label {<br /> background-color: #EF9A9A;<br />}<br /><br />/* Custom On/Off Color - Yes Color */<br />.t-Form-fieldContainer--radioButtonGroup .customOnOffColor.apex-item-radio input[value=Y]:checked + label,<br />.customOnOffColor.apex-button-group input[value=Y]:checked+label {<br /> background-color:#A5D6A7<br />}<br /></code></pre></blockquote>In order to have the items use custom colors, we only need to set the CSS Classes to "customOnOffColor".<br /><br />The yes value will be green and any other value will be red, like this:<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/--syb9E6YqYw/Wn-7-fuE8zI/AAAAAAAABqA/rX_WfnDZmSAMdrzM11aMsaPFlwwly1QOACLcBGAs/s1600/custom_on_off_colors.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="520" data-original-width="888" height="187" src="https://2.bp.blogspot.com/--syb9E6YqYw/Wn-7-fuE8zI/AAAAAAAABqA/rX_WfnDZmSAMdrzM11aMsaPFlwwly1QOACLcBGAs/s320/custom_on_off_colors.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><br /><h2>Custom On Color</h2>Let's define this CSS <br /><blockquote class="tr_bq"><pre class="line-numbers"><code class="language-css">/* Custom On Color */<br />.t-Form-fieldContainer--radioButtonGroup .customOnColor.apex-item-radio input:checked + label,<br />.customOnColor.apex-button-group input:checked+label {<br /> background-color: #B3E5FC;<br />}<br /></code></pre></blockquote>In order to have the items use custom color, we only need to set the CSS Classes to "customOnColor".<br /><br />The selected value will be blue, like this:<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-ENtmuHOxURc/Wn-7-fesohI/AAAAAAAABp8/jYL5pBa1Zdsu2S9VL_27cIYhWx1f9jX7ACLcBGAs/s1600/custom_on_colors.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="600" data-original-width="886" height="216" src="https://2.bp.blogspot.com/-ENtmuHOxURc/Wn-7-fesohI/AAAAAAAABp8/jYL5pBa1Zdsu2S9VL_27cIYhWx1f9jX7ACLcBGAs/s320/custom_on_colors.png" width="320" /></a></div><br /><br />For both the custom On/Off and On only colors, if you'd like to apply it for all items (Switch and Radio as Pill), you can simply remove the classes names from the above CSS.<br /><br />You can have a look at it in action in my&nbsp;<a href="http://max-playground.no-ip.org/ords/f?p=DEMO:2800" target="_blank">Demo Application</a><br /><br />Enjoy! Maxime Tremblay tag:blogger.com,1999:blog-267713902572011003.post-709464872144814204 Sat Feb 10 2018 23:25:00 GMT-0500 (EST) APEX Alpe Adria - A New APEX Conference That You Should Attend http://joelkallman.blogspot.com/2018/02/apex-alpe-adria-new-apex-conference.html <div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-uniDFxOH_C8/Wn9Iv0kOISI/AAAAAAAADoM/f1hycYJAWlMO0xm9U_I9c5JQwh16DA62gCLcBGAs/s1600/aaapeks.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="964" data-original-width="1600" height="384" src="https://4.bp.blogspot.com/-uniDFxOH_C8/Wn9Iv0kOISI/AAAAAAAADoM/f1hycYJAWlMO0xm9U_I9c5JQwh16DA62gCLcBGAs/s640/aaapeks.png" width="640" /></a></div><br /><br />Have you heard of <a href="https://www.aaapeks.info/" target="_blank">APEX Alpe Adria</a>?&nbsp; It's the latest "All APEX" conference, joining <a href="https://www.nloug.nl/page.aspx?lang=en&amp;event=405" target="_blank">APEX World</a> and <a href="https://apex.doag.org/en/home/" target="_blank">APEX Connect</a> as high-quality conferences dedicated to <a href="https://apex.oracle.com/" target="_blank">Oracle APEX</a> developers and related technologies.<br /><br />APEX Alpe Adria is a very modestly-priced one-day conference occurring on April 20, 2018 in Graz, Austria.&nbsp; The <a href="https://www.aaapeks.info/en/aaapeks/home/" target="_blank">list of speakers</a> that they have organized is unbelievably impressive - they are all very knowledgeable &amp; experienced, as well as very polished presenters.&nbsp; All presentations will be in English.&nbsp; Also, the evening before the conference, there will be an <a href="https://www.aaapeks.info/en/aaapeks/ask-an-ace" target="_blank">Ask an ACE</a> session, where you can ask any question to a panel of highly experienced Oracle ACEs.<br /><br />APEX Alpe Adria is the creation of three different Oracle partners, <a href="https://twitter.com/gospar" target="_blank">Dario Bilić</a>&nbsp;from <span id="goog_1155903779"></span><a href="http://bilog.hr/" target="_blank">BiLog d.o.o.</a><span id="goog_1155903780"></span>, <a href="https://twitter.com/aljazmali" target="_blank">Aljaž Mali</a> from&nbsp;<a href="https://abakus.si/" target="_blank">Abakus Plus d.o.o.</a>, and <a href="https://twitter.com/PeterRaganitsch" target="_blank">Peter Raganitsch</a> from <a href="https://www.tryfoexnow.com/" target="_blank">FOEX Gmbh</a>.&nbsp; As Peter told me, they are not organizing this conference for commercial purposes.&nbsp; Instead, their primary goal is to bring a high-quality dedicated APEX conference to a region where there is significant demand.&nbsp; And they've developed a 100% APEX Conference -&nbsp;everyone and everything is driven by <a href="https://apex.oracle.com/" target="_blank">Oracle APEX</a>:&nbsp; the conference Web site, abstract submission, abstract voting, the back-end administration apps, everything.&nbsp; The conference is already a great testament of what is possible with the <a href="https://www.oracle.com/database/index.html" target="_blank">Oracle Database</a> &amp; <a href="https://apex.oracle.com/" target="_blank">Oracle APEX</a>.<br /><br />While the location primarily caters to Austria, Slovenia and Croatia, the appeal stretches far beyond the immediate region.&nbsp; As you can see in the map below, Graz is a short 500 miles (1.5 hour flight) from many places in central Europe.&nbsp; And even though it may be a bit longer to travel for those outside the circle, I'm hoping that this conference will attract many of our other customers and partners from Eastern Europe and the Middle East.&nbsp; Tickets have already been sold to conference attendees from Austria, Czech Republic, Germany, United Kingdom, Croatia, Macedonia, Russia, Slovenia, and the USA.&nbsp; If you want an easy way to get connected and immersed into the global APEX community, please attend&nbsp;<a href="https://aaapeks.info/" target="_blank">APEX Alpe Adria</a>.&nbsp; It's that simple.<br /><br /><a href="https://twitter.com/patrickwolf" target="_blank">Patrick Wolf</a> &amp; <a href="https://twitter.com/chrisneumueller" target="_blank">Christian Neumueller</a> from the <a href="https://apex.oracle.com/" target="_blank">Oracle APEX</a> Development team will be joining me to kick off this inaugural conference and show our support for this growing APEX community.&nbsp; We hope to see you there!<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-gucQxBQ3rXI/Wn9IqQgG5ZI/AAAAAAAADoI/Hw7TkpVi17070M8gSoj0LaEWZHKtBaw4gCLcBGAs/s1600/apex_alpe_adria_2018_map.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1217" data-original-width="1600" height="486" src="https://4.bp.blogspot.com/-gucQxBQ3rXI/Wn9IqQgG5ZI/AAAAAAAADoI/Hw7TkpVi17070M8gSoj0LaEWZHKtBaw4gCLcBGAs/s640/apex_alpe_adria_2018_map.png" width="640" /></a></div><br /> Joel R. Kallman tag:blogger.com,1999:blog-12214002.post-5672615738504536501 Sat Feb 10 2018 14:47:00 GMT-0500 (EST) Pivot Table plugin for APEX (Updated) http://ora-00001.blogspot.com/2018/02/pivot-table-plugin-for-apex-updated.html Some years ago I created an APEX region plugin for displaying the results of a query as a Pivot Table. <a href="https://ora-00001.blogspot.com/2013/10/pivot-table-plugin-for-apex.html">You can read the original blog post about that here.</a><br /><br />The plugin proved quite popular, but people were having problems using it with APEX 5 due to a jQuery versioning conflict.<br /><br />I've now updated the plugin so it works with APEX, both 5.0 and 5.1. <br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-lN5l4W4efK4/Wn8cFSstEJI/AAAAAAAABlc/1lsXVa34DbkiwKoFGBbEGh6ouTtk9BvPwCLcBGAs/s1600/Screen%2BShot%2B2018-02-10%2Bat%2B17.01.15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="636" data-original-width="1157" height="351" src="https://4.bp.blogspot.com/-lN5l4W4efK4/Wn8cFSstEJI/AAAAAAAABlc/1lsXVa34DbkiwKoFGBbEGh6ouTtk9BvPwCLcBGAs/s640/Screen%2BShot%2B2018-02-10%2Bat%2B17.01.15.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"></div><br />To use it, simply add a region to the page, change the region type to "Pivot Table" and write an SQL query as the region source:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-6houPrLpKG0/Wn8cFij-W4I/AAAAAAAABlg/MSz2DmirRwsFhcIrPALlQixUBC_SV_CfwCEwYBhgL/s1600/Screen%2BShot%2B2018-02-10%2Bat%2B17.01.52.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="360" data-original-width="296" src="https://4.bp.blogspot.com/-6houPrLpKG0/Wn8cFij-W4I/AAAAAAAABlg/MSz2DmirRwsFhcIrPALlQixUBC_SV_CfwCEwYBhgL/s1600/Screen%2BShot%2B2018-02-10%2Bat%2B17.01.52.png" /></a></div><br /><br />On the region attributes page, specify the options. I've added some help text to explain the various options. Note that you can have more than one Pivot Table region on the same page, but be sure to use a unique name in the "DOM Element Name" attribute for each pivot table.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-K4FsWeNOT_c/Wn8cFq33ojI/AAAAAAAABlk/doqI5k4GuTsLQYqSt60o23sBau8aS_uxACEwYBhgL/s1600/Screen%2BShot%2B2018-02-10%2Bat%2B17.03.00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="380" data-original-width="922" height="262" src="https://1.bp.blogspot.com/-K4FsWeNOT_c/Wn8cFq33ojI/AAAAAAAABlk/doqI5k4GuTsLQYqSt60o23sBau8aS_uxACEwYBhgL/s640/Screen%2BShot%2B2018-02-10%2Bat%2B17.03.00.png" width="640" /></a></div><br />I've also added/enabled some extra features such as spreadsheet export (via TSV - tab separated values) and charting.<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-SID0vtfydw8/Wn8dm7hp2iI/AAAAAAAABl4/0Xka8Aq_ejYmjBHlerP6ofdFQTwLAcCNQCLcBGAs/s1600/Screen%2BShot%2B2018-02-10%2Bat%2B17.27.25.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="635" data-original-width="1186" height="342" src="https://4.bp.blogspot.com/-SID0vtfydw8/Wn8dm7hp2iI/AAAAAAAABl4/0Xka8Aq_ejYmjBHlerP6ofdFQTwLAcCNQCLcBGAs/s640/Screen%2BShot%2B2018-02-10%2Bat%2B17.27.25.png" width="640" /></a></div><br /><br />It should be noted that the plugin is just an APEX wrapper for the <a href="https://github.com/nicolaskruchten/pivottable">Javascript Pivot Table component by Nicolas Kruchten</a> who did all the hard work. I merely packaged it up for use with APEX.<br /><br />You can download the plugin from <a href="https://github.com/mortenbra/apex-plugins">my APEX plugins page</a>. Enjoy! :-)<br /><br /><br /><br /> Morten Braten tag:blogger.com,1999:blog-5215551487816981140.post-5926376180975814452 Sat Feb 10 2018 11:33:00 GMT-0500 (EST) That's a Classic Report? Really? https://blogs.oracle.com/apex/thats-a-classic-report-really <p style="text-align: justify;">As an APEX developer, thinking about reports, the following picture comes to mind ... the typical, tabular layout of data.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/b9b7b23bf11a9d47a01f885884e734b7/bildschirmfoto_2018_02_09_um_15_16_45.png" style="width: 1822px; height: 1304px;" /></p> <p style="text-align: justify;">But Classic Reports can do more - these are, for sure, one of the most versatile components in Application Express. The reason is that classic reports are template-driven. Developers can create own report templates and visualize data however wanted.</p> <p style="text-align: justify;">But Application Express also provides a few classic report templates - out of the box. These allow data visualizations, which make it hard to believe that there is an APEX classic report behind this.</p> <p style="text-align: justify;">In this posting, we&#39;ll give an overview of the alternative report templates provided with Application Express. A lot of information comes from the&nbsp;<strong>Universal Theme Sample Application</strong>&nbsp;(<a href="http://apex.oracle.com/ut" target="_blank">apex.oracle.com/ut</a>) - there you&#39;ll find even more information on the Look &amp; Feel variants of APEX components.&nbsp;</p> <p style="text-align: justify;">Now let&#39;s get started with the first alternative classic report template. In Page Designer, navigate to your report based on the EMP table, open the <strong>Report Attributes&nbsp;</strong>property pane and look up the <strong>Appearance</strong>&nbsp;section.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/999e9f2ffbf7c450d5fc25d39753d7b1/bildschirmfoto_2018_02_09_um_15_20_39.png" style="width: 2800px; height: 1120px;" /></p> <p style="text-align: justify;">Start with the&nbsp;<strong>Media List</strong>&nbsp;template; save your change and re-run the page.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/928f855d5be25c73a19e1a80fc03420b/bildschirmfoto_2018_02_09_um_15_22_42.png" style="width: 1516px; height: 780px;" /></p> <p style="text-align: justify;">Well ... that&#39;s not what we wanted. But it&#39;s obvious what happened: the report template expects specific result columns from the SQL query. We can see that even better when looking into the template definition. You&#39;ll get there by clicking the &gt; button right to the Report Template select list. Within the HTML markup, placeholders like&nbsp;&nbsp;<strong>#ICON_CLASS#</strong>&nbsp;or&nbsp;<strong>#LIST_TITLE#</strong>&nbsp;are easy to find. The report SQL query can (but not has to) provide a value for each placeholder.</p> <p style="text-align: justify;"><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/a1e1b94c8cd176ebf6f2287a75360178/bildschirmfoto_2018_02_09_um_15_25_14.png" style="width: 1852px; height: 704px;" />So, we&#39;ll adjust the SQL query as follows. Alias names will give us the column names the template expects.</p> select ename as list_title, job as list_text, &#39;fa fa-user&#39; as icon_class, null as edit_link, sal as list_badge from emp <p style="text-align: justify;">Save and run the page again ...&nbsp;</p> <p style="text-align: justify;"><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/3d81154762b30e47ca30a1e01a8cb7aa/bildschirmfoto_2018_02_09_um_15_29_48.png" style="width: 1442px; height: 908px;" />Looks better, doesn&#39;t it? But there is more - the Media List template provides a few <strong>Template Options</strong>. Access these in Page Designer by clicking the <strong>Template Options</strong> button below the Report Template select list. A dialog, similar to the following, will open.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/1a7f42c4f7d5aa6733a2e419d65c243e/bildschirmfoto_2018_02_09_um_15_31_51.png" style="width: 1074px; height: 522px;" /></p> <p style="text-align: justify;">Activate&nbsp;<strong>Show Badges a</strong>nd&nbsp;<strong>Apply Theme Colors</strong>, save the changes and run the page again ...</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/af0a025e353f9fbdc0e38a9d69529673/bildschirmfoto_2018_02_09_um_15_33_03.png" style="width: 816px; height: 812px;" /></p> <p style="text-align: justify;">Just a tiny change to the SQL query, a few mouse clicks - and we have a completely different data visualization. You can use the same process or all other report templates provided by Application Express.</p> <p style="text-align: justify;">Let&#39;s move on to the&nbsp;<strong>Comments</strong>&nbsp;template. First, adjust the SQL query (the EMP table data is not well suited for that template, but is sufficient to act as example) ...</p> select ename as user_name, &#39;My comment is: &#39; || job as comment_text, hiredate as comment_date, null as user_icon, &#39;Comment&#39; as actions, &#39; &#39; as attribute_1, sal as attribute_2, &#39; &#39; as attribute_3, &#39; &#39; as attribute_4 from emp <p style="text-align: justify;">And have a look at the result page:</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/6b5b3922bd3a21f5e9d72ec5d0e8f09e/bildschirmfoto_2018_02_09_um_15_44_56.png" style="width: 1352px; height: 972px;" /></p> <p style="text-align: justify;">For the&nbsp;<strong>Alert</strong>&nbsp;template, not only the placeholder names are important - the value for the <strong>#ALERT_TYPE#</strong> placeholder is particularly interesting - here&#39;s the SQL query.</p> select ename as alert_title, job as alert_desc, sal as alert_action, case when sal &lt; 1000 then &#39;info&#39; when sal between 2000 and 3000 then &#39;success&#39; when sal between 3000 and 4000 then &#39;warning&#39; else &#39;danger&#39; end as alert_type from emp <p style="text-align: justify;">And here&#39;s the result. A report row just contains the three values&nbsp;&nbsp;<strong>title</strong>,&nbsp;<strong>desc</strong>&nbsp;and&nbsp;<strong>action</strong>. However, the value of the <strong>alert_type </strong>column controls the row color and icon - It&#39;s good to know the keywords <strong>info</strong>,&nbsp;<strong>success</strong>,&nbsp;<b>warning</b>&nbsp;and&nbsp;<strong>danger</strong>. These follow the semantics of the Application Express&nbsp;<strong>Alert&nbsp;</strong>region type.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/c2f334eb202148ad17f7eaf4ad9d6289/bildschirmfoto_2018_02_09_um_15_52_05.png" style="width: 2482px; height: 1254px;" /></p> <p style="text-align: justify;">The&nbsp;<strong>Badge List</strong>&nbsp;template is well suited when your SQL query returns only one row. To display multiple rows, it&#39;s not recommended. In this case, the SQL query result column names will directly display in the report output. Here&#39;s an example: First (again) the SQL query:</p> select empno, ename, extract(year from hiredate) as hired, sal, comm, deptno from emp where rownum = 1 <p style="text-align: justify;">The query does not use any special placeholders - column names can be arbitrary.&nbsp; As the result page shows, the template directly displays the column names. This is a good candidate to visualize key-value pairs - but the SQL query must return one row.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/ad85651147e1c1d80b9a31171e6c5e86/bildschirmfoto_2018_02_09_um_15_59_46.png" /></p> <p style="text-align: justify;">The <strong>Timeline</strong>&nbsp;template specializes (as the name indicates) on displaying subsequent events.</p> select apex_string.get_initials(ename) as user_avatar, ename as user_name, hiredate as event_date, &#39;fa fa-user&#39; as event_icon, case deptno when 10 then &#39;is-new&#39; when 20 then &#39;is-removed&#39; when 30 then &#39;is-updated&#39; when 40 then &#39;is-updated&#39; end as event_status, &#39;Hired&#39; as event_type, job as event_title, sal || case when comm is not null then &#39; - &#39; end || comm as event_desc from emp <p style="text-align: justify;">Here is the result page - we can see that this template supports many placeholders and therefore many display options.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/f2b6708a0d8316f4fcc7188d555a3f31/bildschirmfoto_2018_02_09_um_16_17_24.png" style="width: 1726px; height: 1080px;" /></p> <p style="text-align: justify;"><strong>Search Results</strong>&nbsp;provides the typical search engine look &amp; feel. So it&#39;s very useful in combination with search functionality. The following SQL query is a (simple) example for that. It filters rows based on user inputs on the <b>P10_SEARCH</b>&nbsp;item.</p> select ename search_title, job search_desc, null search_link, &#39;Sal&#39; label_01, sal value_01, &#39;Hiredate&#39; label_02, hiredate value_02, &#39;Comm&#39; label_03, comm value_03, &#39;Deptno&#39; label_04, deptno value_04 from emp where instr(ename||job, :P10_SEARCH)&gt;0 or :P10_SEARCH is null <p style="text-align: justify;">Of course, that query is not a blueprint for searching on huge amounts of data. The database provides other means of search and filtering in these cases - one example is Oracle Text - but that is a topic for a different blog posting.</p> <p style="text-align: justify;">A report using the Search Results template will typically look as follows:</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/56e3d3402a4d870ab23160cbe05603d9/bildschirmfoto_2018_02_09_um_16_39_03.png" style="width: 1712px; height: 1232px;" /></p> <p style="text-align: justify;">Last, but not least, we&#39;ll have a look at the <strong>Cards</strong>&nbsp;template. On the internet, you&#39;ll frequently find that kind of data visualization. And with the cards template, it becomes more than easy to apply that look &amp; feel to your table data. First, as always, the SQL query ...</p> select ename card_title, apex_string.get_initials(ename) card_initials, job card_text, hiredate card_subtext, &#39;f?p=...&#39; card_link from emp <p style="text-align: justify;">... and then the result:</p> <p style="text-align: justify;"><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/f0ec53fe4487edf1cd272ff52174b01b/bildschirmfoto_2018_02_09_um_16_52_29.png" style="width: 2462px; height: 1190px;" />The&nbsp;<strong>Cards</strong>&nbsp;template offers a few Template Options an. With these, we can have the cards display either initials or icons - we can have colored cards, control card sizes and how much cards to display in a row. After changing some of the Template Options, the report looks like this:</p> <p style="text-align: justify;"><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/b9fa5dc175bfc0464bac0cb3144e3f7a/bildschirmfoto_2018_02_09_um_16_54_30.png" style="width: 2482px; height: 1604px;" />As this brief overview on the alternative Classic Report templates illustrates - it&#39;s so easy to visualize data in a different look &amp; feel.&nbsp; HTML or CSS knowledge is not required; the only thing a developer has to do, is to adjust the SQL query and the Template Options.</p> <p style="text-align: justify;">Try it out - today!</p> <p><a href="http://blogs.oracle.com/apex">Back to blogs.oracle.com/apex</a></p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> Carsten Czarski https://blogs.oracle.com/apex/thats-a-classic-report-really Fri Feb 09 2018 11:46:22 GMT-0500 (EST) That's a Classic Report? Really? https://blogs.oracle.com/apex/thats-a-classic-report-really <p style="text-align: justify;">As an APEX developer, thinking about reports, the following picture comes to mind ... the typical, tabular layout of data.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/b9b7b23bf11a9d47a01f885884e734b7/bildschirmfoto_2018_02_09_um_15_16_45.png" style="width: 1822px; height: 1304px;" /></p> <p style="text-align: justify;">But Classic Reports can do more - these are, for sure, one of the most versatile components in Application Express. The reason is that classic reports are template-driven. Developers can create own report templates and visualize data however wanted.</p> <p style="text-align: justify;">But Application Express also provides a few classic report templates - out of the box. These allow data visualizations, which make it hard to believe that there is an APEX classic report behind this.</p> <p style="text-align: justify;">In this posting, we&#39;ll give an overview of the alternative report templates provided with Application Express. A lot of information comes from the&nbsp;<strong>Universal Theme Sample Application</strong>&nbsp;(<a href="http://apex.oracle.com/ut" target="_blank">apex.oracle.com/ut</a>) - there you&#39;ll find even more information on the Look &amp; Feel variants of APEX components.&nbsp;</p> <p style="text-align: justify;">Now let&#39;s get started with the first alternative classic report template. In Page Designer, navigate to your report based on the EMP table, open the <strong>Report Attributes&nbsp;</strong>property pane and look up the <strong>Appearance</strong>&nbsp;section.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/999e9f2ffbf7c450d5fc25d39753d7b1/bildschirmfoto_2018_02_09_um_15_20_39.png" style="width: 2800px; height: 1120px;" /></p> <p style="text-align: justify;">Start with the&nbsp;<strong>Media List</strong>&nbsp;template; save your change and re-run the page.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/928f855d5be25c73a19e1a80fc03420b/bildschirmfoto_2018_02_09_um_15_22_42.png" style="width: 1516px; height: 780px;" /></p> <p style="text-align: justify;">Well ... that&#39;s not what we wanted. But it&#39;s obvious what happened: the report template expects specific result columns from the SQL query. We can see that even better when looking into the template definition. You&#39;ll get there by clicking the &gt; button right to the Report Template select list. Within the HTML markup, placeholders like&nbsp;&nbsp;<strong>#ICON_CLASS#</strong>&nbsp;or&nbsp;<strong>#LIST_TITLE#</strong>&nbsp;are easy to find. The report SQL query can (but not has to) provide a value for each placeholder.</p> <p style="text-align: justify;"><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/a1e1b94c8cd176ebf6f2287a75360178/bildschirmfoto_2018_02_09_um_15_25_14.png" style="width: 1852px; height: 704px;" />So, we&#39;ll adjust the SQL query as follows. Alias names will give us the column names the template expects.</p> select ename as list_title, job as list_text, &#39;fa fa-user&#39; as icon_class, null as edit_link, sal as list_badge from emp <p style="text-align: justify;">Save and run the page again ...&nbsp;</p> <p style="text-align: justify;"><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/3d81154762b30e47ca30a1e01a8cb7aa/bildschirmfoto_2018_02_09_um_15_29_48.png" style="width: 1442px; height: 908px;" />Looks better, doesn&#39;t it? But there is more - the Media List template provides a few <strong>Template Options</strong>. Access these in Page Designer by clicking the <strong>Template Options</strong> button below the Report Template select list. A dialog, similar to the following, will open.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/1a7f42c4f7d5aa6733a2e419d65c243e/bildschirmfoto_2018_02_09_um_15_31_51.png" style="width: 1074px; height: 522px;" /></p> <p style="text-align: justify;">Activate&nbsp;<strong>Show Badges a</strong>nd&nbsp;<strong>Apply Theme Colors</strong>, save the changes and run the page again ...</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/af0a025e353f9fbdc0e38a9d69529673/bildschirmfoto_2018_02_09_um_15_33_03.png" style="width: 816px; height: 812px;" /></p> <p style="text-align: justify;">Just a tiny change to the SQL query, a few mouse clicks - and we have a completely different data visualization. You can use the same process or all other report templates provided by Application Express.</p> <p style="text-align: justify;">Let&#39;s move on to the&nbsp;<strong>Comments</strong>&nbsp;template. First, adjust the SQL query (the EMP table data is not well suited for that template, but is sufficient to act as example) ...</p> select ename as user_name, &#39;My comment is: &#39; || job as comment_text, hiredate as comment_date, null as user_icon, &#39;Comment&#39; as actions, &#39; &#39; as attribute_1, sal as attribute_2, &#39; &#39; as attribute_3, &#39; &#39; as attribute_4 from emp <p style="text-align: justify;">And have a look at the result page:</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/6b5b3922bd3a21f5e9d72ec5d0e8f09e/bildschirmfoto_2018_02_09_um_15_44_56.png" style="width: 1352px; height: 972px;" /></p> <p style="text-align: justify;">For the&nbsp;<strong>Alert</strong>&nbsp;template, not only the placeholder names are important - the value for the <strong>#ALERT_TYPE#</strong> placeholder is particularly interesting - here&#39;s the SQL query.</p> select ename as alert_title, job as alert_desc, sal as alert_action, case when sal &lt; 1000 then &#39;info&#39; when sal between 2000 and 3000 then &#39;success&#39; when sal between 3000 and 4000 then &#39;warning&#39; else &#39;danger&#39; end as alert_type from emp <p style="text-align: justify;">And here&#39;s the result. A report row just contains the three values&nbsp;&nbsp;<strong>title</strong>,&nbsp;<strong>desc</strong>&nbsp;and&nbsp;<strong>action</strong>. However, the value of the <strong>alert_type </strong>column controls the row color and icon - It&#39;s good to know the keywords <strong>info</strong>,&nbsp;<strong>success</strong>,&nbsp;<b>warning</b>&nbsp;and&nbsp;<strong>danger</strong>. These follow the semantics of the Application Express&nbsp;<strong>Alert&nbsp;</strong>region type.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/c2f334eb202148ad17f7eaf4ad9d6289/bildschirmfoto_2018_02_09_um_15_52_05.png" style="width: 2482px; height: 1254px;" /></p> <p style="text-align: justify;">The&nbsp;<strong>Badge List</strong>&nbsp;template is well suited when your SQL query returns only one row. To display multiple rows, it&#39;s not recommended. In this case, the SQL query result column names will directly display in the report output. Here&#39;s an example: First (again) the SQL query:</p> select empno, ename, extract(year from hiredate) as hired, sal, comm, deptno from emp where rownum = 1 <p style="text-align: justify;">The query does not use any special placeholders - column names can be arbitrary.&nbsp; As the result page shows, the template directly displays the column names. This is a good candidate to visualize key-value pairs - but the SQL query must return one row.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/ad85651147e1c1d80b9a31171e6c5e86/bildschirmfoto_2018_02_09_um_15_59_46.png" /></p> <p style="text-align: justify;">The <strong>Timeline</strong>&nbsp;template specializes (as the name indicates) on displaying subsequent events.</p> select apex_string.get_initials(ename) as user_avatar, ename as user_name, hiredate as event_date, &#39;fa fa-user&#39; as event_icon, case deptno when 10 then &#39;is-new&#39; when 20 then &#39;is-removed&#39; when 30 then &#39;is-updated&#39; when 40 then &#39;is-updated&#39; end as event_status, &#39;Hired&#39; as event_type, job as event_title, sal || case when comm is not null then &#39; - &#39; end || comm as event_desc from emp <p style="text-align: justify;">Here is the result page - we can see that this template supports many placeholders and therefore many display options.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/f2b6708a0d8316f4fcc7188d555a3f31/bildschirmfoto_2018_02_09_um_16_17_24.png" style="width: 1726px; height: 1080px;" /></p> <p style="text-align: justify;"><strong>Search Results</strong>&nbsp;provides the typical search engine look &amp; feel. So it&#39;s very useful in combination with search functionality. The following SQL query is a (simple) example for that. It filters rows based on user inputs on the <b>P10_SEARCH</b>&nbsp;item.</p> select ename search_title, job search_desc, null search_link, &#39;Sal&#39; label_01, sal value_01, &#39;Hiredate&#39; label_02, hiredate value_02, &#39;Comm&#39; label_03, comm value_03, &#39;Deptno&#39; label_04, deptno value_04 from emp where instr(ename||job, :P10_SEARCH)&gt;0 or :P10_SEARCH is null <p style="text-align: justify;">Of course, that query is not a blueprint for searching on huge amounts of data. The database provides other means of search and filtering in these cases - one example is Oracle Text - but that is a topic for a different blog posting.</p> <p style="text-align: justify;">A report using the Search Results template will typically look as follows:</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/56e3d3402a4d870ab23160cbe05603d9/bildschirmfoto_2018_02_09_um_16_39_03.png" style="width: 1712px; height: 1232px;" /></p> <p style="text-align: justify;">Last, but not least, we&#39;ll have a look at the <strong>Cards</strong>&nbsp;template. On the internet, you&#39;ll frequently find that kind of data visualization. And with the cards template, it becomes more than easy to apply that look &amp; feel to your table data. First, as always, the SQL query ...</p> select ename card_title, apex_string.get_initials(ename) card_initials, job card_text, hiredate card_subtext, &#39;f?p=...&#39; card_link from emp <p style="text-align: justify;">... and then the result:</p> <p style="text-align: justify;"><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/f0ec53fe4487edf1cd272ff52174b01b/bildschirmfoto_2018_02_09_um_16_52_29.png" style="width: 2462px; height: 1190px;" />The&nbsp;<strong>Cards</strong>&nbsp;template offers a few Template Options an. With these, we can have the cards display either initials or icons - we can have colored cards, control card sizes and how much cards to display in a row. After changing some of the Template Options, the report looks like this:</p> <p style="text-align: justify;"><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/b9fa5dc175bfc0464bac0cb3144e3f7a/bildschirmfoto_2018_02_09_um_16_54_30.png" style="width: 2482px; height: 1604px;" />As this brief overview on the alternative Classic Report templates illustrates - it&#39;s so easy to visualize data in a different look &amp; feel.&nbsp; HTML or CSS knowledge is not required; the only thing a developer has to do, is to adjust the SQL query and the Template Options.</p> <p style="text-align: justify;">Try it out - today!</p> <p><a href="http://blogs.oracle.com/apex">Back to blogs.oracle.com/apex</a></p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> Carsten Czarski https://blogs.oracle.com/apex/thats-a-classic-report-really Fri Feb 09 2018 11:46:22 GMT-0500 (EST) Classic Reports einmal anders - mit Report Templates https://blogs.oracle.com/apexcommunity_deutsch/classic-report-einmal-anders <p style="text-align: justify;">Denkt man als APEX-Entwickler an einen Bericht, so hat man meist die typische, tabellarische Darstellung vor Augen.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/b9b7b23bf11a9d47a01f885884e734b7/bildschirmfoto_2018_02_09_um_15_16_45.png" style="width: 1822px; height: 1304px;" /></p> <p style="text-align: justify;">Aber das geht auch anders. Der Classic Report ist sicherlich eine der vielseitigsten Komponenten in Application Express. Der Grund daf&uuml;r ist, dass die Report-Darstellung komplett templategetrieben ist. Man kann eigene Templates erstellen, aber auch aus den von Application Express bereits mitgelieferten w&auml;hlen. Dieses Posting gibt einen kleinen &Uuml;berblick &uuml;ber diese Templates - einiges davon ist aus der <strong>Universal Theme Sample Application</strong> (<a href="http://apex.oracle.com/ut" target="_blank">apex.oracle.com/ut</a>) entnommen - dort finden Sie noch mehr Beispiele und Informationen zum Look &amp;&nbsp; Feel von APEX-Komponenten.</p> <p style="text-align: justify;">Starten Sie mit dem ersten Berichts-Template. Navigieren Sie dazu, im Page Designer, zu den Berichtsattributen Ihres Berichts, und dann zum Abschnitt&nbsp;<strong>Appearance</strong>.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/999e9f2ffbf7c450d5fc25d39753d7b1/bildschirmfoto_2018_02_09_um_15_20_39.png" style="width: 2800px; height: 1120px;" /></p> <p style="text-align: justify;">W&auml;hlen Sie beispielsweise das Template&nbsp;<strong>Media List</strong>&nbsp;aus, speichern Sie die &Auml;nderung ab und starten Sie die Seite neu.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/928f855d5be25c73a19e1a80fc03420b/bildschirmfoto_2018_02_09_um_15_22_42.png" style="width: 1516px; height: 780px;" /></p> <p style="text-align: justify;">Das ist noch nicht wirklich das gew&uuml;nschte Ergebnis - man sieht deutlich, dass das Template ganz bestimmte Ergebnisspalten von der SQL-Abfrage erwartet. Noch genauer sieht man das, wenn man in die Template-Definition hineinsieht. Diese erreichen Sie &uuml;brigens bequem mit dem Klick auf die Schaltfl&auml;che &gt; rechts neben der Auswahlliste f&uuml;r das Berichtstemplate. Platzhalter wie <strong>#ICON_CLASS#</strong> oder <strong>#LIST_TITLE#</strong> sind leicht zu erkennen.</p> <p style="text-align: justify;"><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/a1e1b94c8cd176ebf6f2287a75360178/bildschirmfoto_2018_02_09_um_15_25_14.png" style="width: 1852px; height: 704px;" />Mit diesen Informationen kann die SQL-Abfrage nun angepasst werden.</p> select ename as list_title, job as list_text, &#39;fa fa-user&#39; as icon_class, null as edit_link, sal as list_badge from emp <p style="text-align: justify;">Starten Sie die Seite nach dem Speichern nochmals ...&nbsp;</p> <p style="text-align: justify;"><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/3d81154762b30e47ca30a1e01a8cb7aa/bildschirmfoto_2018_02_09_um_15_29_48.png" style="width: 1442px; height: 908px;" />Das sieht schon besser aus. Allerdings sind zum Template noch Template Options verf&uuml;gbar. Diese werden wiederum im Page Designer eingerichtet, indem Sie auf die Schaltfl&auml;che rechts von&nbsp;<strong>Template Options&nbsp;</strong>klicken.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/1a7f42c4f7d5aa6733a2e419d65c243e/bildschirmfoto_2018_02_09_um_15_31_51.png" style="width: 1074px; height: 522px;" /></p> <p style="text-align: justify;">Aktivieren Sie&nbsp;<strong>Show Badges&nbsp;</strong>und&nbsp;<strong>Apply Theme Colors</strong>, speichern Sie, und starten Sie die Seite danach nochmals.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/af0a025e353f9fbdc0e38a9d69529673/bildschirmfoto_2018_02_09_um_15_33_03.png" style="width: 816px; height: 812px;" /></p> <p style="text-align: justify;">Nur eine kleine &Auml;nderung an der SQL-Abfrage - und wenige Mausklicks - und schon haben Sie eine v&ouml;llig andere Visualisierung Ihrer Daten. Das funktioniert mit den anderen Berichts-Templates analog ...</p> <p style="text-align: justify;">Hier ein Beispiel for das Berichtstemplate&nbsp;<strong>Comments</strong>&nbsp;... zun&auml;chst die SQL-Abfrage (die Daten der Tabelle EMP sind nicht sehr gut f&uuml;r dieses Template geeignet, als Beispiel reicht es jedoch aus).</p> select ename as user_name, &#39;My comment is: &#39; || job as comment_text, hiredate as comment_date, null as user_icon, &#39;Comment&#39; as actions, &#39; &#39; as attribute_1, sal as attribute_2, &#39; &#39; as attribute_3, &#39; &#39; as attribute_4 from emp <p style="text-align: justify;">Das Ergebnis sieht dann wie folgt aus.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/6b5b3922bd3a21f5e9d72ec5d0e8f09e/bildschirmfoto_2018_02_09_um_15_44_56.png" style="width: 1352px; height: 972px;" /></p> <p style="text-align: justify;">Beim Template&nbsp;<strong>Alert</strong>&nbsp;kommt es nicht nur auf die Platzhalter an, sondern vor allem auf den Inhalt des Platzhalters <strong>#ALERT_TYPE#</strong>. Zun&auml;chst die SQL-Abfrage ...</p> select ename as alert_title, job as alert_desc, sal as alert_action, case when sal &lt; 1000 then &#39;info&#39; when sal between 2000 and 3000 then &#39;success&#39; when sal between 3000 and 4000 then &#39;warning&#39; else &#39;danger&#39; end as alert_type from emp <p style="text-align: justify;">Das Ergebnis sieht dann wie folgt aus - eine &quot;Berichtszeile&quot; enth&auml;lt tats&auml;chlich nur die drei Attribute&nbsp;<strong>title</strong>,&nbsp;<strong>desc</strong>&nbsp;und&nbsp;<strong>action</strong>. Das Aussehen wird vor allem von der Spalte&nbsp;<strong>alert_type&nbsp;</strong>gesteuert - und hier ist es wichtig, die Schl&uuml;sselworte&nbsp;<strong>info</strong>,&nbsp;<strong>success</strong>, <b>warning</b>&nbsp;und&nbsp;<strong>danger&nbsp;</strong>zu kennen. Das Ergebnis sieht wie folgt aus.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/c2f334eb202148ad17f7eaf4ad9d6289/bildschirmfoto_2018_02_09_um_15_52_05.png" style="width: 2482px; height: 1254px;" /></p> <p style="text-align: justify;">Das Template <strong>Badge List</strong> eignet sich gut, wenn der Report nur aus einer Zeile besteht.Liefert die SQL-Abfrage mehrere Zeilen zur&uuml;ck, ist es nicht so gut geeignet. Die Spaltennamen der SQL-Abfrage gehen hier direkt in die Darstellung ein. Am Beispiel ...</p> select empno, ename, extract(year from hiredate) as hired, sal, comm, deptno from emp where rownum = 1 <p style="text-align: justify;">Man sieht, dass hier keine besonderen Platzhalter verwendet werden - die Spaltennamen k&ouml;nnen beliebig sein. Das Template stellt diese, wie folgt, direkt dar.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/ad85651147e1c1d80b9a31171e6c5e86/bildschirmfoto_2018_02_09_um_15_59_46.png" /></p> <p style="text-align: justify;">Das Timeline Template eignet sich gut zur Darstellung zeitlich hintereinander liegender Vorg&auml;nge ...</p> select apex_string.get_initials(ename) as user_avatar, ename as user_name, hiredate as event_date, &#39;fa fa-user&#39; as event_icon, case deptno when 10 then &#39;is-new&#39; when 20 then &#39;is-removed&#39; when 30 then &#39;is-updated&#39; when 40 then &#39;is-updated&#39; end as event_status, &#39;Hired&#39; as event_type, job as event_title, sal || case when comm is not null then &#39; - &#39; end || comm as event_desc from emp <p style="text-align: justify;">Das Ergebnis sieht wie folgt aus - an der Query ist schon erkennbar, dass das Template recht viele Spalten und damit viele Darstellungsoptionen unterst&uuml;tzt.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/f2b6708a0d8316f4fcc7188d555a3f31/bildschirmfoto_2018_02_09_um_16_17_24.png" style="width: 1726px; height: 1080px;" /></p> <p style="text-align: justify;">Das Template Search Results eignet sich sehr gut im Zusammenspiel mit einem Suchfeld. Die folgende SQL-Abfrage liefert Spalten f&uuml;r dieses Template zur&uuml;ck.</p> select ename search_title, job search_desc, null search_link, &#39;Sal&#39; label_01, sal value_01, &#39;Hiredate&#39; label_02, hiredate value_02, &#39;Comm&#39; label_03, comm value_03, &#39;Deptno&#39; label_04, deptno value_04 from emp where instr(ename||job, :P10_SEARCH)&gt;0 or :P10_SEARCH is null <p style="text-align: justify;">Nat&uuml;rlich wird diese Abfrage bei gro&szlig;en Datenmengen langsam sein; hier k&ouml;nnte bspw. Oracle Text als Suchtechnologie in Betracht kommen. Das Ergebnis wird in etwa wie folgt aussehen.</p> <p><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/56e3d3402a4d870ab23160cbe05603d9/bildschirmfoto_2018_02_09_um_16_39_03.png" style="width: 1712px; height: 1232px;" /></p> <p style="text-align: justify;">Zum Abschluss sei das Template Cards erw&auml;hnt. Die Art der Darstellung findet man recht oft im Internet - und mit diesem Template wird es wirklich einfach, Tabellendaten auf die gleiche Art und Weise zu visualisieren ...</p> <p style="text-align: justify;">Zun&auml;chst zur SQL-Abfrage ...</p> select ename card_title, apex_string.get_initials(ename) card_initials, job card_text, hiredate card_subtext, &#39;f?p=...&#39; card_link from emp <p style="text-align: justify;">Das Ergebnis sieht zun&auml;chst so aus ...</p> <p style="text-align: justify;"><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/f0ec53fe4487edf1cd272ff52174b01b/bildschirmfoto_2018_02_09_um_16_52_29.png" style="width: 2462px; height: 1190px;" />Das Template&nbsp;<strong>Cards</strong>&nbsp;bietet viele Template Options an. So lassen sich Icons oder Initialen f&uuml;r eine Karte einschalten; man kann die Karten in den Farben des Theme darstellen und steuern, wieviele Karten pro Zeile dargestellt werden sollen.</p> <p style="text-align: justify;"><img alt="" src="https://cdn.app.compendium.com/uploads/user/e7c690e8-6ff9-102a-ac6d-e4aebca50425/fbd61610-2cfe-4a98-b117-958129af0c39/Image/b9fa5dc175bfc0464bac0cb3144e3f7a/bildschirmfoto_2018_02_09_um_16_54_30.png" style="width: 2482px; height: 1604px;" />Man sieht sehr sch&ouml;n, dass man das Aussehen eines klassischen Berichts sehr sch&ouml;n steuern kann - und das ganz ohne HTML- und CSS-Kenntnisse - es reicht aus, die SQL-Abfrage so anzupassen, dass das Berichts-Template mit den richtigen Ergebnisspalten versorgt wird. Probieren Sie es einfach mal aus.</p> <p><a href="http://blogs.oracle.com/apexcommunity_deutsch">Zur&uuml;ck zur Community-Seite</a></p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> Carsten Czarski https://blogs.oracle.com/apexcommunity_deutsch/classic-report-einmal-anders Fri Feb 09 2018 11:01:00 GMT-0500 (EST) Translating User Agent Strings http://www.oracle-and-apex.com/translating-user-agent-strings/ <p>For the <a href="http://www.oracle-and-apex.com/webserver-logfile-analysis-with-oracle-apex/">Analyse Webserver Logfile Application (AWL)</a> I wanted to show better information instead of just the Useragent String, because they are a mess and contain confusing information.</p> <p>As an example look at this Useragent String: <strong>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36</strong></p> <p>I rather would want to show it like this: <strong>Chrome (59) OS X</strong></p> <p><span id="more-1430"></span></p> <p>There are various discussions and <a href="https://www.howtogeek.com/114937/htg-explains-whats-a-browser-user-agent/">blogposts</a> from more knowledgeable people out there, discussing UA and their misinformation. Due to missing regulatory those strings can&#8217;t be easily parsed with a regular expression.</p> <p>Therefor I was falling back to the second best option: invoking a webservice.</p> <p>After a little research I decided to go with a free webservice provided by <a href="http://www.useragentstring.com/">UserAgentString.com</a>, where you simply pass an URL encoded UA string.</p> <p>As you&#8217;ve probably seen in my first blogpost for AWL I created a small datamodel to hold UA information in a separate table. That made it easy to set up a maintenance screen to edit the information and provide a more readable alias for it.</p> <p><img class="aligncenter size-full wp-image-1431" src="http://www.oracle-and-apex.com/blog/wp-content/uploads/Edit-UserAgent-Strings.png" alt="" width="1087" height="817" /></p> <p>Obviously I didn&#8217;t want to manually edit thousands of different UA&#8217;s and decided to invoke the webservice through a button click (see button &#8220;Parse User Agent&#8221; in above screenshot).</p> <p>Here is the Dynamic Action Code for &#8220;Execute PL/SQL Code&#8221; triggered by Button click.</p> <pre class="brush: sql"> BEGIN BEGIN FOR cUA IN ( SELECT ID , AGENT_TYPE , AGENT_NAME , AGENT_VERSION , OS_TYPE , OS_NAME , OS_VERSION_NAME , OS_VERSION_NUMBER , OS_PRODUCER , OS_PRODUCER_URL , LINUX_DISTRIBUTION , AGENT_LANGUAGE , AGENT_LANGUAGE_TAG FROM ( SELECT HTTPURITYPE(&#039;http://www.useragentstring.com/?uas=&#039;||utl_url.escape(USER_AGENT_STRING)||&#039;&amp;getJSON=all&#039;).getClob() AS UA_JSON , ID FROM AWL_USER_AGENT WHERE ROWNUM &lt; 100 AND AGENT_TYPE IS NULL ) , JSON_TABLE ( UA_JSON , &#039;$&#039; COLUMNS ( AGENT_TYPE VARCHAR2(2000) PATH &#039;$.agent_type&#039; , AGENT_NAME VARCHAR2(2000) PATH &#039;$.agent_name&#039; , AGENT_VERSION VARCHAR2(2000) PATH &#039;$.agent_version&#039; , OS_TYPE VARCHAR2(2000) PATH &#039;$.os_type&#039; , OS_NAME VARCHAR2(2000) PATH &#039;$.os_name&#039; , OS_VERSION_NAME VARCHAR2(2000) PATH &#039;$.os_versionName&#039; , OS_VERSION_NUMBER VARCHAR2(2000) PATH &#039;$.os_versionNumber&#039; , OS_PRODUCER VARCHAR2(2000) PATH &#039;$.os_producer&#039; , OS_PRODUCER_URL VARCHAR2(2000) PATH &#039;$.os_producerUrl&#039; , LINUX_DISTRIBUTION VARCHAR2(2000) PATH &#039;$.linux_distribution&#039; , AGENT_LANGUAGE VARCHAR2(2000) PATH &#039;$.agent_language&#039; , AGENT_LANGUAGE_TAG VARCHAR2(2000) PATH &#039;$.agent_languageTag&#039; ) ) ) LOOP UPDATE AWL_USER_AGENT SET AGENT_TYPE = cUA.AGENT_TYPE , AGENT_NAME = cUA.AGENT_NAME , AGENT_VERSION = cUA.AGENT_VERSION , OS_TYPE = cUA.OS_TYPE , OS_NAME = cUA.OS_NAME , OS_VERSION_NAME = cUA.OS_VERSION_NAME , OS_VERSION_NUMBER = cUA.OS_VERSION_NUMBER , OS_PRODUCER = cUA.OS_PRODUCER , OS_PRODUCER_URL = cUA.OS_PRODUCER_URL , LINUX_DISTRIBUTION = cUA.LINUX_DISTRIBUTION , AGENT_LANGUAGE = cUA.AGENT_LANGUAGE , AGENT_LANGUAGE_TAG = cUA.AGENT_LANGUAGE_TAG WHERE ID = cUA.ID ; END LOOP; EXCEPTION WHEN OTHERS THEN APEX_DEBUG.ERROR(Utl_Http.get_detailed_sqlcode || Utl_Http.Get_Detailed_Sqlerrm); APEX_DEBUG.ERROR(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); END; -- -- try to make it prettier to read the UA agent and construct an Alias (can be changed in admin section) UPDATE AWL_USER_AGENT SET ALIAS = SUBSTR(DECODE ( AGENT_TYPE , &#039;unknown&#039;, AGENT_TYPE||&#039; (&#039;||USER_AGENT_STRING||&#039;)&#039; , &#039;Crawler&#039;, AGENT_TYPE||&#039; (&#039;||AGENT_NAME||&#039;)&#039; , &#039;Browser&#039;, AGENT_NAME||&#039; (&#039;||REGEXP_REPLACE(AGENT_VERSION,&#039;(\d*)\.(\d*)(.*)&#039;,&#039;\1&#039;)||&#039;) &#039;||OS_NAME , USER_AGENT_STRING ),1,100) WHERE ALIAS IS NULL AND AGENT_TYPE IS NOT NULL ; END; </pre> <p>Let&#8217;s look at the sourcecode in a bit more detail to see whats what:</p> <ul> <li><strong>Line 18</strong> invokes the webservice through <a href="https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71718" rel="noopener" target="_blank">HTTPURITYPE</a>. The webservice itself returns data in JSON format, HTTPURITYPE passes this back as a CLOB</li> <li><strong>Line 18-22</strong> loops through our useragent table for the first 100 (99) unprocessed records</li> <li><strong>Line 24-39</strong> converts the JSON-CLOB to a <a href="https://docs.oracle.com/database/121/SQLRF/functions092.htm#SQLRF56973" rel="noopener" target="_blank">JSON_TABLE</a> which we can select from just as if it would be a regular database table</li> <li><strong>Line 44-57</strong> updates the useragent table with the received information</li> <li><strong>Line 67-76</strong> now calculates an alias out of the given information. The only reason why this is done outside of the loop is that it was added at a later time and is meant to process also older records</li> </ul> <p>Luckily the webservice is available through http, that means no certificate or wallet is needed.</p> <img src="http://www.oracle-and-apex.com/blog/?ak_action=api_record_view&id=1430&type=feed" alt="" /> Peter Raganitsch http://www.oracle-and-apex.com/?p=1430 Fri Feb 09 2018 07:10:54 GMT-0500 (EST) Oracle APEX - Show hide regions and items on large scale http://lschilde.blogspot.com/2018/02/show-hide-regions-and-items-on-large.html <div dir="ltr" style="text-align: left;" trbidi="on"><h2 class="MsoNormal" style="line-height: normal; text-align: justify;"><b><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 18.0pt;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">Show hide regions and items on large scale<span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"></span></span></span></b></h2><h2 class="MsoNormal" style="line-height: normal; text-align: justify;"><b><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 18.0pt;">&nbsp;</span></b></h2><h3 class="MsoNormal" style="line-height: normal; text-align: left;"><b><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 13.5pt;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">Using DA or JavaScript?</span></span></span></span></span></b></h3><h3 class="MsoNormal" style="line-height: normal; text-align: left;"></h3><h4 class="MsoNormal" style="line-height: normal; text-align: left;"><b><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 12.0pt;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><br /></span></span></span></span></b></h4><h4 class="MsoNormal" style="line-height: normal; text-align: left;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">Oracle APEX - handling hide and show methods with a catch</span></span></h4><br /><div style="text-align: justify;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Simple problem - Page with large number of items (527+ form fields for example :D) and depending on certain field you want to show some where the rest stay hidden.&nbsp;<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">&nbsp;</span></span></span></span></span></span></span></span><br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-bwsQzUDPrdM/Wn1EWyopyiI/AAAAAAAALso/CtCD-0wwAJsSx_CE1XdbavoEt40x95qUACLcBGAs/s1600/Capture.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1476" data-original-width="698" src="https://4.bp.blogspot.com/-bwsQzUDPrdM/Wn1EWyopyiI/AAAAAAAALso/CtCD-0wwAJsSx_CE1XdbavoEt40x95qUACLcBGAs/s1600/Capture.JPG" /></a></div><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Of course you could do this declarative way by using Dynamic actions where for you first hide all then for certain condition you show items. Only concern the more conditions you put in things become cumbersome. </span></span></span></span></span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">But issues that I came across came from the fact that my approach was for that reason different. Why? Because I was dealing with 527 items on the form where there were 37 different groups of items dictated by 1 form field so was looking into a way how to process most of show/hide behavior with less code.&nbsp;</span></span></span></span></span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">The example of code above is a demo one not the original form but concept and the problem stays the same. Lets say APEX_APP_ID contains 37 values where the rest columns 400+ of them fit in one of groups (sometimes in more than one so could not just group them easily in regions). Hopefully this describes the problem well. I used regions to group most of items together but still challenge was there.&nbsp;</span></span></span></span></span></span></span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><br /></span></span></span></span></span></span></span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><u>Task number 1. Hide all</u></span></span></span></span></span></span></span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><br /></span></span></span></span></span></span></span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Great way of doing this is by using CSS Classes attribute under your page item/region properties.</span></span></span></span></span></span></span></span><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-yUT17jAk3bY/Wn1lFIiTMiI/AAAAAAAALtE/RIxO3S9L758Pz1Ckf4mY13Qw6ZpZx9DBwCLcBGAs/s1600/Capture2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="511" data-original-width="565" height="361" src="https://4.bp.blogspot.com/-yUT17jAk3bY/Wn1lFIiTMiI/AAAAAAAALtE/RIxO3S9L758Pz1Ckf4mY13Qw6ZpZx9DBwCLcBGAs/s400/Capture2.JPG" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><br /></span></span></span></span></span></span></span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">&nbsp;Then all it comes down to is running once all elements have their class set:</span></span></span></span></span></span></span></span><br /><blockquote class="tr_bq"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">$( ".my_hide_all").hide();</span></span></span></span></span></span></span></span></span></blockquote><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Awesome - all items are now hidden. So simply have to show them when I want. Easy right? Well I thought so too before learning this lesson.&nbsp; </span></span></span></span></span></span></span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><br /></span></span></span></span></span></span></span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><u>Task 2. Show items</u></span></span></span></span></span></span></span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">I thought this should do the trick:</span></span></span></span></span></span></span></span><br /><blockquote class="tr_bq"><pre dir="ltr"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">apex.item( "P1_ITEM" ).show();</span></pre></blockquote><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">As you can image it did not work.<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"> The reason is because my class was set on a wrong level;&nbsp; so DOME row CSS still had display:none;&nbsp; set.</span></span></span></span></span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">In my above example solution was to use:&nbsp;</span></span></span></span></span></span></span></span><br /><blockquote class="tr_bq"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">&nbsp;$('#P1_ITEM').closest(".my_hide_all").show();</span></span></span></span></span></span></span></span></span></blockquote><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">This then worked fine. I admit did not see this coming.&nbsp;</span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Once I placed a CSS class on&nbsp;</span></span><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-RhMmOzwvV2w/Wn1vITYNSHI/AAAAAAAALtU/TLI-QkjP_FgZ6gkWKajsFR28Yq3eW5P5wCLcBGAs/s1600/Capture3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="757" data-original-width="891" height="338" src="https://3.bp.blogspot.com/-RhMmOzwvV2w/Wn1vITYNSHI/AAAAAAAALtU/TLI-QkjP_FgZ6gkWKajsFR28Yq3eW5P5wCLcBGAs/s400/Capture3.JPG" width="400" /></a></div><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">appearance section CSS Classes things were back as expected and I was able to show it using </span></span><br /><blockquote class="tr_bq"><pre dir="ltr"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">apex.item( "P1_ITEM" ).show();</span></pre></blockquote><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"></span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">On the other side if I used DA to first hide then to show an item (</span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">with True Action-&gt; Action Show</span></span>) worked like a char straight away. Well I guess lesson learned for today. :D</span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Happy APEXing,</span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Lino </span></span></div></div> SLino tag:blogger.com,1999:blog-8185384792158425670.post-4371598316866099261 Fri Feb 09 2018 04:26:00 GMT-0500 (EST) Usando el Context Menu y botones , click derecho en grid / right click on grid / oracle apex http://aflorestorres.blogspot.com/2018/02/usando-el-context-menu-y-botones-click.html Al usar click derecho muchas&nbsp;veces&nbsp;tenemos la necesidad de abrir un menu de opciones, el llamado ContextMenu, en este post veremos como capturar primero el click derecho y luego abriremos un menu personalizado, para crear dicho menu personalizado nos apoyaremos del <a href="http://hardlikesoftware.com/weblog/2015/07/13/apex-5-0-custom-menus/" target="_blank">Blog HardLikeSoftware .</a><br /><br />Podemos ver la demo en <a href="https://apex.oracle.com/pls/apex/f?p=32431:13:::NO:::" target="_blank">este link</a>, usando credenciales de demo/demo, subMenu ClickDerecho.<br /><br />Como primer paso necesitamos crear un grid, para esta demo utilizares un Interactive Report, y le asignaremos un id. Para efectos demostrativos veremos como capturar el click de dos formas, asi que creamos otro Interactive Report con un id distinto al primero.<br /><br />Interactive Report<br /><b>&nbsp;ID</b> :&nbsp;id_reporte<br /><br />Interactive Report 2<br /><b>&nbsp;ID </b>:&nbsp;id_reporte_2<br /><br />Luego capturaremos el evento del click derecho, para esto nos ubicamos en la seccion de<br /><b>&nbsp;"Function and Global Variable Declaration" </b>colocamos:<br /><br /><!-- HTML generated using hilite.me --><br /><div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"> $(<span style="color: #007020;">document</span>).on(<span style="background-color: #fff0f0;">'contextmenu'</span>,<span style="background-color: #fff0f0;">'#id_reporte tr td'</span>,<span style="color: #008800; font-weight: bold;">function</span>(ev){ <br /> $(<span style="background-color: #fff0f0;">"#MenuContext"</span>).menu( <span style="background-color: #fff0f0;">"toggle"</span>, ev.pageX, ev.pageY );<br /> ev.preventDefault(); <br /> <span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">false</span>; <br /> });<br /><br />id_reporte_2_content.addEventListener(<span style="background-color: #fff0f0;">'contextmenu'</span>, <span style="color: #008800; font-weight: bold;">function</span>(ev) {<br /> $(<span style="background-color: #fff0f0;">"#MenuContext"</span>).menu( <span style="background-color: #fff0f0;">"toggle"</span>, ev.pageX, ev.pageY );<br /> ev.preventDefault(); <br /> <span style="color: #008800; font-weight: bold;">return</span> <span style="color: #008800; font-weight: bold;">false</span>; <br /> }, <span style="color: #008800; font-weight: bold;">false</span>); <br /></pre></div><br />Como vemos aqui esta las dos formas de capturar el evento del click derecho en el primero usamos el ID del reporte 1 y el segundo el reporte 2,<b> #<span style="background-color: #fff0f0;">MenuContext</span></b>&nbsp;es el nombre de una region que revisaremos mas adelanteque contiene nuestro menu personalizado.<br /><br />Agregamos el siguiente codigo en la seecion de <b>"Execute when Page Loads"</b>, esto es para la creacion del nuevo menu que se va desplegar, aqui podemos personalizar muchas cosas, como el icono, label, type, accion, podemos revisar mas informacion de esta fuente, un poco mas de informacion sobre el menu&nbsp;<a href="http://hardlikesoftware.com/weblog/2015/07/13/apex-5-0-custom-menus/" target="_blank">HardLikeSoftware</a>.<br /><br /><!-- HTML generated using hilite.me --><br /><div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">var</span> menu$ <span style="color: #333333;">=</span> $(<span style="background-color: #fff0f0;">"&lt;div id='MenuContext'&gt;&lt;/div&gt;"</span>);<br />$(<span style="background-color: #fff0f0;">"body"</span>).append(menu$);<br />menu$.menu({<br /> iconType<span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"fa"</span>,<br /> items<span style="color: #333333;">:</span> [<br /> {<br /> type<span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"action"</span>,<br /> labelKey<span style="color: #333333;">:</span><span style="background-color: #fff0f0;">"Test Button 1"</span>,<br /> icon<span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"fa-language "</span>,<br /> action<span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">function</span>(menu, btn) { <br /> $.event.trigger(<span style="background-color: #fff0f0;">'CustomButton1'</span>); <br /> }<br /> },<br /> {<br /> type<span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"action"</span>,<br /> labelKey<span style="color: #333333;">:</span> $v(<span style="background-color: #fff0f0;">"P13_TEST_LABEL"</span>),<br /> <span style="color: #008800; font-weight: bold;">class</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"validate-confirm"</span>,<br /> icon<span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"fa-check"</span>,<br /> action<span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">function</span>(menu, btn) {<br /> $.event.trigger(<span style="background-color: #fff0f0;">'CustomButton2'</span>); <br /> },<br /> disabled<span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">function</span>() {<br /> <span style="color: #008800; font-weight: bold;">return</span> $v(<span style="background-color: #fff0f0;">"P13_IS_VALIDATED"</span>) <span style="color: #333333;">==</span> <span style="background-color: #fff0f0;">"N"</span>;<br /> }<br /> }<br /> ]<br />});<br /></pre></div><br />Como vemos, hemos creado un div con el id MenuContext, y luego este menu lo agregamos al body, asi mismo he creado dos botones, la diferencia del primero con el segundo es que el Label es dinamico, basado en un Item&nbsp;<span style="background-color: #fff0f0;">P13_TEST_LABEL</span>&nbsp;y tiene un atributo de disable, de igual forma referenciando a un item&nbsp;<span style="background-color: #fff0f0;">P13_IS_VALIDATED</span>.<br /><br />item 1<br />name: P13_TEST_LABEL<br />type: display only<br />label: Test label<br /><br />item 2<br />name:&nbsp;P13_IS_VALIDATED<br />type: Switch<br />label:&nbsp;Habilitar boton 2<br />custom settings:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-OoSKwZ3UkBA/Wnh4BuCyvdI/AAAAAAAAKK0/sE9zVTkpzJgoCKNYzqWvJSSEqY6anNE6QCLcBGAs/s1600/context_menu_swithc%2Bitem.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="222" data-original-width="315" src="https://1.bp.blogspot.com/-OoSKwZ3UkBA/Wnh4BuCyvdI/AAAAAAAAKK0/sE9zVTkpzJgoCKNYzqWvJSSEqY6anNE6QCLcBGAs/s1600/context_menu_swithc%2Bitem.png" /></a></div><div class="separator" style="clear: both; text-align: left;">Finalmente deberemos tener algo similar a esto:</div><div class="separator" style="clear: both; text-align: center;"></div><br /><div class="separator" style="clear: both; text-align: center;"></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-zsscYs9vrUY/Wnh4kQJfSyI/AAAAAAAAKLE/nQQvrZ0efTkhCYTZhBUQjfA5d2iGpSBNwCLcBGAs/s1600/context_menu_js_functions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="598" data-original-width="615" src="https://3.bp.blogspot.com/-zsscYs9vrUY/Wnh4kQJfSyI/AAAAAAAAKLE/nQQvrZ0efTkhCYTZhBUQjfA5d2iGpSBNwCLcBGAs/s1600/context_menu_js_functions.png" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;">Espero que les sea de mucha ayuda, cualquier duda en los comentarios.</div><div class="separator" style="clear: both; text-align: center;"></div><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /> Angel O. Flores Torres tag:blogger.com,1999:blog-2893325831811936253.post-1779076330050769382 Thu Feb 08 2018 21:35:00 GMT-0500 (EST) How to Hide & Show a region’s TIMING during development https://rimblas.com/blog/2018/02/how-to-hide-show-a-regions-timing-during-development/ <p>You may be familiar with the handy Substitution String <code>#TIMING#</code> in Oracle Application Express (read more about TIMING and other <a href="https://docs.oracle.com/database/apex-5.1/HTMDB/managing-regions-in-page-designer.htm#HTMDB29682" rel="noopener" target="_blank">Substitution Strings</a>).<br /> When you add it to the footer (or header) of a region you get to see how long it took to run.</p> <p><a href="https://rimblas.com/blog/wp-content/uploads/2018/02/timing_in_footer.png"><img src="https://rimblas.com/blog/wp-content/uploads/2018/02/timing_in_footer.png" alt="" width="391" height="232" class="aligncenter size-full wp-image-990 colorbox-984" srcset="https://rimblas.com/blog/wp-content/uploads/2018/02/timing_in_footer.png 391w, https://rimblas.com/blog/wp-content/uploads/2018/02/timing_in_footer-300x178.png 300w, https://rimblas.com/blog/wp-content/uploads/2018/02/timing_in_footer-100x59.png 100w, https://rimblas.com/blog/wp-content/uploads/2018/02/timing_in_footer-150x89.png 150w, https://rimblas.com/blog/wp-content/uploads/2018/02/timing_in_footer-200x119.png 200w" sizes="(max-width: 391px) 100vw, 391px" /></a></p> <p>It’s pretty nice, but you may not want to display that value all the time. It’s sure nice during development. So why not make it optional? Or toggle it on or off?</p> <p>Use the following CSS:</p> <p></p><pre class="crayon-plain-tag">.timing {display: none;} body.grid-debug-on .timing { display: inline; } .legend { font-size: .8em; color: #767676; }</pre><p></p> <p>Add this line on a region footer:</p> <p></p><pre class="crayon-plain-tag">&lt;span class=&quot;timing legend&quot;&gt;#TIMING# s.&lt;/span&gt;</pre><p></p> <p>Then the &#8220;Show Layout Columns&#8221; button on the APEX Developer Toolbar can be used to toggle the visibility of your timing entry.</p> <p><a href="https://rimblas.com/blog/wp-content/uploads/2018/02/ShowTimingToggle.gif"><img src="https://rimblas.com/blog/wp-content/uploads/2018/02/ShowTimingToggle.gif" alt="" width="400" height="90" class="aligncenter size-full wp-image-986 colorbox-984" /></a></p> <p>Maybe this gives you other creative ideas, share them in the comments.</p> <p>Keep in mind, as <a href="https://twitter.com/PeterRaganitsch">Peter</a> mentions on Twitter (<a href="https://twitter.com/PeterRaganitsch/status/961727699667517440" rel="noopener" target="_blank">https://twitter.com/PeterRaganitsch/status/961727699667517440</a>)<br /> The #TIMING# value only makes sense for report regions and it couldn&#8217;t meassure AJAX processess.</p> <p>Looking at the TIMING Substitution String is not a replacement for the Debug information generated by APEX.</p> Jorge Rimblas https://rimblas.com/blog/?p=984 Thu Feb 08 2018 16:10:36 GMT-0500 (EST) Oracle Apex 5.1.4 - Oracle Application Express http://rcitools.blogspot.com/2018/02/oracle-apex-514-oracle-application.html &nbsp;<br />Une nouvelle release d' Oracle Application Express 5.1 est disponible depuis le 17 décembre 2017. Il s'agit de la version 5.1.4.00.08 qui est un cumul de mises à jour depuis Décembre 2017. Cette nouvelle release succède à la 5.1.3 rendue publique fin Septembre 2017.<br /><br />Cette nouvelle version d' Apex 5.1 est disponible, en production et avec support Oracle, pour toutes les versions d'Oracle, standard et entreprise, à partir d'Oracle 11.2.0.4.<br /><br />Elle est également téléchargeable pour la version gratuite Oracle XE 11.2 (Express Edition).<br /><br /><a target="_blank" href="http://www.oracle.com/technetwork/developer-tools/apex/application-express/apex-514-patch-set-notes-4124555.html">Présentation des nouvelles fonctionnalités de la version 5.1.4</a> <br /><br /><a target="_blank" href="http://www.oracle.com/technetwork/developer-tools/apex/downloads/index.html">Téléchargement d'Oracle Apex 5.1.4</a> <br /><br /><a target="_blank" href="http://rci-informatique.net/crc/index.php/formations/oracle/oracle-apex-introduction/">Formations introduction Oracle Apex 5.1.4</a> <br /><br /><a target="_blank" href="http://rci-informatique.net/crc/index.php/formations/oracle/oracle-apex-perfectionnement/">Formations perfectionnement Oracle Apex 5.1.4</a> <br /><br />&nbsp; RCI Informatique tag:blogger.com,1999:blog-6486731048356836969.post-8830906641958201828 Thu Feb 08 2018 02:58:00 GMT-0500 (EST) How do I Refresh a Region or Report after a Dialog is Closed? http://joelkallman.blogspot.com/2018/02/how-do-i-refresh-region-or-report-after.html I was going to write this blog post back in December 2017, as this question comes up frequently.&nbsp; And even though there are numerous examples available in the Sample Database Application and other sample applications, and it's even <a href="https://docs.oracle.com/database/apex-5.1/HTMDB/managing-pages-in-a-database-application.htm#HTMDB29492" target="_blank">in the documentation</a>, the solution still isn't always readily apparent.<br /><br />I received this question from an internal employee today:<br /><blockquote class="tr_bq"><i>"When I edit the page and update the row and save and close the modal page, existing report doesn't refresh the page with revised value.&nbsp; &nbsp;It was working on another page, but not working on this new page (I built last week).&nbsp; Couldn't find a way to refresh it as soon as I close the modal window with saved data."</i></blockquote>He has a report and a form in his application, and the form opens up in a modal dialog.&nbsp; He simply wants the report on the parent page to refresh after the modal dialog is closed.&nbsp; Simple, right?<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-FDO3GqsMLA0/Wnu8Pct3H3I/AAAAAAAADno/sm06s6px8-QgHTuo1E2TwOJefneJVOpfwCLcBGAs/s1600/Dialog2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" data-original-height="348" data-original-width="640" src="https://3.bp.blogspot.com/-FDO3GqsMLA0/Wnu8Pct3H3I/AAAAAAAADno/sm06s6px8-QgHTuo1E2TwOJefneJVOpfwCLcBGAs/s1600/Dialog2.gif" title="Refresh after Modal Dialog in action" /></a></div><br /><br />For anyone well-versed in APEX, you'll find this blog post superfluous.&nbsp; But for everyone else who is looking for the quick explanation, as I've received this question 3 times in the past couple months, here it is.<br /><br /><ol><li>On the report page, create a new Dynamic Action and enter the following attributes:</li><ul><li><b>Nam</b>e: <i>&lt;provide a meaningful name&gt;</i></li><li><b>Even</b>t: Dialog Closed</li><li><b>Selection Typ</b>e: Region</li><li><b>Region:</b><i>&lt;choose your report region&gt;</i></li></ul><br /><li>Select the True action of the Dynamic Action and enter the following attributes:</li><ul><li><b>Action:</b> Refresh</li><li><b>Selection Type:</b> Region</li><li><b>Region:</b> <i>&lt;choose your report region&gt;</i></li></ul></ol><div><i><br /></i></div><div>That's really all there is to it.&nbsp; If you have multiple regions on the parent page, you could add multiple True actions for the dynamic action.&nbsp; If the triggering event of the modal dialog is a button instead of a region, you could specify that as your Selection Type for the triggering event.&nbsp; If there are multiple regions on the page which could open the modal dialog, you could even use a jQuery Selector and reference multiple elements as your Selection Type for the triggering event.&nbsp;<br /><br />For example, if you're converting a non-modal form and report to use a modal form, and you wish to refresh the report after the modal dialog is closed (after creating a new record), you'll need to associate the triggering event with the button.&nbsp; The steps would be:</div> <ol><li>On the report page, create a new Dynamic Action and enter the following attributes:</li><ul><li><b>Nam</b>e: <i>&lt;provide a meaningful name&gt;</i></li><li><b>Even</b>t: Dialog Closed</li><li><b>Selection Typ</b>e: Button</li><li><b>Region:</b><i>&lt;choose your button, for example, your Create button&gt;</i></li></ul><br /><li>Select the True action of the Dynamic Action and enter the following attributes:</li><ul><li><b>Action:</b> Refresh</li><li><b>Selection Type:</b> Region</li><li><b>Region:</b> <i>&lt;choose your report region&gt;</i></li></ul></ol><div><br /></div><div>You should get this behavior out of the box when creating an application with a report and form, or adding a report and form to your application.&nbsp; But if you're manually adding components, then it's really quite easy and straightforward to add this functionality to your APEX app.<br /><br />If you install the Sample Database Application, you'll find numerous examples of this dynamic action refresh operation after the close of a modal dialog.&nbsp; And it is briefly documented in <a href="https://docs.oracle.com/database/apex-5.1/HTMDB/managing-pages-in-a-database-application.htm#HTMDB29492" target="_blank">this tip</a>.</div> Joel R. Kallman tag:blogger.com,1999:blog-12214002.post-1775092825744601713 Wed Feb 07 2018 21:57:00 GMT-0500 (EST) ODTUG February News https://www.odtug.com/p/bl/et/blogaid=767&source=1 The ODTUG February News features the WIT Scholar Application, ODTUG Kscope18 updates, ODTUG community news, upcoming Meetups, upcoming ODTUG webinars, Oracle Cloud Customer Connect webinars and information, and more! ODTUG https://www.odtug.com/p/bl/et/blogaid=767&source=1 Wed Feb 07 2018 10:49:05 GMT-0500 (EST) Women in Technology Scholar - Now Accepting Applications https://www.odtug.com/p/bl/et/blogaid=766&source=1 ODTUG is pleased to announce the fourth annual ODTUG Women in Technology Scholarship program. The scholarship recipient will be awarded a complimentary pass to ODTUG Kscope18. ODTUG https://www.odtug.com/p/bl/et/blogaid=766&source=1 Wed Feb 07 2018 10:37:29 GMT-0500 (EST) Women in Technology Scholar - Now Accepting Applications https://kscope18.odtug.com/p/bl/et/blogaid=766&source=1 ODTUG is pleased to announce the fourth annual ODTUG Women in Technology Scholarship program. The scholarship recipient will be awarded a complimentary pass to ODTUG Kscope18. ODTUG https://kscope18.odtug.com/p/bl/et/blogaid=766&source=1 Wed Feb 07 2018 10:37:29 GMT-0500 (EST) Using Font Awesome 5 Pro http://vmorneau.me/fontawesome5/ <div class="kg-card-markdown"><img src="http://vmorneau.me/content/images/2018/02/DGZadQkW0AAOCQw.jpg" alt="Using Font Awesome 5 Pro"><p>It's inevitable that APEX will update the icon libraries in the next release. I expect these two:<br> - From <strong>Font Awesome 4</strong> to <strong>Font Awesome 5 Free</strong><br> - From <strong>Font APEX</strong> to <strong>Font APEX HD</strong></p> <p>Because APEX is pretty much <em>redistributing</em> Font Awesome, it has to use the <strong>free</strong> version...</p> <p>This blog post explains how to use <strong>Font Awesome 5 Pro</strong> (<a href="https://fontawesome.com/pro">https://fontawesome.com/pro</a>) in APEX</p> <hr> <p><strong>Demo 1 (Usage in APEX):</strong> <a href="https://apex.oracle.com/pls/apex/f?p=1397">https://apex.oracle.com/pls/apex/f?p=1397</a><br> <strong>Demo 2 (Universal Theme Sample):</strong> <a href="https://apex.oracle.com/pls/apex/f?p=22375">https://apex.oracle.com/pls/apex/f?p=22375</a><br> <strong>GitHub:</strong> <a href="https://github.com/vincentmorneau/apex-fontawesome5">https://github.com/vincentmorneau/apex-fontawesome5</a></p> <hr> <h2 id="downloadsteps">Download Steps</h2> <ol> <li>Get a license for Font Awesome 5 Pro: <a href="https://fontawesome.com/pro">https://fontawesome.com/pro</a></li> <li>Download these APEX <a href="https://github.com/vincentmorneau/apex-fontawesome5/tree/master/dist">compatibility files from Github</a></li> <li>Unzip Font Awesome 5 Pro (from step 1) into <code>/dist/lib/fontawesome5</code> (from step 2)</li> <li>Zip the whole <code>dist</code> folder</li> <li>Upload the zip to your APEX web server <ul> <li>Example: Shared Components - Application Static Files: <code>#APP_IMAGES#</code></li> </ul> </li> </ol> <p><em>Note: We have to do this because I can't distribute Font Awesome 5 Pro...</em></p> <h2 id="option1svgwithjavascript">Option 1) SVG with JavaScript</h2> <ol> <li>Reference these JavaScript files in your app <ul> <li><code>#APP_IMAGES#js/apex-fontawesome5#MIN#.js</code></li> <li><code>#APP_IMAGES#lib/fontawesome5/svg-with-js/js/fontawesome-all#MIN#.js</code></li> <li><code>#APP_IMAGES#lib/fontawesome5/svg-with-js/js/fa-v4-shims#MIN#.js</code></li> </ul> </li> <li>Reference this CSS file in your app <ul> <li><code>#APP_IMAGES#css/apex-fontawesome5#MIN#.css</code></li> </ul> </li> </ol> <p><img src="http://vmorneau.me/content/images/2018/02/file-references-svg.png" alt="Using Font Awesome 5 Pro"></p> <p><em>Note: If your app shows flashing question marks as icons, it means that the icon you are using does not exist in Font Awesome 5.</em></p> <p><img src="http://vmorneau.me/content/images/2018/02/broken-icons.png" alt="Using Font Awesome 5 Pro"></p> <h2 id="option2webfontswithcss">Option 2) Web Fonts with CSS</h2> <ol> <li>Reference this JavaScript file in your app <ul> <li><code>#APP_IMAGES#js/apex-fontawesome5#MIN#.js</code></li> </ul> </li> <li>Reference these CSS files in your app <ul> <li><code>#APP_IMAGES#css/apex-fontawesome5#MIN#.css</code></li> <li><code>#APP_IMAGES#lib/fontawesome5/web-fonts-with-css/css/fontawesome-all#MIN#.css</code></li> </ul> </li> </ol> <p><img src="http://vmorneau.me/content/images/2018/02/file-references-css.png" alt="Using Font Awesome 5 Pro"></p> <h2 id="usage">Usage</h2> <h3 id="basicusage">Basic Usage</h3> <p>Pick your icon here <a href="https://fontawesome.com/icons">https://fontawesome.com/icons</a>.<br> Use it in the appropriate icon CSS classes in APEX.</p> <p><img src="http://vmorneau.me/content/images/2018/02/icon-css-classes-basic.png" alt="Using Font Awesome 5 Pro"></p> <h3 id="stylesprefixes">Styles &amp; Prefixes</h3> <table> <thead> <tr> <th>Style</th> <th>Class</th> </tr> </thead> <tbody> <tr> <td>Solid</td> <td><code>fas</code></td> </tr> <tr> <td>Regular</td> <td><code>far</code></td> </tr> <tr> <td>Light</td> <td><code>fal</code></td> </tr> <tr> <td>Brand</td> <td><code>fab</code></td> </tr> </tbody> </table> <p><img src="http://vmorneau.me/content/images/2018/02/icon-css-classes-style.png" alt="Using Font Awesome 5 Pro"></p> <h3 id="iconsizes">Icon Sizes</h3> <table> <thead> <tr> <th>Size</th> <th>Class</th> </tr> </thead> <tbody> <tr> <td>0.75em</td> <td><code>fa-xs</code></td> </tr> <tr> <td>0.875em</td> <td><code>fa-sm</code></td> </tr> <tr> <td>1.33em</td> <td><code>fa-lg</code></td> </tr> <tr> <td>2em through 10em</td> <td><code>fa-2x</code> through <code>fa-10x</code></td> </tr> </tbody> </table> <p><img src="http://vmorneau.me/content/images/2018/02/icon-css-classes-size.png" alt="Using Font Awesome 5 Pro"></p> <h3 id="animated">Animated</h3> <table> <thead> <tr> <th>Animation</th> <th>Class</th> </tr> </thead> <tbody> <tr> <td>Spin</td> <td><code>fa-spin</code></td> </tr> <tr> <td>Pulse</td> <td><code>fa-pulse</code></td> </tr> </tbody> </table> <p><img src="http://vmorneau.me/content/images/2018/02/icon-css-classes-spin.png" alt="Using Font Awesome 5 Pro"></p> <hr> <p>Font Awesome 5 Pro has great plans in the future and I believe it's worth it.</p> <p>What do you think?</p> </div> Vincent Morneau 5a6cf438f36007111533e407 Wed Feb 07 2018 09:00:34 GMT-0500 (EST) Simplifying address input with Oracle APEX and Google Places Autocomplete https://www.insum.ca/simplifying-address-input-with-oracle-apex-and-google/ <p>Recently I was working on a project that relied heavily on location data. It required entering addresses, over and over again. Country, state, street address, city, zip code, etc&#8230; I was thinking that there must be a better way. Turns out there is: Google Autocomplete!</p> <p>I am sure you have seen stuff on the web that looks something like this:</p> <h2><img class="alignnone size-full wp-image-9859" src="https://www.insum.ca/wp-content/uploads/2018/02/gif1.gif" alt="" width="565" height="204" /></h2> <h2>Google Places Autocomplete advantages</h2> <p>This type of address input has a few advantages over allowing the user to type whatever they want. First, it gives you valid addresses from the Google Maps API. Second, it speeds up the process for the user because they don’t have to type out all the address fields. It even gives suggestions based on their location! And finally, it is just pretty darn cool.</p> <p>Now with our <strong>Google Places Autocomplete Plugin </strong>for Oracle Application Express (APEX) , you can get up and running with this in just a few minutes.</p> <p><strong><img class="alignnone size-full wp-image-9861" src="https://www.insum.ca/wp-content/uploads/2018/02/gif2.gif" alt="" width="389" height="347" /></strong></p> <p><strong>Features</strong></p> <ul> <li>Ability to map address components to multiple items.</li> <li>Ability to limit the search to different address types such as addresses, establishments, cities, and more!</li> <li>Interactive Grid (Grid example)</li> <li>Option to return abbreviated form of Address, State, and Country.</li> <li>Option to return address in JSON format. (JSON example)</li> <li>Suggest addresses closest to user&#8217;s current geolocation.</li> </ul> <p>(Grid example)</p> <p><img class="alignnone size-full wp-image-9862" src="https://www.insum.ca/wp-content/uploads/2018/02/gif3.gif" alt="" width="1683" height="410" /></p> <p>(JSON example)</p> <h2><img class="alignnone size-full wp-image-9888" src="https://www.insum.ca/wp-content/uploads/2018/02/autocomplete3.gif" alt="" width="1716" height="461" /></h2> <h2>Google Places Autocomplete saved me a lot of time</h2> <p>Using this feature cut my address input time from 12 seconds to 3 seconds on average. It may not seem like a lot, but when repeating this process, it allows users to complete the task in only one quarter of the time that it usually does. That is a huge improvement in terms of time and also just the overall experience in general.</p> <h2>A few tips on installation of this plugin</h2> <p>To install this plugin, go to our github:  <a href="https://github.com/insum-labs/apex-plugin-google-places-autocomplete">https://github.com/insum-labs/apex-plugin-google-places-autocomplete</a><br /> First download the repository. Then open APEX and go to the app you wish to install it in. Import the plugin file named &#8220;item_type_plugin_com_insum_placecomplete.sql&#8221;. After the import is done, it will ask you for an API key which is required. You can acquire one at <a href="https://developers.google.com/maps/documentation/javascript/get-api-key">https://developers.google.com/maps/documentation/javascript/get-api-key</a>. That is all that it takes!</p> <p>Finally, if there are any issues or enhancements you would like to request, please submit them on the github page and we will respond to them in a timely manner!</p> <p>&nbsp;</p> <p>The post <a rel="nofollow" href="https://www.insum.ca/simplifying-address-input-with-oracle-apex-and-google/">Simplifying address input with Oracle APEX and Google Places Autocomplete</a> appeared first on <a rel="nofollow" href="https://www.insum.ca">Insum</a>.</p> Neil Fernandez https://www.insum.ca/?p=9647 Tue Feb 06 2018 17:11:17 GMT-0500 (EST) February Webinars https://www.odtug.com/p/bl/et/blogaid=765&source=1 Is there a topic you would like covered but do not see here? We are happy to take webinar suggestions. Email us at kgately@odtug.com. Did you miss a webinar? As an ODTUG member you can view all of our past webinars at any time. ODTUG https://www.odtug.com/p/bl/et/blogaid=765&source=1 Mon Feb 05 2018 17:08:23 GMT-0500 (EST) Special Event Announcement https://www.odtug.com/p/bl/et/blogaid=764&source=1 On Wednesday, June 13, 2018, join us for the ODTUG Kscope18 Special Event at Andretti Indoor Karting & Games in Orlando, Florida! ODTUG https://www.odtug.com/p/bl/et/blogaid=764&source=1 Mon Feb 05 2018 17:04:50 GMT-0500 (EST) Special Event Announcement https://kscope18.odtug.com/p/bl/et/blogaid=764&source=1 On Wednesday, June 13, 2018, join us for the ODTUG Kscope18 Special Event at Andretti Indoor Karting & Games in Orlando, Florida! ODTUG https://kscope18.odtug.com/p/bl/et/blogaid=764&source=1 Mon Feb 05 2018 17:04:50 GMT-0500 (EST) ODTUG Kscope18 5K Fun Run Announcement https://www.odtug.com/p/bl/et/blogaid=763&source=1 Happy New Year! Stay true to your New Year's fitness resolution and have more FUN at ODTUG Kscope18 this year by participating in the 5K Fun Run! ODTUG https://www.odtug.com/p/bl/et/blogaid=763&source=1 Mon Feb 05 2018 17:00:35 GMT-0500 (EST) ODTUG Kscope18 5K Fun Run Announcement https://kscope18.odtug.com/p/bl/et/blogaid=763&source=1 Happy New Year! Stay true to your New Year's fitness resolution and have more FUN at ODTUG Kscope18 this year by participating in the 5K Fun Run! ODTUG https://kscope18.odtug.com/p/bl/et/blogaid=763&source=1 Mon Feb 05 2018 17:00:35 GMT-0500 (EST) ODTUG January News https://www.odtug.com/p/bl/et/blogaid=762&source=1 ODTUG's January news includes the announcement of the 2018 - 2019 Executive Committee, ODTUG Kscope18 updates, Oracle Cloud Connect upcoming webinars, ODTUG's community news, and upcoming ODTUG webinars. ODTUG https://www.odtug.com/p/bl/et/blogaid=762&source=1 Mon Feb 05 2018 16:55:23 GMT-0500 (EST) apex_application.g_f0x array processing in Oracle 12 http://roelhartman.blogspot.com/2018/02/apexapplicationgf0x-array-processing-in.html If you created your own "updatable reports" or your custom version of tabular forms in Oracle Application Express, you'll end up with a query that looks similar&nbsp;to this one:<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-WdEh0HdWKdg/Wnh6nDYKwUI/AAAAAAAAEOQ/u1G2ud7Ks94EZBreGG-MqMlAQHcrG6buQCLcBGAs/s1600/Screen%2BShot%2B2018-02-05%2Bat%2B16.38.51%2B.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="507" data-original-width="1024" height="315" src="https://2.bp.blogspot.com/-WdEh0HdWKdg/Wnh6nDYKwUI/AAAAAAAAEOQ/u1G2ud7Ks94EZBreGG-MqMlAQHcrG6buQCLcBGAs/s640/Screen%2BShot%2B2018-02-05%2Bat%2B16.38.51%2B.png" width="640" /></a></div>then you disable the "<span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">Escape special characters</span>" property and the result is an updatable multirecord form.<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-MVybmKtIx_s/Wnhp1-uxtvI/AAAAAAAAEOE/hqH6PO3ZKUUiYK-_pU-sgyiib4n1tJoXgCLcBGAs/s1600/Screen%2BShot%2B2018-02-05%2Bat%2B15.27.05%2B.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="692" data-original-width="578" height="320" src="https://4.bp.blogspot.com/-MVybmKtIx_s/Wnhp1-uxtvI/AAAAAAAAEOE/hqH6PO3ZKUUiYK-_pU-sgyiib4n1tJoXgCLcBGAs/s320/Screen%2BShot%2B2018-02-05%2Bat%2B15.27.05%2B.png" width="266" /></a></div><div class="separator" style="clear: both; text-align: left;">That was easy, right? But now we need to process the changes in the Ename column when the form is submitted, but only if the checkbox is checked. All the columns are submitted as separated arrays, named apex_application.g_f0x - where the "x" is the value of the "p_idx" parameter you specified in the apex_item calls. So we have apex_application.g_f01, g_f02 and g_f03.</div><div class="separator" style="clear: both; text-align: left;">But then you discover APEX has the oddity that the "checkbox" array only contains values for the checked rows. Thus if you just check "Jones", the length of g_f02 is 1 and it contains only the empno of Jones - while the other two arrays will contain all (14) rows.</div><div class="separator" style="clear: both; text-align: left;">So for processing you need to work through g_f02 and find the corresponding index in the g_f01 array. And then you need to use that index to find the corresponding value in the g_f03 array. Check the code example below...</div><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-2wtVxfa6lsU/Wnh615j6qcI/AAAAAAAAEOU/ciuRSCbWDzA9lUt-l8N0vD1zUiSz6i4VACLcBGAs/s1600/Screen%2BShot%2B2018-02-05%2Bat%2B16.39.47%2B.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1352" data-original-width="1462" height="588" src="https://3.bp.blogspot.com/-2wtVxfa6lsU/Wnh615j6qcI/AAAAAAAAEOU/ciuRSCbWDzA9lUt-l8N0vD1zUiSz6i4VACLcBGAs/s640/Screen%2BShot%2B2018-02-05%2Bat%2B16.39.47%2B.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: left;">To me this looks quite complex - even for a simple example as this one. But hey, that's the way it is. Everybody is doing it this way, so it must be ok.</div><br />Until Oracle Database 12.1 came along .... and you have read this:&nbsp; <a href="http://stevenfeuersteinonplsql.blogspot.nl/2016/02/use-table-operator-with-associative.html" target="_blank">http://stevenfeuersteinonplsql.blogspot.nl/2016/02/use-table-operator-with-associative.html</a><br />What is explained in that post, can also be applied to apex_application.g_f0x arrays! So knowing that, we can rewrite the code above using a way more elegant cursor :<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-Hz4xMeg6PJ8/Wnh7CNmihTI/AAAAAAAAEOY/l-Su1pWOBXQ662oMhBPAgWzN-H5oCL1EwCLcBGAs/s1600/Screen%2BShot%2B2018-02-05%2Bat%2B16.40.41%2B.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="996" data-original-width="980" height="640" src="https://1.bp.blogspot.com/-Hz4xMeg6PJ8/Wnh7CNmihTI/AAAAAAAAEOY/l-Su1pWOBXQ662oMhBPAgWzN-H5oCL1EwCLcBGAs/s640/Screen%2BShot%2B2018-02-05%2Bat%2B16.40.41%2B.png" width="627" /></a></div>Just use that cursor in your loop to process the changes. Although you still have to figure out the join between the different arrays, it is now all done within one SQL statement. Simple, elegant, effective. And probably faster too if you have a larger result set.<br /><br />BTW, as you can read <a href="https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:9532864900346799695" target="_blank">here</a>, you can't use this PL/SQL table() construct inside a DML statement. So you can't use it directly in an insert, update, delete or merge command as that will result in an "<i>ORA-00902 - Invalid datatype</i>" error. It would be really, really nice if that limitation is lifted in a future version! Roel Hartman tag:blogger.com,1999:blog-20567072.post-8498231359078760287 Mon Feb 05 2018 10:44:00 GMT-0500 (EST) Data Science via MOOC http://www.fusense.nl/?p=361 MOOC&#8217;s bestaan natuurlijk al een hele tijd. Een interessante manier om je kennis uit te breiden via cursussen die aangeboden worden door bijvoorbeeld universiteiten. De laatste jaren heb ik mijn kennis vooral on the job, via online informatie of door boeken uitgebreid. Maar nu ik mijn kennis wat fundamenteler wil bijspijkeren lijkt zo&#8217;n MOOC een [...] Hanne van Essen http://www.fusense.nl/?p=361 Mon Feb 05 2018 06:24:10 GMT-0500 (EST) APEX World 2018: Het gaat los! http://joelkallman.blogspot.com/2018/02/apex-world-2018-het-gaat-los.html While we're delighted that there are more <a href="https://apex.oracle.com/" target="_blank">APEX</a>-focused conferences springing up around the globe, there is one conference that started this trend, and that is...<a href="https://www.nloug.nl/page.aspx?lang=en&amp;event=405" target="_blank">APEX World</a>.&nbsp; Thanks to the foresight of the <a href="https://www.nloug.nl/" target="_blank">Dutch Oracle User Group</a>,&nbsp;<a href="https://www.linkedin.com/in/robinbuitenhuis/" target="_blank">Robin Buitenhuis</a> and <a href="http://www.oracle.com/technetwork/community/oracle-ace/index.html" target="_blank">Oracle ACE</a> <a href="https://twitter.com/lbrizzi" target="_blank">Learco Brizzi</a>, APEX World was started 9 years ago, with the primary purpose of bringing together the growing APEX community in the Netherlands.&nbsp; Since that time, it has grown into a premier conference for the APEX community in Europe and beyond.<br /><br />When I first had the opportunity to present at APEX World in 2014, it was a one-day event in the quaint city of <a href="https://en.wikipedia.org/wiki/Zeist" target="_blank">Zeist</a>.&nbsp; Since that time, APEX World has blossomed into a large, international, multi-track 2-day conference with more than 400 attendees expected in 2018.&nbsp; Even better, the conference itself is on board the cruise ship <a href="https://ssrotterdam.com/" target="_blank">SS Rotterdam</a>, which is very historic and beautiful.&nbsp; The theme of this years conference is <a href="https://www.nloug.nl/page.aspx?lang=en&amp;event=405" target="_blank">"A Deep Dive into Low Code"</a>, and it will be on March 22nd and 23rd in Rotterdam, Netherlands.<br /><br />Four members of the Oracle APEX product development team will be at APEX World 2018 - <a href="https://twitter.com/J_Snyders" target="_blank">John Snyders</a>, <a href="https://twitter.com/anthonyrayner" target="_blank">Anthony Rayner</a>, <a href="https://twitter.com/shakeeb" target="_blank">Shakeeb Rahman</a> and <a href="https://twitter.com/orcl_dpeake" target="_blank">David Peake</a>.&nbsp; We are all very open, we would love to understand what you're doing, and we also want to learn how we can help you be successful.&nbsp; I encourage you to come to this great event and join the large and growing international community at <a href="https://www.nloug.nl/page.aspx?lang=en&amp;event=405" target="_blank">APEX World 2018</a>.<br /><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-3ax4AA3M6Gk/WnI17H7rmoI/AAAAAAAADnU/L0--jH4yuMYkB7C6gjUc2GUl4DqYKWi-QCLcBGAs/s1600/apex_Infographic_v2_en.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="998" data-original-width="1239" height="514" src="https://2.bp.blogspot.com/-3ax4AA3M6Gk/WnI17H7rmoI/AAAAAAAADnU/L0--jH4yuMYkB7C6gjUc2GUl4DqYKWi-QCLcBGAs/s640/apex_Infographic_v2_en.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Infographic from APEX World 2017.&nbsp; 2018 will be even bigger and better!</td></tr></tbody></table><br /> Joel R. Kallman tag:blogger.com,1999:blog-12214002.post-7195538202916148971 Thu Feb 01 2018 06:53:00 GMT-0500 (EST) Streaming flat File data into Database http://www.oracle-and-apex.com/streaming-flat-file-data-into-database/ <p>For my little <a href="http://www.oracle-and-apex.com/webserver-logfile-analysis-with-oracle-apex/">Webserver Logfile Analysis project</a> I had to solve the problem of how to stream data from a flat file into a relational datamodel in my target database.</p> <p>Since I used NodeJS in several projects over the past years, it came to my mind at first. On a second thought and by consulting some friends another, easier, solution materialized:</p> <p><span id="more-1419"></span></p> <p>A simple shell command.</p> <p>Our Webservers run some Linux, so a <strong>tail -f</strong> is a very simple solution for consecutive read on one or multiple files.</p> <p>All we need to do now is to send the tail-output to the database. <a href="http://www.oracle.com/technetwork/developer-tools/rest-data-services/overview/index.html">Oracle REST Data Services (ORDS)</a> comes to mind, providing a simple POST interface to the database.</p> <p>On the shell side we simply <strong>pipe |</strong> the tail-output to a <strong>curl</strong>, which in turn POSTs to the webservice.</p> <p>Since we expect many logfile entries  we don&#8217;t want to invoke the webservice for each line, instead we buffer some lines and send them grouped off to the webservice</p> <p>The solution looks like that:</p> <pre>tail -n 1000 -f /var/foex/*/log/*custom*.log | while mapfile -t -n 150 ary &amp;&amp; ((${#ary[@]})); do printf -v var "%s\n" "${ary[@]}"; curl -X POST https://myserver.com/ords/xxx/pxxx ush -H 'Cache-Control: no-cache' -H 'Content-Type: text/plain' -d "$var"; done</pre> <p>This is quite something and was possible only with a bunch of Google-zen.</p> <p>Explained:</p> <ul> <li><strong>tail</strong> reads the end of a file, thanks to<strong> -f</strong> it keeps doing that whenever there is a new entry in the file</li> <li><strong>while</strong> loops until it received a total of 150 entries and builds up an array with the tail&#8217;ed file entries</li> <li><strong>curl</strong> finally takes the built up array and POST&#8217;s it as payload to our ORDS webservice</li> </ul> <p>The webservice takes the given body, converts it to CLOB and process it accordingly:</p> <p><img class="aligncenter size-full wp-image-1425" src="http://www.oracle-and-apex.com/blog/wp-content/uploads/Resource_Handler.png" alt="" width="502" height="562" /></p> <p>Now all we need to do i string-parsing the input and put it in the respective tables. Easy, right?</p> <img src="http://www.oracle-and-apex.com/blog/?ak_action=api_record_view&id=1419&type=feed" alt="" /> Peter Raganitsch http://www.oracle-and-apex.com/?p=1419 Thu Feb 01 2018 04:12:16 GMT-0500 (EST) Workflow – Checking out the competition. http://douggault.com/2018/01/31/workflow-checking-out-the-competition/ <p>Remember when I said that, for my <em><span style="text-decoration: underline;">All The Things</span></em> project, &#8220;My goal is to go through the steps I would normally traverse when building an application for a paying client&#8221;? Well one of those steps would surely be to understand what was already available on the market and see if any of them fit the bill for the client&#8217;s needs.</p> <p>I&#8217;m going to try to do the same thing here, but since there isn&#8217;t a real client (and therefore no <em>real</em> set of needs) I won&#8217;t spend the time and go to the depth i might. After all the purpose of this whole exercise is to create a system from scratch, right?</p> <p>That being said I wanted to have a look at some of the more popular options out there. This can help us gain an understanding of what people are requiring and what companies are building in to their products.</p> <p>First let me apologize for the marathon post. It turned out way longer than I thought it was going to. You may want to grab a drink (and a snack). It&#8217;s a long trail you&#8217;re about to hike.</p> <h3>A Rose by Any Other Name</h3> <p>One of the very first things I ran into when searching for available workflow solutions is that no one really talks about &#8220;Workflow&#8221; any more. Although a straight google search for &#8220;Workflow Engines&#8221; does bring back a lot of hits, you quickly begin to notice that most of the sites actually talk much more about Business Processes and Business Process Management way more than they talk about Workflow directly.</p> <p>This sent me down a rabbit hole which consumed the better part of a Saturday afternoon &#8211; What&#8217;s the difference between Business Process Management and Workflow?</p> <p>My first thought was that Business Process Management was just a fancy new updated way of saying Workflow. But that turned out to be too much of a simplification.</p> <p>How you think about Workflow vs BPM seems to hinge quite heavily on your perspective, but I&#8217;ll do my best to boil down what I learned to a single paragraph :</p> <p style="padding-left: 30px;"><strong>&#8220;Workflow focuses more specifically on the <em><span style="text-decoration: underline;">automated execution</span></em> of a set of defined steps (or tasks) and knowing where you are in those steps. Business Process Management focuses more on the definition of the overarching processes (which may contain one to many workflows), their overall efficiency and how to improve said processes to the benefit of the company.&#8221;</strong></p> <p>So where we used to talk about Workflow as the solution to the problem of process automation, now workflow is talked about as a mere component of a BPM solution, this time to the more all-encompassing problem of business process efficiency.</p> <p>I don&#8217;t want to beleaguer the point, but I will obviously need to return to this discussion in relation to the software that I&#8217;m going to try to build. For now, lets just understand that when researching existing solutions, I had to keep in mind that there is more at play than just simple process automation.</p> <h3>Overview of Options</h3> <p>When you dive in to the deep end of the Google search pool you could spend weeks if not months exploring all the options that come up when searching for either Workflow or Business Process Management. Because of this, I&#8217;ve limited my discussion to those that I have had either direct experience with, or that have been recommended to me by those I trust.</p> <p>My goal is not to compare and contrast each option, nor choose a &#8220;winner&#8221;. I&#8217;ve obviously not used most of these in any type of production environment. My goal is to simply explore some of the more popular options and potentially use them for reference when moving forward with this project.</p> <h4>PL/FLOW</h4> <p><strong>URL</strong>: <a href="http://plflow.sourceforge.net/">http://plflow.sourceforge.net/<br /> </a><strong>Availability</strong>: Open Source (LGPL)<br /> <strong>Status</strong>: Inactive (No Activity since 06-2006)</p> <p>According to the PL/FLOW SourceForge repository, &#8220;PL/FLOW is a workflow engine written in Oracle PL/SQL, implementing interfaces 1 and 2 (Process Definition and the client API) as specified by the Workflow Management Coalition. (<a href="http://www.wfmc.org">www.wfmc.org</a>)&#8221;</p> <p>This is one of the few options I&#8217;ve spent any significant time with and have actually implemented for a customer. I won&#8217;t lie, it takes a while to understand what PL/FLOW is trying to do, how it can be used and where the boundaries of the system are. This is partially because the documentation is lacking beyond the very basics and isn&#8217;t helped by the object and column names being relatively cryptic and hard to remember.</p> <p>With a little study and a thorough reading of the source code, it starts to become clear that this is exactly what it purports to be &#8211; A simple workflow execution engine.</p> <p>On the positive side, the implementation is open source, it is written in PL/SQL, the code is heavily commented and provides a set of PL/SQL API&#8217;s that can be used to integrate the engine into your application.</p> <p>However, there are definitely challenges with the implementation.</p> <p>First and foremost, the code depends on a set of SYS owned Advanced Replication packages being available. If you&#8217;re using any database before 12.2, you should be fine, but Advanced Replication has been de-supported in version(s) 12.2 and beyond. Getting around this isn&#8217;t a huge challenge. The advanced replication packages are used in the triggers on each table to identify whether a change was generated by replication or by actual manipulation of the data by the engine. You can rip these out of the triggers and everything should work without issue.</p> <p>Second, the definition of the workflows is not based on current standards. The WfMC Standards that PL/FLOW is based on are ancient in IT Terms, and the world has moved on. BPMN is the current standard and PL/FLOW natively knows nothing about it.</p> <p>And when it comes to designing workflows, the documentation does walk you through the metadata of a couple of examples, but they are simple and don&#8217;t necessarily show the full functionality and feature set of the engine. For that you have to experiment.</p> <p>Next, although the metadata breaks out the <em>definition</em> of a workflow from a running <em>instance</em>, the table structure doesn&#8217;t allow for multiple versions of a workflow to exists at once. And with the way PL/FLOW implements instantiation of a workflow (by only copying data about the current step to the instance tables as it is reached in the process), if you change the definition of a workflow on the fly, you might get unexpected results.</p> <p>There&#8217;s also no way to export the definition of a workflow. Sure, all the metadata is there in the database tables, but moving a workflow definition from development to QA or PROD becomes a process of building your own scripts.</p> <p><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;">Finally, there is no visual way to design workflows. The website does mention (and link to) a Java based workflow editor, but those links have not worked for a very long time. While this isn&#8217;t a show-stopper, people will likely want a way to visualize their workflow designs and the state of in-process workflows. You&#8217;ll have to do this on your own here.</span></p> <p>All this, coupled with the fact that there is no support and that there have been no updates or releases of the software since June of 2005, means that you are truly on your own implementing PL/FLOW.</p> <p>I truly believe that much of this accounted for the one client I implemented this for eventually ripping PL/FLOW out by the roots, even though it was working for them.</p> <p>Having said all that, I had a really interesting web conference with a gentleman by the name of Robert Meyer from Leipzig, Germany. He showed me a system that he is in the process of creating using <a href="http://bpmn.io/">bpmn.io</a> as the designer and modified version of PL/FLOW as the execution engine. I have to say I was quite impressed with what he had done. Whether Robert intends to release his work to the world at large remains to be seen, but I definitely encouraged him to keep moving forward!</p> <h4>Flow Control Toolkit (FTC)</h4> <p><strong>URL</strong>: <a href="https://github.com/j-sieben/FCT/">http://plflow.sourceforge.net/<br /> </a><strong>Availability</strong>: Open Source (MIT)<br /> <strong>Status</strong>: Inactive (No Activity since 06-2016)</p> <p>FTC takes a different approach to implementing workflow. Jürgen Sieben, the author, has implemented a <a href="https://en.wikipedia.org/wiki/Finite-state_machine">Finite State Machine</a> using Oracle database types and PL/SQL and has done it in a very specifically object-oriented way.</p> <p>I was excited to try this specific engine out as it comes with an example that includes an APEX app.</p> <p><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;">The entire system hinges around an Oracle Object Type definition called FCT_TYPE. The object type defines an abstract object definition including a number of getter methods as well of a number of helper methods.</span></p> <p>The act of defining a workflow consists of a number of steps.</p> <ol> <li>Create a concrete implementation of the abstract object. The concrete implementation defines any additional attributes the object might need as well as defines the constructor for the concrete instances of this subtype.</li> <li>Create packages to hold the related logic. It is suggested to create 2 packages &#8211; one for the FCT related logic and another specifically for business logic.</li> <li>Create a set of database objects to store information about the specific instances of the concrete implementation. The table(s) hold(s) attributes about the thing you&#8217;re tracking plus a reference to the object instance.</li> <li>You then need to define the statuses, events and transitions an instance can go through. This is done by calling a set of API&#8217;s and referencing the concrete type implementation.</li> <li>Call an admin function to create (or re-create) an event and status package. These generated packages contain information for all defined events and statuses and are related to their owning class type.</li> <li> Add event handlers to the FCT package created in step 2. The event handlers form the link between the FCT logic and the business logic to be executed for a specific event or transition.</li> </ol> <p>Confused yet? I definitely am. And the fact that I could not get the code to install cleanly didn&#8217;t help. The installation scripts are wrought with issues, including what seems to be a requirement for one of Jürgen&#8217;s other projects (<a href="https://github.com/j-sieben/PIT">PIT</a>). But even after installing PIT, getting it working and executing the proper grants, I found that the signatures of the PIT package calls don&#8217;t match those defined in the PIT repository.  It was at this point that I stopped.</p> <p>Based on the docs in github, I think this is a really interesting idea. However I do think it looks very code heavy and may put a lot of people off.</p> <p>Again it&#8217;s not standards based and does not have any type of graphical interface to build or track workflows. The fact that it is open source and doesn&#8217;t have a supported option will put many companies off.</p> <p>It doesn&#8217;t look like anything has been done to the core code since its initial release in June of 2016. There are a couple outstanding bugs logged against it, specifically to do with the failed installation that don&#8217;t look like they&#8217;ve been acknowledged or actioned.</p> <p>The only conclusion I can come to is that the FCT project is dormant and the author has moved on to other priorities.</p> <h4>Relay Workflow for Oracle</h4> <p><strong>URL</strong>: <a href="https://www.patreon.com/TribalKnowledge">https://www.patreon.com/TribalKnowledge</a><a href="https://www.activiti.org/"><br /> </a><strong>Availability</strong>: TBD (Likely Commercial)<br /> <strong>Status</strong>: ACTIVE</p> <p><a href="https://twitter.com/wileecoyote_">Jason Aughenbaugh</a>, a long time personal friend and friend of the APEX community, is in the process of developing a workflow engine based on his years of experience and knowledge in working with process automation.</p> <p>Although he is still in the throws of core development and there is nothing available for download at the moment, he was good enough to walk me through what he has done thus far. He has obviously put a lot of work into the system and it shows.</p> <p>Process modeling is done graphically and uses IBM&#8217;s flow notation. The system allows you to drill down into process steps and decision points to further define variables, conditions, forms, responsible parties, etc.</p> <p>Looking at the stated goals for Relay and the broad list of functionality on the website, it&#8217;s definitely one to watch in the future.</p> <h4>Activiti</h4> <p><strong>URL</strong>: <a href="https://www.activiti.org/">https://www.activiti.org/</a><a href="https://www.activiti.org/"><br /> </a><strong>Availability</strong>: Open Source (Apache 2.0) / Commercial support provided by <a href="https://www.alfresco.com/platform/process-services-bpm">Alfresco</a><br /> <strong>Status</strong>: ACTIVE</p> <p>Activiti is a light-weight, java-based Business Process Management platform that has been around since 2010. The documentation states that it is aimed at Business Users, Administrators and Developers. It supports both BPMN 2.0 and DMN standards and has open REST APIs allowing integration with external systems that may not inhabit the same server space.</p> <p>The implementations can be as simple as a working JRE and Apache Tomcat, or as complex as bundling Activiti JAR files in your own Java application.</p> <p>Data for Activiti is stored in one of a number of supported relational databases, the default being h2 due to its simplicity and portability. Oracle, mySQL, Postgres, DB2, and MSSQL are also supported databases.</p> <p>For testing purposes I chose to go with the JRE and Tomcat option, and I have to say it was as easy as copying the WA files to the <strong>webapps</strong> directory and navigating to the correct URL. I was immediately able to log in to the demo environment, had access to create BPMN models, Reusable Forms, Decision Tables and Application Definitions.</p> <p>The REST APIs are what you would expect and allow access and manipulation of process definitions, models, process Instances, executions, tasks, history, forms, Users, etc. It even provides REST APIs to retrieve metadata information about data from the underlying database tables.</p> <p>Although REST APIs are provided and well documented, the bulk of the documentation assumes that you&#8217;ll be implementing Activiti as part of a Java project. The examples and the quick start guide are all Java heavy, so if you&#8217;re not familiar with Java, following the concepts of their examples will be challenging.</p> <p>There&#8217;s no PL/SQL level API so you&#8217;d have to do everything via REST, but that shouldn&#8217;t be a problem as it&#8217;s becoming easier to do that.</p> <p>The fact that Alfresco provides an enterprise level supported version makes it a good choice for companies that want to implement a supported solution, and the fact that it easily supports Oracle as a database means that you could tap in to the underlying tables for reporting purposes.</p> <h4>Flowable</h4> <p><strong>URL: </strong><a href="http://www.flowable.org">http://www.flowable.org</a><a href="https://www.activiti.org/"><br /> </a><strong>Availability</strong>: Open Source (Apache 2.0) / Commercial support Available from <a href="https://www.edorasware.com">EdorasWare</a><br /> <strong>Status</strong>: ACTIVE</p> <p>In October 2016, 3 key engineers from Activiti tendered their resignation and very shortly thereafter forked the main Activiti repository and released the first version of Flowable. The goal was to continue development in the direction <em>they</em> saw the project going without the restraints put on them by the commercial needs of Alfresco.</p> <p>It looks as if their business model is not to create an enterprise version of the software, but instead to provide full support, training and consulting on the open source Flowable core.</p> <p>Looking at the docs, screenshots and examples, they so far have not strayed to far from the origin when it comes to features and functionality. The biggest change that I can see is the addition fo CMMN to the original BPMN and DNN.</p> <p>Other than that, it looks much the same as Activiti thus far.</p> <h4>Camunda</h4> <p><strong>URL: </strong><a href="https://camunda.org">https://camunda.org</a><a href="https://www.activiti.org/"><br /> </a><strong>Availability</strong>: Open Source (Apache 2.0) / Commercially supported Enterprise Edition available<br /> <strong>Status</strong>: ACTIVE</p> <p>Camunda came about in 2013 with a code fork from the Activiti code base. Since then the Camunda team seems to have done a lot to differentiate it from its Activiti base.</p> <p>Looking through the documentation, you&#8217;ll see quite a bit that is similar to both Activiti and Flowable, which is understandable seeing that they all branch from the same root code. However the user interface looks to be a complete departure from its Activiti ancestor. And, like Flowable, Camunda have added CMMN to the original BPMN and DNN.</p> <p>Camunda provides REST API&#8217;s for pretty much everything you&#8217;d want to do. Like Activiti, the documentation and examples assume that you&#8217;ll be implementing everything using Java, so be prepared to mentally parse some Java code to get to the meat.</p> <p>The software provides support for various relational databases (including Oracle) as data stores, and this makes it nice if you want to read data directly from the underlying tables. However the table structure is confusing and there isn&#8217;t a lot of good documentation that I found on what is stored where.</p> <p>On the plus side, it has already been proven by <a href="https://twitter.com/nielsdb">Niels de Bruijn</a> that Camunda can be integrated into an Oracle/APEX environment. A number of months ago he did a <a href="https://www.slideshare.net/nielsdb/affordable-workflow-options-for-apex">presentation</a> on workflow integration with APEX. I had a very enlightening Skype call with him where he shared with me how he integrated the two products. He had obviously done a lot of leg work in understanding the underlying data structures, APIs and required touch points. Niels even created an APEX application that read data from the Camunda base tables to show users information about the status of in process workflows.</p> <p>I&#8217;m sure that could be done for any of the applications mentioned here that allow for installation into an Oracle database, but it was quite impressive to see what he had achieved.</p> <h4>BonitaSoft</h4> <p><strong>URL: </strong><a href="https://bonitasoft.com">https://bonitasoft.com</a><a href="https://www.activiti.org/"><br /> </a><strong>Availability</strong>: Open Source (LGPL 2.0) / Commercially supported Subscription Edition available<br /> <strong>Status</strong>: ACTIVE</p> <p>BonitaSoft comes from a different stable entirely and, as you would expect, looks and feels completely different than the other options listed above.</p> <p>Bonita Studio provides both desktop and web portal based environments that together provide the ability to build models, define execution specifics for steps, manage predefined integration with external systems, build forms, and even create full &#8220;applications&#8221; with linked pages, forms and interactions with process models.</p> <p>As you would expect, it provides a full REST based API suite and again, pretty much everything you want to do is available.</p> <p>Modeling uses BPMN based models, as seems to be the standard, however the feel of the modeler is completely different and uses a lot of color. Not that that&#8217;s a bad thing &#8211; just different. One of the nice things in the Bonita modeler that I have not seen in others is the tree view that shows the process components and allows you to drill in on them.</p> <p>The docs are fairly clear but again, they are Java heavy including a whole section of javaDoc on the classes that are available for implementation.</p> <p>Overall the product seems a bit more cohesive and usable but it is obviously complex and, like most of the systems mentioned here, would take a long time to learn how to get the best out of it.</p> <h4>ProcessMaker</h4> <p><strong>URL: </strong><a href="https://www.processmaker.com">https://www.processmaker.com</a><br /> <strong>Availability</strong>: Dual License (AGPL V3 / Various Commercial Levels )<br /> <strong>Status</strong>: ACTIVE</p> <p>Like BonitaSoft, ProcessMaker is different from those that sprung from the roots  of Activiti. However, instead of being a cross between desktop and web portal, ProcessMaker is all web-based.</p> <p>Like all of the major systems discussed here, the designer uses BPMN notation to design the flows and has a sophisticated interface to define and link together variables, forms, users, groups, process steps, group assignments, etc. I have to say, the interface in ProcessMaker was really easy to use and well laid out. It didn&#8217;t overcomplicate things and only showed you what you needed to see when you needed to see it.</p> <p>The process modeler was more akin to Camunda in it&#8217;s look and feel, but with the pallet of controls across the top instead of along the side.</p> <p>Again a full set of REST based APIs let you control every aspect from outside of the system, including APIs for Administration, Design and Execution.</p> <p>The docs are the best I&#8217;ve seen as they are well structured and have lots of examples and walk throughs. There are also lots of videos that demonstrate the various features.</p> <p>Although Process maker has the capability to integrate with external Databases, the metadata defined within process maker is stored in a local mySQL database. Integration comes in the form of being able to define and provide tables in remote databases based on the data in its core mySQL database.</p> <p>Like BonitaSoft, there are a number of built in integrations with external software vendors, making triggering and integrating workflows easier.</p> <p>Overall ProcessMaker seemed to be the friendliest to get started with.</p> <h3>The Lessons</h3> <p>So after having worked my way through the octet of options listed above, what did I learn?</p> <h4>Workflow is big &#8230; and nebulous</h4> <p>No two people (or companies) seem to think of workflow in the same way. Even the three packages that share the same code base are all moving in different directions. Although I didn&#8217;t specifically mention this in my synopsis of each above, many of the workflow engines tout solutions targeted at specific industries. Whether this comes in the form of pre-built process models, or extensions/plugins to the core, each obviously understand that every industry is different and has different needs.</p> <h4>BPMN is King</h4> <p>Every major option that I looked at incorporated BPMN as their modeling standard. This is no coincidence &#8211; BPMN and Business Process Management is big business and each of these vendors want a piece of that pie. And not only is BPMN a must, but many have added CMMN and DNN to the mix &#8211; All the better to serve you with, my dear.</p> <h4>All things to all people</h4> <p>Here is one that I disagree with. Most of the products I looked at were not only implementing the ability to model, execute and track a process, but they were also trying to provide a full platform on which to build Process Automation Applications. The ability to design linked forms to collect and store data about a process step, and even the ability to create &#8220;applications&#8221; that encompass full or even multiple linked processes is provided by many of the systems.</p> <p>Ok I understand that a business user starting from scratch might find this alluring. They don&#8217;t have to get IT involved to implement their business process.  But I can&#8217;t help but think that, in the long run, this is just another place to build and maintain business rules outside of the core development environment that already exist in a company.  And how many times have we seen systems &#8220;developed by business users&#8221; either fail because they are left to languish after their initial implementation, or turn into data islands that are not integrated into the business architecture as a whole. And doesn&#8217;t that last one defeat the whole purpose of Business Process Management?</p> <h4>Java Java Java!</h4> <p>The world of BPM seems to be heavily Java-Centric. From documentation to examples, Java seemed to be the only thing on most companies minds. Even the examples and documentation around the REST APIs were heavily bent toward Java developers.</p> <p>But then again, you code to what you know. Most of the engines listed above are written in Java, so why wouldn&#8217;t they use their native language to provide examples.</p> <h4>Database agnostic</h4> <p>Apart from the obvious Oracle-centric options, pretty much every platform used either H2 or mySQL as their default database, and it&#8217;s obvious why. They&#8217;re cheap and portable, don&#8217;t need a lot of DBA love, and can stand up to a reasonable amount of thrashing before they start to creak under the strain.</p> <p>And of the ones that chose H2 or mySQL as their base, all but one offered the option to configure the platform to use a more robust database of your choosing. And the usual suspects were always there &#8211; MS-SQL, Oracle, PostgeSQL, DB2.</p> <p>But the very fact that each platform is fairly database agnostic means that they are simply using the chosen database as a datastore and not using RDBMS system for what they&#8217;re good at; manipulating and maintaining data. Instead, they&#8217;re pushing all of the data manipulation away from the data into the middle (Java) tier. Having seen a number of systems (not just Java) that have been coded to be database agnostic, that does not fill me with joy and sunshine.</p> <h3>The Takeaways</h3> <p>Examining all of these platforms has really been an interesting process. There are obviously huge similarities between the platforms. The very fact that most use BPM means that the language they speak when it comes to talking about processes, models, instantiation and execution are very similar. This is a good thing and made the task of looking at multiple platforms far easier.</p> <p>But there were huge differences too &#8211; In UI, deployment options, documentation, examples, REST interfaces, etc. And you would expect this from software companies who are trying to differentiate their products in a relatively crowded marketplace.</p> <p>As I said earlier, my purpose for this wasn&#8217;t to come up with a winner, although some stars shone brighter than others. My goal here was to understand what companies were doing, what was common, and what I could and should take forward into my project.</p> <p>Below is a list of things that I want to document for my own purposes as the feelings I came away with after completing this process.</p> <ul> <li><strong>BPMN is ubiquitous</strong>. I definitely want to take this, and the nomenclature it brings, into consideration when designing the system. This will likely influence everything from object names in the database all the way through how the REST APIs and eventually the UI will present information to the users of the system. This is so important that I&#8217;ve ordered <a href="http://a.co/1sLyGKs">this book to read</a> so that i can get a better handle on BPMN. I&#8217;m also going to be doing more research into <a href="http://bpmn.io">bpmn.io</a> and I&#8217;d be very surprised if I didn&#8217;t use this as the modeling engine for what ever I produce. Sure I could build a modeler from scratch using JavaScript of Oracle JET components, but dear god, why!?</li> <li><strong>Simple is better</strong>. The one platform that stood out to me most was the one with the simplest interface and documentation &#8211; ProcessMaker. If I were going to choose one of these systems to implement for myself, it would probably be this one because of the sense of ease I felt using it and walking through the docs. Ease of use, understanding, implementation and integration is a big goal for me, so this stuck out.</li> <li><strong>Focus, Focus, Focus</strong>. Its better to do one thing well than to be half-good at a lot of things. The fact that many of these systems try to be a full application building platform just didn&#8217;t ring true to me. Yes, they can all be put into service using only the modeling and the execution engine. So why deal with the extra weight. I want to focus on the definition and execution of the process steps as defined. You want to create an application with forms that capture the process step variables? Good for you. Code away in your favorite language.</li> <li><strong>Take advantage of the database</strong>. This is one that I have the luxury of doing because I&#8217;m building this specifically for Oracle. I&#8217;m going to take as much advantage as I can of the things the Oracle database has to offer. However, as stated before I&#8217;m going to do my best to code to the lowest common denominator &#8211; meaning Oracle Standard Edition. I want this to run on XE all the way up to EE.</li> <li><strong>Multiple examples</strong>. I&#8217;ve already stated my goal would be to provide multiple examples of reference implementations using various languages. I&#8217;m obviously going to do one using APEX, but my goal would be to provide reference implementations using other technologies as well. One of them might even be JAVA, but we&#8217;ll wait and see.</li> <li><strong>Function First</strong>. Looking at all the different UI&#8217;s I was struck by, especially with the three that shared the same root code, how divergent they all were. This cemented in my mind something that had been simmering there for some time &#8211; I want to focus on the core engine first. The engine not only needs to work, but be stable before you code a UI on top of it. I think some of the platforms I looked at suffered from the UI and engine being developed in tandem and the UI team not having a stable platform to build upon.  I do understand that software is never &#8220;done&#8221; an that it is inevitable that there will be changes to the core that will affect the UI. But I want to at least try to tackle this with the goal of &#8220;function first&#8221; and then build/change the UI to fit the function.</li> <li><strong>Nature Abhors a Vacuum</strong>. Therefore I shall not code in one. Part of the reason I&#8217;m doing this series is to help readers get a peek behind the scenes at how I approach design, and while I&#8217;m at it, showcase as many of Oracle&#8217;s tools as possible. But I also know that I don&#8217;t always have the best ideas and there are <em>many of you</em> that can attest to that. So I want feedback along the way. And I intend to consider all constructive ideas and criticism as if it were my paying client giving it to me.</li> </ul> <h3>In Summary</h3> <p>This has been a long process, as the long post shows. But I think it has provided a huge amount of information for me. Like I said, workflow is hard &#8211; it is not a light and breezy skip through a daisy-laden field. More like a crawl through a culvert of questionable content.</p> <p>But I do invite you to continue the journey with me. I look forward to the next installment, but before then I have a lot of reading to do.</p> <p>&nbsp;</p> Doug Gault http://douggault.com/?p=240 Wed Jan 31 2018 15:30:54 GMT-0500 (EST) Webserver Logfile Analysis with Oracle APEX http://www.oracle-and-apex.com/webserver-logfile-analysis-with-oracle-apex/ <p>Recently I wanted to set up better monitoring for our several FOEX webservers and decided not to use an off-the-shelf solution, since I wanted to have the analysis results in my Oracle Database, ready to be used by whatever internal tools we have.</p> <p><span id="more-1413"></span></p> <p>Immediately I thought of <a href="http://sql-plsql-de.blogspot.co.at/2012/11/externe-tabellen-fur-eine-entfernte.html">an old blogpost</a> by <a href="https://blogs.oracle.com/author/carsten-czarski">Carsten Czarski</a> (him and <a href="https://oracle-base.com">Tim Hall</a> seem to have all Oracle answers present on their respective blogs), but decided against using remote tables spread over several servers.</p> <p>Instead I did setup a new datamodel to import the webserver logfile data into. Check out my <a href="https://apex.oracle.com/en/quicksql/">QuickSQL</a> definition:</p> <pre>host host_name /nn alias vc100 ip_address vc16 request request_string /nn user_agent user_agent_string /nn alias vc100 is_bot yn agent_type vc2000 agent_name vc2000 agent_version vc2000 os_type vc2000 os_name vc2000 os_version_name vc2000 os_version_number vc2000 os_producer vc2000 os_producer_url vc2000 linux_distribution vc2000 agent_language vc2000 agent_language_tag vc2000 referrer referrer_string /nn alias vc100 http_status http_status /nn /unique alias vc100 is_used yn access_log host_id /nn remote_ip vc16 access_time timestamp /nn request_id http_status number bytes number referrer_id user_agent_id hash number /index /nn # settings = { prefix: "AWL", PK: "TRIG", drop: true, language: "EN" }</pre> <p>Using this data model it was very easy to create some charts based on analytic queries to visualize the data of interest:</p> <p><img class="aligncenter size-full wp-image-1416" src="http://www.oracle-and-apex.com/blog/wp-content/uploads/APEX-Webserver-Logfile-Analysis.png" alt="" width="800" height="835" /></p> <p>Even before that we had to solve the issue of how to transport the logfile data (in almost real-time) from the webservers to the database.</p> <p>Keep on reading <a href="http://www.oracle-and-apex.com/streaming-flat-file-data-into-database/">how to stream the logfile data into the database</a> in the next post.</p> <img src="http://www.oracle-and-apex.com/blog/?ak_action=api_record_view&id=1413&type=feed" alt="" /> Peter Raganitsch http://www.oracle-and-apex.com/?p=1413 Wed Jan 31 2018 10:36:49 GMT-0500 (EST) Warn on Unsaved Changes for APEX_ITEM https://rimblas.com/blog/2018/01/warn-on-unsaved-changes-for-apex_item/ <p>APEX 5.1 introduced native functionality for warning the user when they attempt to navigate away from a page when the page contains unsaved changes. However, this feature doesn’t track items created via the <a href="https://docs.oracle.com/database/apex-5.1/AEAPI/APEX_ITEM.htm#AEAPI192"><code>APEX_ITEM</code></a> API. Which brings me to the poor man’s Warn On Unsaved Changes.</p> <p>Here’s the basic technique:</p> <ol> <li>Use a regular text item (we’ll call it “Pn&#95;COUNT&#95;CHANGES”) on the page to track changes using the native functionality. I default it to zero (so it can be incremented as a number).</p> </li> <li> <p>Add a Dynamic Action that listens for changes on your <code>APEX_ITEM</code> elements. When a change happens just increment the <code>Pn_COUNT_CHANGES</code> item as if it were a counter. The selector could be by id: <code>input[id^=ITEM_NAME]</code> (notice the <code>^</code> which means “Starts with”). Or the selector may be by name <code>input[name="f01"]</code> or <code>select[name="f01"]</code></p> </li> <li> <p>Add some CSS to the page to hide the <code>Pn_COUNT_CHANGES</code> item. You don’t want it to be a hidden item because then it will not be considered as part of the page changes (plus it would need to be unprotected).</p> </li> </ol> <p></p><pre class="crayon-plain-tag">#Pn_COUNT_CHANGES_CONTAINER { display: none; }</pre><p></p> <p>And that’s it. Here is the demo app <a href="https://apex.oracle.com/pls/apex/f?p=46011:90">https://apex.oracle.com/pls/apex/f?p=46011:90</a></p> <p>This is how the Dynamic Actions looks:<br /> <a href="https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_da.png"><img src="https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_da.png" alt="" width="327" height="339" class="aligncenter size-full wp-image-977 colorbox-976" srcset="https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_da.png 327w, https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_da-289x300.png 289w, https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_da-100x104.png 100w, https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_da-150x156.png 150w, https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_da-200x207.png 200w, https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_da-300x311.png 300w" sizes="(max-width: 327px) 100vw, 327px" /></a></p> <p>Here is the True Action:<br /> <a href="https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_true_action.png"><img src="https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_true_action.png" alt="" width="374" height="771" class="aligncenter size-full wp-image-978 colorbox-976" srcset="https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_true_action.png 374w, https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_true_action-146x300.png 146w, https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_true_action-100x206.png 100w, https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_true_action-150x309.png 150w, https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_true_action-200x412.png 200w, https://rimblas.com/blog/wp-content/uploads/2018/01/track_changes_true_action-300x618.png 300w" sizes="(max-width: 374px) 100vw, 374px" /></a></p> <h2>Closing Words</h2> <p>I admit this is a complete hack. It would also be enough to change the tracking item from 0 to 1, there’s no need to increment the value. That said, I like the idea of incrementing the value and if you implement something more complex undoing changes and decreasing the counter (if you set it back to the original value there would be no warning).</p> <p>Perhaps a more native approach and some would argue even elegant, would be to use <code>apex.page.warnOnUnsavedChanges</code>. This API receives two parameters: <code>pMessage</code> and <code>pExtraIsChanged</code>. <code>pExtraIsChanged</code> is a function that you control and inside you can code the logic to track your changes. But that’s a completely different blog post.</p> Jorge Rimblas https://rimblas.com/blog/?p=976 Wed Jan 31 2018 09:48:43 GMT-0500 (EST) Use Font APEX and Font Awesome Simultaneously http://max-tremblay.blogspot.com/2018/01/use-font-apex-and-font-awesome.html <div>APEX 5.0 gave us the ability to include the Font Awesome library in our applications. In APEX 5.1, Font APEX was added the the list of icon library.&nbsp;</div><div><br /></div><div>Taken from the Universal Theme Sample Application:</div><div><blockquote class="tr_bq" style="border-left: 2px solid lightgray; padding-left: 10px;">Font APEX is an all new icon library designed to complement Universal Theme. It was designed as a replacement for Font Awesome, the web's leading icon library, and therefore contains almost all of the Font Awesome icons, re-drawn on a 16x16 grid as line-icons, to match the aesthetic we wanted. We wanted to make it a seamless switch to go from Font Awesome to Font APEX, and therefore use the same "fa" prefix for the icons, making it easier than ever to move to entirely new icon library.</blockquote></div><div>To include either Font Awesome or Font APEX in our application, we need to go under the application's Shared Components, then under Themes, select the theme and under the Icons section, we can select the library that we want to include.<br /><br /></div><div>What if we would, for some reason, like to include the two libraries and use some icons from one and some icons from the other.</div><div><br /></div><div>Unfortunately, the library attribute only enables us to select one of them.</div><div><br /></div><div>On top of that, since the two libraries are using the same "fa" prefix, we can't simply include both files.</div><div><br /></div><div>On the other hand, Font Awesome includes the LESS and Sass files so that we can customize and build the library ourselves.</div><div><br /><h2>What we'll do</h2></div><div>The idea is to include the Font APEX library using the built-in attributes. We'll then need to customize Font Awesome so that it uses a different prefix, build it and include that custom version into our application.</div><div><br /></div><h2>Building our customized Font Awesome</h2><div>First, we'll need to head over to&nbsp;<a href="http://fontawesome.io/" target="_blank">http://fontawesome.io</a> and download the library.</div><div>Once extracted, we get 4 folders:<br /><ul><li>css</li><li>fonts</li><li>less&nbsp;</li><li>scss</li></ul>Looking at either the LESS or Sass folder we'll see the different files required to build the library. You can choose whichever one you're most familiar with.<br /><br />For what we're trying to achieve, we can focus specifically on the "variables" and the "font-awesome" files.</div><div><br />The variables file allows us to replace the "fa-css-prefix" variable.</div><div>By default, it's set to "fa", but let's change it to something different like "fawe".</div><div><br /></div><div>Then, we can build the customized version of the library using the "font-awesome" file.<br /><br />You can build LESS and Sass files with most text editors. There are also many desktop applications that are able to compile LESS and Sass.</div><br /><br />Once our customized Font Awesome is built, we need to upload it to our application (either in the Static Files or on your Web Server).<br /><br /><h2>Using Font APEX and Font Awesome</h2>First, we'll need to include our custom Font Awesome library. We can add it under the Shared Components by going into the User Interface Attributes and then selecting the Desktop interface. Under the Cascading Style Sheets Section, we can add the references to our file. <br /><br />Something like this:<br /><blockquote class="tr_bq"><pre><code class="language-html">#APP_IMAGES#font-awesome/4.7.0/css/custom-font-awesome#MIN#.css</code></pre></blockquote><br />Using Font APEX will be just as usual. Use the corresponding "fa" class as seen on <br /><div class="shortcut-url"><a href="https://apex.oracle.com/fontapex" target="_blank">https://apex.oracle.com/fontapex </a></div><blockquote class="tr_bq"><pre><code class="language-html">&lt;i class="fa fa-cog" aria-hidden="true"&gt;&lt;/i&gt;<br />&lt;i class="fa fa-trash-o" aria-hidden="true"&gt;&lt;/i&gt;<br />&lt;i class="fa fa-bars" aria-hidden="true"&gt;&lt;/i&gt;<br />&lt;i class="fa fa-envelope-o" aria-hidden="true"&gt;&lt;/i&gt;<br />&lt;i class="fa fa-key" aria-hidden="true"&gt;&lt;/i&gt;<br />&lt;i class="fa fa-shopping-cart" aria-hidden="true"&gt;&lt;/i&gt;<br />&lt;i class="fa fa-battery-half" aria-hidden="true"&gt;&lt;/i&gt;<br /></code></pre></blockquote><br />In order to use our customized Font Awesome, we will need to use our custom class prefix. In our case: "fawe". <br /><blockquote class="tr_bq"><pre><code class="language-html">&lt;i class="fawe fawe-cog" aria-hidden="true"&gt;&lt;/i&gt;<br />&lt;i class="fawe fawe-trash-o" aria-hidden="true"&gt;&lt;/i&gt;<br />&lt;i class="fawe fawe-bars" aria-hidden="true"&gt;&lt;/i&gt;<br />&lt;i class="fawe fawe-envelope-o" aria-hidden="true"&gt;&lt;/i&gt;<br />&lt;i class="fawe fawe-key" aria-hidden="true"&gt;&lt;/i&gt;<br />&lt;i class="fawe fawe-shopping-cart" aria-hidden="true"&gt;&lt;/i&gt;<br />&lt;i class="fawe fawe-battery-half" aria-hidden="true"&gt;&lt;/i&gt;<br /></code></pre></blockquote>You'll then be able to use both at the same time, like this:<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-KUTIw5qWAnA/Wm9pmQK60uI/AAAAAAAABmY/4BlXI-f8P-kAXFSabBEButVHXcaLtSioQCLcBGAs/s1600/Icons.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="144" data-original-width="687" height="132" src="https://2.bp.blogspot.com/-KUTIw5qWAnA/Wm9pmQK60uI/AAAAAAAABmY/4BlXI-f8P-kAXFSabBEButVHXcaLtSioQCLcBGAs/s640/Icons.png" width="640" /></a></div><br /><br />You can have a look at it in action in my&nbsp;<a href="http://max-playground.no-ip.org/ords/f?p=DEMO:2000" target="_blank">Demo Application</a><br /><br class="Apple-interchange-newline" />You can also get the custom Font Awesome library: <a href="https://drive.google.com/file/d/10b9jedIyqSNzOKdvF7HR3xFRkE85zG7a" rel="nofollow" target="_blank">here</a><br /><br class="Apple-interchange-newline" />Enjoy! Maxime Tremblay tag:blogger.com,1999:blog-267713902572011003.post-7853250139830189544 Mon Jan 29 2018 13:49:00 GMT-0500 (EST) Alternative Look for Disabled Buttons http://vmorneau.me/disabled-buttons/ <div class="kg-card-markdown"><p>Recently I was told that the disabled buttons in our Universal Theme application were not... <em>disabled enough</em>.</p> <p><img src="http://vmorneau.me/content/images/2018/01/normal.png" alt="normal"></p> <p>And I have to agree in a way. If that button was the <em>only</em> button visible on the page, it could be seen as the application's default color scheme.</p> <p>So we added some very simple CSS:</p> <pre><code class="language-css">.a-Button.is-disabled, .a-Button[disabled], .t-Button.is-disabled, .t-Button[disabled] { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAIklEQVQIW2NkQAKrVq36zwjjgzhhYWGMYAEYB8RmROaABADeOQ8CXl/xfgAAAABJRU5ErkJggg==) repeat; color: #6a6a6a; } </code></pre> <p>Here's what a disabled button looks now:</p> <p><img src="http://vmorneau.me/content/images/2018/01/alternative.png" alt="alternative"></p> <p>There's no way to confuse them anymore.</p> <p>Demo: <a href="https://apex.oracle.com/pls/apex/f?p=113646:1">https://apex.oracle.com/pls/apex/f?p=113646:1</a></p> <hr> <p>Enjoy these APEX CSS tricks? Let me know and I'll post more.</p> <p><a href="http://vmorneau.me/css">Head here to see them all.</a></p> </div> Vincent Morneau 5a4ad4e1704b930df0de23c1 Mon Jan 29 2018 09:58:25 GMT-0500 (EST) APEX Programmatic Spectrum http://www.grassroots-oracle.com/2018/01/apex-programmatic-spectrum.html I listened to a session by Joel Kallman, and found myself thinking hard about this slide on the programmatic spectrum, diving into the concept of “low code” vs “high control”.<br /><br />(From around 14 minute mark&nbsp;<a href="https://youtu.be/PZBXFjycoIo?t=14m26s">https://youtu.be/PZBXFjycoIo?t=14m26s</a>)<br /><br /><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-sIjGv5oQMAs/Wk8bDEspr9I/AAAAAAAATiQ/XyTzsaXKdqsSlmvOAOGbYxWZNiDzQYvKACLcBGAs/s1600/joel_connect.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="410" data-original-width="651" src="https://1.bp.blogspot.com/-sIjGv5oQMAs/Wk8bDEspr9I/AAAAAAAATiQ/XyTzsaXKdqsSlmvOAOGbYxWZNiDzQYvKACLcBGAs/s1600/joel_connect.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Such a good representation of the spectrum of APEX components</td></tr></tbody></table><br />I guess you might say tasks in the yellow end take longer to configure, and are difficult to maintain, particularly for someone new coming in, for instance:<br />At the green end, defining Authentication is very click-click-click, done. No code required.<br />Around the middle, using Authorisation schemes can also be declarative, but with a little tweaking, can give a decent level of control.<br />And to the right, for Custom authentication, while a typical package may look similar to the next, it’s driven with raw PL/SQL, but gives the developer high level of control.<br /><div><br /></div>Some other interesting claims in the seminar include APEX meeting the NIST needs of cloud computing from 2002. Remember, we didn’t even have Google Suggest <a href="http://www.grassroots-oracle.com/2017/12/exploring-ajax-presentation.html" target="_blank">until 2005</a>.<br /><br />And an application exported from 2008 still runs in 2017, many APEX versions later, looking and behaving the same.<br />As a developer familiar with the aims of the APEX upgrade process, this does not surprise me at all. What I didn’t consider was how much of a feat this is in the world of development.<br /><br />Pretty impressive when considering version difficulties I've heard with products like JDev.<br />I realise that's comparing apples to toaster ovens, but it's a high bar that's set. Onya APEX team.<br /><br /><i>And</i> the IDE is delivered via a browser :) Scott Wesley tag:blogger.com,1999:blog-4818542164384221282.post-5737296955644262586 Mon Jan 29 2018 08:50:00 GMT-0500 (EST) Single Item CSS Grid Alignment https://rimblas.com/blog/2018/01/single-item-css-grid-alignment/ <p>I often need to have a single item on a page (think a search item above a report for example). I would like this item’s label to still align to the right, but be flush with the left side of the report. Like so:<br /> <a href="https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment.png"><img src="https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-300x153.png" alt="" width="300" height="153" class="aligncenter size-medium wp-image-967 colorbox-966" srcset="https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-300x153.png 300w, https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-100x51.png 100w, https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-150x77.png 150w, https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-200x102.png 200w, https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment.png 347w" sizes="(max-width: 300px) 100vw, 300px" /></a></p> <p>However, with the current CSS grid implementation of the Universal Theme, this type of layout is not possible in a declarative way. Depending on the screen size, you always end up with some extra space.</p> <p>Here’s a little bit of CSS that I find myself using a lot. If your item is called <code>P310_SEARCH</code> you will want to add the <code>_CONTAIER</code> suffix:</p> <p></p><pre class="crayon-plain-tag">#P310_SEARCH_CONTAINER .t-Form-labelContainer { width: auto; }</pre><p></p> <p>It basically finds the <code>div</code> for the label and changes the with to whatever the grid wants (a fixed percent) to automatic. By making it automatic, the width will now be the length of the label.</p> <p><a href="https://apex.oracle.com/pls/apex/f?p=46011:310">Demo</a></p> <p>Here’s the end result with the CSS<br /> <a href="https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment.png"><img src="https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment.png" alt="" class="aligncenter size-medium wp-image-967 colorbox-966" srcset="https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment.png 347w, https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-300x153.png 300w, https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-100x51.png 100w, https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-150x77.png 150w, https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-200x102.png 200w" sizes="(max-width: 347px) 100vw, 347px" /></a></p> <p>and without the extra CSS:<br /> <a href="https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-1.png"><img src="https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-1.png" alt="" class="aligncenter size-full wp-image-974 colorbox-966" srcset="https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-1.png 347w, https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-1-300x153.png 300w, https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-1-100x51.png 100w, https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-1-150x77.png 150w, https://rimblas.com/blog/wp-content/uploads/2018/01/single-item-alignment-1-200x102.png 200w" sizes="(max-width: 347px) 100vw, 347px" /></a></p> Jorge Rimblas https://rimblas.com/blog/?p=966 Mon Jan 29 2018 08:02:55 GMT-0500 (EST) Authenticate APEX via Token http://www.oracle-and-apex.com/authenticate-apex-via-token/ <p>This requirement pops up every now and then, time to put it in a blogpost so I can find it myself again when needed :-)</p> <p>In various integration scenarios it is required to have users swiftly move between applications written in various technologies. This is very common for legacy Forms applications where some functionality is moved to APEX. From the Forms menu one entry could open a Form, another one an APEX page.</p> <p><span id="more-1386"></span></p> <p>But this is just one example, basically the idea is to auto-logon a user to an APEX app just by providing a one-time token.</p> <p>To be able to do that, we need a token table at first. Something like this will do:</p> <pre>Name Null? Type ------------ ----- ------------- TOKEN_STRING VARCHAR2(200) USERNAME VARCHAR2(200) CREATED_AT DATE USED_AT DATE</pre> <p>This table stores the very basic information we need: the token itself, the username it should be mapped to, the time it was created and when it was used.</p> <p>Next we need a way to authenticate using a token. There are 2 possible solutions, either using the Page Sentry Function, or the Invalid Session Function. Let&#8217;s look at both:</p> <h2>Page Sentry Function</h2> <p>In Shared Components &gt; Authentication Schemes we create a new custom scheme.</p> <p><a href="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-27-at-12.32.47.png"><img class="aligncenter size-full wp-image-1388" src="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-27-at-12.32.47.png" alt="" width="1027" height="826" /></a>The code for Token_Sentry_Function looks something like this:</p> <pre class="brush: sql"> FUNCTION TOKEN_SENTRY_FUNCTION RETURN BOOLEAN IS l_query_string VARCHAR2(4000) := SYS.OWA_UTIL.GET_CGI_ENV(&#039;QUERY_STRING&#039;); l_token VARCHAR2(200); l_username VARCHAR2(200); l_session NUMBER; BEGIN -- URL for testing http://localhost:8080/ords/f?p=116:1&amp;x01=TOKEN:ABC -- don&#039;t do anything if user is already logged on IF APEX_APPLICATION.G_USER &lt;&gt; &#039;nobody&#039; THEN RETURN TRUE; END IF; -- grab the token value l_token := REGEXP_SUBSTR ( srcstr =&gt; l_query_string , pattern =&gt; &#039;&amp;X01=TOKEN:([^&amp;]+)&#039; , modifier =&gt; &#039;i&#039; , subexpression =&gt; 1 ); -- QUERY_STRING contains something like p=116:1&amp;x01=TOKEN:ABC IF l_token IS NOT NULL THEN -- test token, see if it is -- 1) found in token table -- 2) unused -- 3) still valid (max age x seconds) SELECT USERNAME INTO l_username FROM RAG_TOKEN WHERE TOKEN_STRING = l_token -- AND USED_AT IS NULL -- AND CREATED_AT &lt; SYSDATE-1/24/60 ; -- mark token as used at current time UPDATE RAG_TOKEN SET USED_AT = SYSDATE WHERE TOKEN_STRING = l_token ; -- is there already a session? l_session := APEX_CUSTOM_AUTH.GET_SESSION_ID_FROM_COOKIE; IF l_session IS NOT NULL THEN -- test if the session is still valid and get a new session id, if not valid IF NOT APEX_CUSTOM_AUTH.IS_SESSION_VALID THEN l_session := APEX_CUSTOM_AUTH.GET_NEXT_SESSION_ID; END IF; ELSE -- no session in cookie found, get a new session id l_session := APEX_CUSTOM_AUTH.GET_NEXT_SESSION_ID; END IF; -- initialize the session APEX_CUSTOM_AUTH.DEFINE_USER_SESSION ( l_username, l_session); RETURN TRUE; END IF; RETURN FALSE; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN FALSE; END; </pre> <p>What does this function do? The Page Sentry Function is used to determine whether the current session is valid, or not. It is invoked by APEX to find out if a login is necessary. For our requirement this is perfect, because we can instantiate a session if the given token is valid, and get APEX to show the login-screen if token is invalid or not present.</p> <p>Let&#8217;s walk through the function and explain what we do:</p> <p>Line 4 grabs the URL. We need to do it this way, because in the Page Sentry Function we cannot access Page or Application Items (or APEX_APPLICATION.g_x01), since they haven&#8217;t been initialized by APEX, at this point in time.</p> <p>Lines 12-15 are used for any subsequent page-load after a session has been established using either regular login or a token authentication. It pretty much says, don&#8217;t bother doing anything if a session is already active.</p> <p>Line 18 grabs the token value out of the query string. Remember, there could be multiple parameters, like &amp;x02 or &amp;cs and such.</p> <p>Line 32 validates the token against our table. This is the place to set up all kind of checks, like if the token was already used, how old it is, and so on.</p> <p>Line 41 sets the used timestamp in the token table.</p> <p>Lines 47-60 try to reuse an existing session-id. If no session exists, or it isn&#8217;t valid anymore, a new one will be created.</p> <p>Line 63 tells APEX to define a session for given username.</p> <p>That was easy, right?</p> <h2>Invalid Session Function</h2> <p>The second possible solution for token based authentication is by using the Invalid Session Function.</p> <p><a href="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-28-at-10.18.42.png"><img class="aligncenter size-full wp-image-1405" src="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-28-at-10.18.42.png" alt="" width="438" height="561" /></a></p> <pre class="brush: sql"> PROCEDURE TOKEN_INVALID_SESSION IS l_query_string VARCHAR2(4000) := SYS.OWA_UTIL.GET_CGI_ENV(&#039;QUERY_STRING&#039;); l_token VARCHAR2(200); l_username VARCHAR2(200); l_session NUMBER; BEGIN -- URL for testing http://localhost:8080/ords/f?p=116:1&amp;x01=TOKEN:ABC -- grab the token value l_token := REGEXP_SUBSTR ( srcstr =&gt; l_query_string , pattern =&gt; &#039;&amp;X01=TOKEN:([^&amp;]+)&#039; , modifier =&gt; &#039;i&#039; , subexpression =&gt; 1 ); -- QUERY_STRING contains something like p=116:1&amp;x01=TOKEN:ABC IF l_token IS NOT NULL THEN -- test token, see if it is -- 1) found in token table -- 2) unused -- 3) still valid (max age x seconds) SELECT USERNAME INTO l_username FROM RAG_TOKEN WHERE TOKEN_STRING = l_token -- AND USED_AT IS NULL -- AND CREATED_AT &lt; SYSDATE-1/24/60 ; -- mark token as used at current time UPDATE RAG_TOKEN SET USED_AT = SYSDATE WHERE TOKEN_STRING = l_token ; APEX_AUTHENTICATION.POST_LOGIN ( p_username =&gt; l_username , p_password =&gt; null , p_uppercase_username =&gt; true ); END IF; END; </pre> <p>It looks very similar to our first approach, the big difference is that his procedure will be invoked by APEX only if there is no or an invalid session and that it will create a new session with every call.</p> <p>Line 39 tells APEX that the given username is alright and automatically logged on.</p> <p>Starting with APEX 5.1.4 it is possible to use :APP_AJAX_X01 instead of manually parsing the query string in the Invalid Session Function.</p> <p>Using X01 (or any other Xxx Parameter) has a big advantage over using a Page or Application Item: it doesn&#8217;t conflict with any kind of Session State Protection.</p> <p>The early adopter version of APEX 5.2 also shows a new API called APEX_JWT, which can generate and verify JSON Web Tokens. This can also be helpful, but that will be another blogpost&#8230;</p> <p>Here is a demo:</p> <div style="width: 584px;" class="wp-video"><!--[if lt IE 9]><script>document.createElement('video');</script><![endif]--> <video class="wp-video-shortcode" id="video-1386-1" width="584" height="343" preload="metadata" controls="controls"><source type="video/mp4" src="http://www.oracle-and-apex.com/blog/wp-content/uploads/token-authenticate-example.mp4?_=1" /><a href="http://www.oracle-and-apex.com/blog/wp-content/uploads/token-authenticate-example.mp4">http://www.oracle-and-apex.com/blog/wp-content/uploads/token-authenticate-example.mp4</a></video></div> <p>A big thank you goes out to <a href="https://chrisonoracle.wordpress.com/" target="_blank">Christian Neumüller</a>, for ever awesome answers to all my questions.</p> <img src="http://www.oracle-and-apex.com/blog/?ak_action=api_record_view&id=1386&type=feed" alt="" /> Peter Raganitsch http://www.oracle-and-apex.com/?p=1386 Sun Jan 28 2018 04:31:10 GMT-0500 (EST) Power Ranking Oracle APEX 5.2 New Features – January https://www.insum.ca/power-ranking-oracle-apex-5-2-new-features-january/ <div class="vc_row wpb_row vc_row-fluid"><div class="inner"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner "><div class="wpb_wrapper"> <div class="wpb_text_column wpb_content_element "> <div class="wpb_wrapper"> <div id="SAML" class="vc_row wpb_row vc_row-fluid"><div class="inner"></div></div><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner "><div class="wpb_wrapper"></div></div></div> <div class="wpb_text_column wpb_content_element "> <div class="wpb_wrapper"> </div> </div> <h2 style="text-align: left !important; margin-left: 0px !important;"><strong><span style="color: #8ec63f;">Power Ranking Oracle APEX 5.2 New Features &#8211; January</span></strong></h2> <p>Oracle APEX 5.2  may be considered a minor release, but it promises <a href="http://www.oracle.com/technetwork/testcontent/apex-sod-087560.html">major functionality enhancements</a>.  Which of these will move the needle?</p> <p>Each month, we&#8217;ll power rank the rumored enhancements ahead of Oracle APEX 5.2&#8217;s GA release. We&#8217;ll take the pulse of the <a href="https://apex.oracle.com/pls/apex/f?p=411:1">APEX community</a>, monitoring comments, talking to you all and gauging the interest, enthusiasm and expected impact of each of these enhancements. If you&#8217;re looking forward to a particular feature, make sure to tweet or blog about it. It just may affect the rankings!</p> <p>Let&#8217;s get started!</p> <p><i>Editor&#8217;s note: Power Rankings are based on a preponderance of social media.  If you have an issue with these Oracle APEX 5.2 rankings, or have a question or comment for Monty Latiolais, </i><i>send him an <a href="mlatiolais@insum.ca">e-mail</a> or contact him via <a href="https://twitter.com/monty_latiolais">Twitter</a>.</i></p> <div style="margin: 10px;"> <hr /> <ol style="color: #cccccc; list-style-type: none;"> <li style="list-style-type: none;"> <ol style="color: #cccccc; list-style-type: none;"> <li style="list-style-type: none;"> <ol style="color: #cccccc; list-style-type: none;"> <li style="list-style-type: none;"> <ol style="color: #cccccc; list-style-type: none;"> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">16</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>Advisor Improvements</h2> <div style="font-size: 12px;"> <ul> <li>New Accessibility checks to check your apps for common accessibility issues</li> <li>New Performance check for inclusion of compatibility JavaScript</li> </ul> </div> </div> </li> </ol> </li> </ol> </li> </ol> <ol style="color: #cccccc; list-style-type: none;"> <li style="list-style-type: none;"> <ol style="color: #cccccc; list-style-type: none;"> <li style="list-style-type: none;"> <ol style="color: #cccccc; list-style-type: none;"> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">15</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>Item Type Improvements</h2> <div style="font-size: 12px;"> <ul> <li>New &#8216;Text with Autocomplete&#8217; item type using Oracle JET</li> </ul> </div> </div> </li> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">14</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>List View Region</h2> <div style="font-size: 12px;"> <ul> <li>The List View region from the deprecated mobile UI is support on desktop UI. See the known issues for current limitations.</li> </ul> </div> </div> </li> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">13</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>Tree Region Enhancements</h2> <div style="font-size: 12px;"> <ul> <li>The Advanced: JavaScript Initialization Code attribute is supported. Although the attribute was added in 5.1 it did not do anything. So it is as if it is a new attribute in Oracle APEX 5.2. This plus the jsdoc makes it much easier to customize the Tree region.</li> <li>Something that will be needed now that jsTree is removed.</li> <li>Added Default Icon attribute. Allow Icon Type to be empty (without forcing a-Icon).</li> <li>Improved Page Designer help text for all attributes.</li> <li>Support Dynamic Action Event Selection Change [Tree].</li> <li>Advanced Config option (nodeSelector) to support checkbox selection.</li> <li>Tree region now supports the apex.region API.</li> <li>Copy selection to clipboard</li> </ul> </div> </div> </li> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">12</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>Additional JET Charts</h2> <div style="font-size: 12px;"> <ul> <li>Gantt &#8211; based on Oracle JET Gantt</li> <li>Box Plot ( aka Box &amp; Whisker )</li> <li>Pyramid</li> <li>Sample Charts app &#8211; revised with new examples</li> </ul> </div> </div> </li> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">11</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>Text message substitutions</h2> <div style="font-size: 12px;"> <ul> <li>For a given text message MY_MESSAGE, you can now use and v(&#8216;APP_TEXT$MY_MESSAGE&#8217;) to retrieve the message text.</li> <li>Use APP_TEXT$MY_MESSAGE$XX to return the translation text for language XX (examples for XX are DE, FR, &#8230;)</li> <li>Same syntax is supported on the client via the apex.util.applyTemplate API</li> </ul> </div> </div> </li> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">10</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>APEX Spotlight Search</h2> <div style="font-size: 12px;"> <ul> <li>Provides quick navigation and unified search experience across APEX</li> <li>Activate by clicking search button from header, or using the keyboard shortcut Ctrl + &#8216;</li> <li>You can navigate to most screens within APEX builder</li> <li>Quickly jump across applications and pages</li> <li>Also works in Page Designer – can focus on page components</li> </ul> </div> </div> </li> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">9</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>Oracle JET and jQuery Library Upgrades</h2> <div style="font-size: 12px;"> <ul> <li>JET 4.1.0</li> <li>jQuery 3.1.1</li> <li>jQuery UI 1.12.0</li> <li>jsTree 3rd party library is removed because it is incompatible with new versions. Tree regions will be converted to use the APEX treeView widget.</li> <li>FullCalendar 3.3.1</li> </ul> </div> </div> </li> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">8</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>New Authentication</h2> <div style="font-size: 12px;"> <ul> <li>OAuth2 authentication for APEX Applications and the APEX Development Environment</li> </ul> </div> </div> </li> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">7</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>JavaScript API Documentation</h2> <div style="font-size: 12px;"> <ul> <li>Preview of JavaScript API documentation</li> </ul> </div> </div> </li> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">6</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>Developer Toolbar Improvements</h2> <div style="font-size: 12px;"> <ul> <li>When there is a JavaScript error on the page an indicator is added to the dev toolbar</li> <li>New feature to see page performance timing. Menu Page Info &gt; Show Page Timing. Show/Hide Layout Columns moved to Page Info menu.</li> </ul> </div> </div> </li> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">5</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>REST Enabled SQL Support</h2> <div style="font-size: 12px;"> <ul> <li>Create and maintain references to REST Enabled SQL instances (Oracle REST Data Services) in Shared Components</li> <li>Use a REST Enabled SQL Service and therefore a remote Oracle database as the data source for Classic Reports, Interactive Reports, Oracle JET Charts or CSS Calendar</li> <li>Execute PL/SQL page processes on a remote Oracle database</li> <li>Use the APEX_EXEC PL/SQL package to execute SQL Queries or PL/SQL blocks on a remote database, from within your custom PL/SQL code.</li> </ul> </div> </div> </li> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">4</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>Interactive Grid Enhancements</h2> <div style="font-size: 12px;"> <ul> <li>Copy Down support and range selection; see new Actions &gt; Selection sub menu (Fill and Clear)</li> <li>Copy to Clipboard (for row or cell range selections)</li> <li>Expose additional events to Dynamic Actions</li> </ul> </div> </div> </li> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">3</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>Page Designer Improvements</h2> <div style="font-size: 12px;"> <ul> <li style="list-style: circle !important;">Property Editor <ul type="square"> <li>Updated UI to improve usability</li> <li>Removed show common / show all, and collapse all / expand all functionality</li> <li>When a property has focus, the group becomes highlighted</li> <li>Improved &#8216;Go to group&#8217; functionality</li> </ul> </li> <li style="list-style: circle !important;">Sticky Filters <ul type="square"> <li>Filters can now be pinned so you can filter on something and click across to other components maintaining the filter</li> </ul> </li> </ul> </div> </div> </li> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">2</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>REST Service Consumption</h2> <div style="font-size: 12px;"> <ul> <li>Create and maintain references to REST services (Web Source Modules) within Shared Components</li> <li>Leverage Oracle REST Data Services features like server-side filtering or pagination to fetch only required data from the REST service</li> <li>Use Simple HTTP for generic REST services, JSON or XML data feeds</li> <li>Have Application Express automatically discover and maintain the Data Profile; no manual SQL or PL/SQL coding is required for JSON or XML parsing</li> <li>Use Web Sources as the data source for Classic Reports, Interactive Reports, Oracle JET Charts or the CSS Calendar</li> <li>Use the APEX_EXEC PL/SQL package in order to invoke REST services from within custom PL/SQL code in Plug-Ins or page processes.</li> </ul> </div> </div> </li> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"><span style="font-size: 36px; position: absolute;">1</span> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <h2>New Create App Wizard</h2> <div style="font-size: 12px;"> <ul> <li>New and improved user experience for creating applications</li> <li>Simpler wizards for creating pages</li> <li>Add common frameworks or &#8220;features&#8221; to applications such as activity reporting, access control, theme selection and more</li> <li>Customize user interface options such as Theme Style, application icon and page icons</li> <li>Leverage existing applications or UI defaults to default labels and form display types</li> </ul> </div> </div> </li> </ol> </li> </ol> </li> </ol> </li> </ol> </div> <p>&nbsp;</p> <ol style="color: #cccccc; list-style-type: none;"> <li style="list-style-type: none;"> <ol style="color: #cccccc; list-style-type: none;"> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <div style="font-size: 12px;"></div> </div> </li> </ol> </li> </ol> <blockquote> <ol style="color: #cccccc; list-style-type: none;"> <li style="list-style-type: none;"> <ol style="color: #cccccc; list-style-type: none;"> <li style="font-family: helvetica, verdana, sans-serif; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: bold; line-height: 1.5; margin-bottom: 20px; position: relative;"> <div style="color: #555555; font-family: helvetica, sans-serif; font-stretch: normal; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; line-height: 1.5; padding-left: 60px;"> <div style="font-size: 12px;"> <p>&nbsp;</p> <p><img class="alignleft wp-image-9591 " src="https://www.insum.ca/wp-content/uploads/2018/01/HS_JackieMcIlroy-e1516114584854-450x450.jpg" alt="" width="279" height="279" srcset="https://www.insum.ca/wp-content/uploads/2018/01/HS_JackieMcIlroy-e1516114584854-450x450.jpg 450w, https://www.insum.ca/wp-content/uploads/2018/01/HS_JackieMcIlroy-e1516114584854-150x150.jpg 150w, https://www.insum.ca/wp-content/uploads/2018/01/HS_JackieMcIlroy-e1516114584854-300x300.jpg 300w, https://www.insum.ca/wp-content/uploads/2018/01/HS_JackieMcIlroy-e1516114584854-600x600.jpg 600w, https://www.insum.ca/wp-content/uploads/2018/01/HS_JackieMcIlroy-e1516114584854-100x100.jpg 100w, https://www.insum.ca/wp-content/uploads/2018/01/HS_JackieMcIlroy-e1516114584854.jpg 720w" sizes="(max-width: 279px) 100vw, 279px" />&#8220;A blueprint is an application definition in JSON format. Oracle APEX 5.2&#8217;s <strong>new blueprint wizard</strong> allows you to quickly create an application with any number of standard page types and many additional features, including Access Control, Feedback, Email Framework, and Activity Reporting. Once generated, a blueprint can be modified (either manually by editing the JSON or graphically by loading it back in to the wizard) and reused to easily and quickly create additional, fully supported applications. Using a blueprint is the fastest and most low code way to build an Oracle APEX Application.&#8221;</p> <p style="text-align: right;"><em>&#8212; Jackie McIlroy at Insum Solutions</em></p> </div> <p>&nbsp;</p> </div> </li> </ol> </li> </ol> </blockquote> </div> </div> </div></div></div></div></div> <p>The post <a rel="nofollow" href="https://www.insum.ca/power-ranking-oracle-apex-5-2-new-features-january/">Power Ranking Oracle APEX 5.2 New Features &#8211; January</a> appeared first on <a rel="nofollow" href="https://www.insum.ca">Insum</a>.</p> Monty Latiolais https://www.insum.ca/?p=9568 Thu Jan 25 2018 14:41:53 GMT-0500 (EST) Querying an Oracle Database Using Amazon Alexa http://www.explorer.uk.com/querying-an-oracle-database-using-amazon-alexa/ <p>At the UKOUG Tech17 conference last year, I delivered a presentation called APEX and the Internet of Things. As part of this presentation, I wanted to demonstrate how to query the database and navigate an APEX application using voice commands. If you were there and visited our stand then you might have also seen our registration application, which allowed users to search for their name and then register themselves to win a prize.</p> <p>We have been looking in to real world use cases for data retrieved using voice commands, and we have seen that there is room for some useful applications in places where hands-on work might mean that you don’t always have access to a device to view your application. For example, a server room could contain an Amazon Echo that responds with various information about the servers and environments hosted on them when asked.</p> <p>This blog will show you how to get up and running with this and create an Alexa skill that queries your Oracle database.</p> <p>There are three main building blocks needed to get this working in its simplest form:</p> <ul> <li>ORDS Web Service (configured either in APEX or on the database).</li> <li>AWS Lambda function (anonymous function).</li> <li>Alexa Skill.</li> </ul> <p>These building blocks fit together something like this:</p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/01/Alexa.png" rel="lightbox[6451]"><img class="aligncenter size-full wp-image-6452" src="http://www.explorer.uk.com/wp-content/uploads/2018/01/Alexa.png" alt="" width="156" height="691" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/01/Alexa.png 156w, http://www.explorer.uk.com/wp-content/uploads/2018/01/Alexa-68x300.png 68w" sizes="(max-width: 156px) 100vw, 156px" /></a></p> <p>I’ve compiled some step-by step instructions to help you create the three different elements and fit them together. You can find the instructions in the following application:</p> <p><a href="https://goo.gl/1GdX2m" target="_blank" rel="noopener">https://goo.gl/1GdX2m</a></p> <p>Username: demo<br /> Password: demo</p> <p>The example includes a simple web service I created to count the number of orders in a table, but you can replace this with anything you like. The query in your web service can be as complicated as you like &#8211; Itis here that you will be able to use your existing Oracle knowledge to create Alexa skills that are meaningful to you based on your own data.</p> <p>Keep checking the blog for part two where I will demonstrate how to interact with an APEX application UI using Alexa voice commands.</p> <p>The post <a rel="nofollow" href="http://www.explorer.uk.com/querying-an-oracle-database-using-amazon-alexa/">Querying an Oracle Database Using Amazon Alexa</a> appeared first on <a rel="nofollow" href="http://www.explorer.uk.com">Explorer | Award Winning UK Oracle Partner</a>.</p> admin http://www.explorer.uk.com/?p=6451 Wed Jan 24 2018 10:51:49 GMT-0500 (EST) Dynamic Navigation Bar http://dickdral.blogspot.com/2018/01/dynamic-navigation-bar.html In my current assignment I work on a large number of applications. These applications all share the same UI theme. Once logged in you can switch applications through an application menu.&nbsp;<div>The navigation bar in all these applications is (or should be) the same. Until today each application had his own copy of the Desktop Navigation Bar which is in fact an Oracle APEX list.&nbsp;</div><div>As the number of applications is approaching double digits you can imagine I would like one code base for the navigation bar content.&nbsp;</div><div><br /></div><div>In the <b>Shared Components &gt; User Interface Components &gt; User Interface Details </b>you can find the details of the Navigation Bar:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-f-SfJfmDS4Y/WmgZeWtU8JI/AAAAAAAAAmg/r6K8l4yi6oIAA5Rx_yytbdXPeGjtcwohgCLcBGAs/s1600/Schermafbeelding%2B2018-01-24%2Bom%2B06.27.54.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="646" data-original-width="1600" height="256" src="https://4.bp.blogspot.com/-f-SfJfmDS4Y/WmgZeWtU8JI/AAAAAAAAAmg/r6K8l4yi6oIAA5Rx_yytbdXPeGjtcwohgCLcBGAs/s640/Schermafbeelding%2B2018-01-24%2Bom%2B06.27.54.png" width="640" /></a></div><div>Here you see that the list on which the Navigation bar is based can be changed. The template can also be chosen, but the current template is sufficient for this moment.&nbsp;</div><div><br /></div><div>Unfortunately we cannot reference lists in other applications, only copying is possible.&nbsp;</div><div>But we can define a dynamic list to populate the Navigation Bar. This opens the door to defining the list as a query or view in the database, which can be shared between applications.&nbsp;</div><div>I could not find the definition of the list elements needed for the Navigation Bar list, so I had to do some experimenting myself. It seems that the meaning of the columns in the query result set is determined by their position.&nbsp;</div><div>The following query results in a correct entry:</div><div><br /></div><div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">select '1'&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; as&nbsp; lvl</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp;, 'Logout'&nbsp; &nbsp; &nbsp; &nbsp;as&nbsp; label</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp;, 'apex_authentication.logout?p_app_id=&amp;p_session_id='&nbsp; as&nbsp; target</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp;, null&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;as&nbsp; attr1</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp;, 'fa-sign-out'&nbsp; as&nbsp; icon_css_class</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp;, null&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;as&nbsp; attr3</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp;, null&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;as&nbsp; attr4</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp;, ''&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;as&nbsp; badge</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp;, ''&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;as&nbsp; list_item_css_classes</span></div><div><span style="font-family: &quot;Courier New&quot;, Courier, monospace; font-size: x-small;">from&nbsp; &nbsp;dual</span></div></div><div><span style="font-family: &quot;Courier New&quot;, Courier, monospace; font-size: x-small;">where&nbsp; nvl(v('APP_USER'),'nobody') != 'nobody'</span></div><div><br /></div><div>In this query the <b>label</b> is the text displayed in the entry.&nbsp;</div><div>The <b>target</b> is the URL to be linked to.&nbsp;</div><div>The <b>icon_css_class</b> can contain a reference to a Font Awesome/Apex icon. If omitted no icon is shown.&nbsp;</div><div>For some columns I did not find any use, but as the meaning is positional these columns are needed anyway.&nbsp;</div><div>The entries are implemented as an HTML UL element (unordered list). The <b>list_item_css_classes </b>can contain CSS classes for the list item that contains the entry. These classes can for example be used to apply a color to the entry text and icon.&nbsp;</div><div><br /></div><div>You can build a query by connecting a number of selects from dual of the above form. But this results in a long messy query which is hard to maintain. Luckily a APEX list can also be based on a PL/SQL function returning a query. So the query can be composed in PL/SQL which enables more clean coding. A package is defined with procedures to add an navigation bar entry and to return an APEX url.&nbsp;</div><div>The code to generate the query in PL/SQL looks like this:&nbsp;</div><div><br /></div><div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; function navigation_bar_query return varchar2 is</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; l_target&nbsp; &nbsp; &nbsp; varchar2(1000) := null;</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; begin</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; -----------------------------------------------------&nbsp; &nbsp;&nbsp;</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; -- logout entry</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; l_target := 'apex_authentication.logout'</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ||'?p_app_id='||v('APP_ID')</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ||'&amp;p_session_id='||v('APP_SESSION');</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; add_navigation_bar_entry</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;( p_label&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=&gt;&nbsp; 'Logout'</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;, p_target&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt;&nbsp; l_target</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;, p_icon_css_classes&nbsp; &nbsp; &nbsp; &nbsp; =&gt;&nbsp; 'fa-sign-out'</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;);</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; -----------------------------------------------------&nbsp; &nbsp;&nbsp;</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; -- user entry</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; add_navigation_bar_entry</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;( p_label&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=&gt;&nbsp; initcap(v('APP_USER'))</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;, p_icon_css_classes&nbsp; &nbsp; &nbsp; &nbsp; =&gt;&nbsp; 'fa-user'</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;);</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; -----------------------------------------------------&nbsp; &nbsp;&nbsp;</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; -- applications entry</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; l_target := apex_url</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ( p_app_id&nbsp; &nbsp; &nbsp; &nbsp;=&gt;&nbsp; aut_pck.get_aut_app_id</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , p_app_page_id&nbsp; =&gt;&nbsp; 'APP_MENU'</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; );</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; add_navigation_bar_entry</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;( p_label&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=&gt;&nbsp; 'Applications'</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;, p_target&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt;&nbsp; l_target</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;, p_icon_css_classes&nbsp; &nbsp; &nbsp; &nbsp; =&gt;&nbsp; 'fa-desktop'</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;);</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; -----------------------------------------------------&nbsp; &nbsp;&nbsp;</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; -- DEVELOPMENT entry</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; if in_development_environment then</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; add_navigation_bar_entry</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;( p_label&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=&gt;&nbsp; 'DEVELOPMENT'</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;, p_icon_css_classes&nbsp; &nbsp; &nbsp; &nbsp; =&gt;&nbsp; 'fa-exclamation-circle'</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;, p_list_item_css_classes&nbsp; &nbsp;=&gt;&nbsp; 'yellow'</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;);</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; &nbsp; end if;</span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div><div><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">&nbsp; end;</span></div><div><br /></div></div><div><div>All the messy code is encapsulated in the procedures and functions.&nbsp;</div><div>Two standard entries are defined: the logout entry and the display of the username. Notice that the username is displayed using initcap. It is also possible to display the user's real name here when it is available in the database.&nbsp;</div><div><br /></div><div>Next a link to the applications menu is supplied.&nbsp;</div><div><br /></div><div>The last entry is used to notify a user that he is working in the development environment. This entry is only shown when working in the development environment which can usually be determined in SQL, for example by retrieving the database SID or service. In this way the application can be deployed to other environments unchanged.&nbsp;</div><div><br /></div><div>You can define a dynamic list using this package:&nbsp;</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-v20EHPdCz7A/Wmgj1BJMRQI/AAAAAAAAAm4/jhF7R1O8bd075XVPDGs0gUHSmoW3GvKmQCLcBGAs/s1600/Schermafbeelding%2B2018-01-24%2Bom%2B07.11.36.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="510" data-original-width="1180" height="172" src="https://1.bp.blogspot.com/-v20EHPdCz7A/Wmgj1BJMRQI/AAAAAAAAAm4/jhF7R1O8bd075XVPDGs0gUHSmoW3GvKmQCLcBGAs/s400/Schermafbeelding%2B2018-01-24%2Bom%2B07.11.36.png" width="400" /></a></div><div><br /></div><div><br /></div><div>This list can be chosen in the User Interface attributes to represent the Navigation Bar.&nbsp;</div><div><br /></div><div>The resulting Navigation Bar looks like this:&nbsp;</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-waW9ZvpXdsg/WmgjOpfiDYI/AAAAAAAAAmw/_NvHrE3L91cRqtb35yvrSwV4t2G82DNAACLcBGAs/s1600/Schermafbeelding%2B2018-01-24%2Bom%2B07.09.41.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="144" data-original-width="864" height="66" src="https://2.bp.blogspot.com/-waW9ZvpXdsg/WmgjOpfiDYI/AAAAAAAAAmw/_NvHrE3L91cRqtb35yvrSwV4t2G82DNAACLcBGAs/s400/Schermafbeelding%2B2018-01-24%2Bom%2B07.09.41.png" width="400" /></a></div><div><br /></div><div><br /></div><div><div>You can download the full code of the package&nbsp;<a href="https://www.speech2form.com/assets/downloads/nav_pck.sql" target="_blank">here</a>.&nbsp;&nbsp;</div></div><div><br /></div></div><div>Happy APEXing :-)</div><div><br /></div><div><br /></div> Dick Dral tag:blogger.com,1999:blog-4312362131290962824.post-3954694511360815319 Wed Jan 24 2018 01:22:00 GMT-0500 (EST) Oracle APEX and 12.2 upgrade http://lschilde.blogspot.com/2018/01/oracle-apex-and-122-upgrade.html <div dir="ltr" style="text-align: left;" trbidi="on"><h2 class="MsoNormal" style="line-height: normal; text-align: justify;"><b><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 18.0pt;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">Oracle APEX 5.1.<span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">x</span> and <span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">Oracle 12.2 upgrade</span></span></span></b></h2><h2 class="MsoNormal" style="line-height: normal; text-align: justify;"><b><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 18.0pt;">&nbsp;</span></b></h2><h3 class="MsoNormal" style="line-height: normal; text-align: left;"><b><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 13.5pt;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">Doc ID 2339601.1<span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"> apex_web_service issue</span></span></span></span></span></span></b></h3><h3 class="MsoNormal" style="line-height: normal; text-align: left;"></h3><h4 class="MsoNormal" style="line-height: normal; text-align: left;"><b><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 12.0pt;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><br /></span></span></span></span></b></h4><h4 class="MsoNormal" style="line-height: normal; text-align: left;">&nbsp;<span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">Oracle 12.2 </span></span><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">multiple domain certificates </span><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">issue</span></span></span></h4><br /><div style="text-align: justify;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">This is somethi<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ng to be aware of i<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">n case you are updating to Oracle 12.2 as it may require some additional changes to your PL/SQL code.&nbsp; </span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Our <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">scenario</span>, we were running <b>AP</b><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><b>EX 5.1.2</b> <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">on</span> <b>Or</b><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><b>acle 12.</b><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><b>1</b> with <b>APEXOfficePrint</b> and </span></span>wanted to <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">stage and test our 12.2 upgrade process.&nbsp;</span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">All <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">other APEX things seemed to be <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">w</span>orking fine after the upgrade until we discovered that <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">our rest service calls to AOP started to fail.&nbsp;</span></span></span></span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Digging deeper into this problem we discovered </span>there we<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">re chan<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ges in 12.2 that "broke" one of key APEX REST packages - APEX_WEB_<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">SERVICE</span>.&nbsp;</span></span></span></span></span></span></span></span><br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-09MhPUo6pzI/Wmfk4-t9fII/AAAAAAAALnQ/0ReY6t22H6sETkKQ3BSqecGqToh7qK8tQCLcBGAs/s1600/Capture12.2-.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="97" data-original-width="814" height="76" src="https://4.bp.blogspot.com/-09MhPUo6pzI/Wmfk4-t9fII/AAAAAAAALnQ/0ReY6t22H6sETkKQ3BSqecGqToh7qK8tQCLcBGAs/s640/Capture12.2-.JPG" width="640" /></a></div><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">To be <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">technically</span> clear here 12.2 changed UTL_HTTP packa<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ge definition<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"> <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">that at the end is used by apex_web_service packa<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ge. </span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">A<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">PEX uses apex<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">_web<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">_</span>service as</span></span></span></span> <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">wrapper procedure for utl_http<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">M</span>ore info <a href="https://support.oracle.com/knowledge/Middleware/2339601_1.html">here</a><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">.</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">T<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">h</span>a<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">t in the end can caused AOP to stop working</span> on our end.&nbsp;&nbsp;</span></span></span></span></span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">It is not <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">something caused b<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">y AOP and can happen to an<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">y web services call you make in your application un<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">der certain condition - <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">if </span><b>server </b></span></span></span></span><b>your databa</b><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><b>se is talking to has multi-domain certificate</b> configuration </span></span></span></span></span></span></span></span></span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">so please be aware of it</span></span></span></span></span></span></span></span>. </span></span></span></span></span></span></span></span></span></span></div><div style="text-align: justify;"><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">This is a security improvement on 12.2 <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">which <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">is </span></span>not questio<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ned</span> but definitely somethi<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">n<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">g <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">every<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">one planning to do the upgrade need to cater for</span></span>.&nbsp;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">To elabor<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ate<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">further </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>let's see some e<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">xamples.</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">1.<b> UT</b><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><b>L_HTTP</b> <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">i</span></span></span>n 12.1 and APEX 5.<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">1.2 </span>work<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">s perfectly fine</span>, </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br /><blockquote class="tr_bq"><div style="text-align: left;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">select utl_http.request( 'https://www.apexofficeprint.com/api<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">/</span>', wallet_path=&gt;'file:/mywallet') from dual;</span> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div></blockquote><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">wh<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ere <b>with 12.2 a<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">fter the upgrade</span> </b><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><b>there is now an issue and you need to run it using additional parameter https_host to make it work</b>.</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br /><div style="text-align: left;"><blockquote class="tr_bq"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">select utl_http.request( 'https://www.apexofficeprint.com/api/',wallet_path=&gt;'file:/mywallet', <b><span style="color: red;">https_host</span></b>=&gt;'www.apexrnd.be/aop') from dual;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></blockquote></div><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">or </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">mapping it directly to your top domain</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br /><div style="text-align: left;"><blockquote class="tr_bq"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">select utl_http.request( 'https://www.apexrnd.be/aop', wallet_path=&gt;'file:/mywallet') from dual;</span> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></blockquote></div><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">2. Similar for <b>apex_web_service </b><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">on 12.1 <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">a<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">nd </span></span>APEX 5.1.2 this work<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ed fine</span>&nbsp; </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br /><blockquote class="tr_bq"><div style="text-align: left;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">select apex_web_service.make_rest_request(p_url =&gt; 'https://</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">www.apexofficeprint.com/api/</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>', p_http_method =&gt; 'GET') from dual;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div></blockquote><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">In 1<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">2.2 running APEX 5.1.2 same process would fail<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"> and you <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">would have to do</span>.</span></span></span><br /><blockquote class="tr_bq"><div style="text-align: left;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">select apex_web_service.make_rest_request(p_url =&gt; 'https://</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">www.apexrnd.be/aop/</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>', p_http_method =&gt; 'GET') from dual;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>&nbsp;</span> </span></span></div></blockquote><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">So if you are planning to upgrade to 12.2 also make sure that you plan to u<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">pgrade your <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">APEX to 5.1.4 where this problem has been fixe<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">d as http<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">s_ho<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">st parameter is exposed as p_htt<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ps_h<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ost</span></span></span></span> so running<span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;"><br /></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br /><div style="text-align: left;"><a href="https://www.blogger.com/blogger.g?blogID=8185384792158425670" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><br /><blockquote><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;courier new&quot; , &quot;courier&quot; , monospace;">select apex_web_service.make_rest_request(p_url =&gt; 'https://www.apexofficeprint.com', p_http_method =&gt; 'GET') from dual;</span> </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></blockquote></div></div><div style="text-align: justify;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">would be</span> fine.&nbsp;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Going back to AOP <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">in <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">this APEX 5.1.2 combo with Oracle 12.2 this would mean that <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">your p</span>lugin config for AOP would need updating to </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-t8na_EztMHI/WmfiC1MqTPI/AAAAAAAALnA/lih_LVsnPRkMiFVifHb6TnAilf3yx_iWwCLcBGAs/s1600/Capture12.2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="295" data-original-width="635" src="https://2.bp.blogspot.com/-t8na_EztMHI/WmfiC1MqTPI/AAAAAAAALnA/lih_LVsnPRkMiFVifHb6TnAilf3yx_iWwCLcBGAs/s1600/Capture12.2.JPG" /></a></div><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Further <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">reading <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">-</span></span> <a href="http://www.orafaq.com/node/3079">Skillbuilder - John Watson's blog</a></span>. </span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Happy APEXing,</span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Lino </span></span></div></div> SLino tag:blogger.com,1999:blog-8185384792158425670.post-6301890375286962127 Wed Jan 24 2018 01:00:00 GMT-0500 (EST) Running apex (ORDS) on aws EC2 communicating with an RDS Database http://jsidler.blogspot.com/2018/01/running-apex-ords-on-aws-ec2.html *** Update 1/26/2018 ***<br />Due to the large number of reads, I can see a lot of interest in this topic... So I will make a commitment to finish this blog over the weekend 1/27/2018 with my first video step-by-step and a nice set of commands to take everyone through the process start to finish.<br /><br />I have just completed (1/24/2018) the install and yes! you can get it working.&nbsp; <br /><br />Stay tuned for a detailed blog on creating RDS Database, EC2 environment and the installation of APEX and ORDS.&nbsp; <br /><br />For now, the article on AWS was a huge help to getting it working!<br /><br /><a href="https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.APEX.html">https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.APEX.html</a><br /><br />or give me a few days and I will walk you step by step through the process.<br /><br /><br /> Gerald Sidler tag:blogger.com,1999:blog-6605807732177081806.post-7460818665040032264 Tue Jan 23 2018 17:59:00 GMT-0500 (EST) Running apex (ORDS) on aws EC2 communicating with an RDS Database http://jsidler.blogspot.com/2018/01/running-apex-ords-on-aws-ec2.html *** Update 1/26/2018 ***<br />Due to the large number of reads, I can see a lot of interest in this topic... So I will make a commitment to finish this blog over the weekend 1/27/2018 with my first video step-by-step and a nice set of commands to take everyone through the process start to finish.<br /><br />I have just completed (1/24/2018) the install and yes! you can get it working.&nbsp; <br /><br />Stay tuned for a detailed blog on creating RDS Database, EC2 environment and the installation of APEX and ORDS.&nbsp; <br /><br />For now, the article on AWS was a huge help to getting it working!<br /><br /><a href="https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.APEX.html">https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.APEX.html</a><br /><br />or give me a few days and I will walk you step by step through the process.<br /><br /><br /> Gerald Sidler tag:blogger.com,1999:blog-6605807732177081806.post-7460818665040032264 Tue Jan 23 2018 17:59:00 GMT-0500 (EST) Who used apex.oracle.com in 2017? http://joelkallman.blogspot.com/2018/01/who-used-apexoraclecom-in-2017.html A number of years ago, I provided statistics on the geographic distribution of people who used the free, evaluation service for Oracle Application Express at <a href="https://apex.oracle.com/">https://apex.oracle.com</a>.&nbsp; I did this in <a href="http://joelkallman.blogspot.com/2008/02/who-uses-apexoraclecom.html" target="_blank">2008</a>, <a href="http://joelkallman.blogspot.com/2009/09/who-uses-apexoraclecom-update.html" target="_blank">2009</a> and <a href="http://joelkallman.blogspot.com/2011/08/who-uses-apexoraclecom-as-of-august-28.html" target="_blank">2011</a>.&nbsp; It's time for an update.<br /><br />I've included a graphic of the top 30 and the full report below, and here are my observations:<br /><br /><ul><li>Since 2008, the number of visitor sessions to apex.oracle.com increased 280 times! That's not percentage, but times.&nbsp; Percentage-wise, that's&nbsp;27,985 % growth from 2008 to 2017.</li><li>In 2008, there were 1 or more visitor sessions from 122 countries/territories.&nbsp; In 2017, that number increased to 212 countries/territories</li><li>The USA, India and United Kingdom remain in the top 3.&nbsp; But the UK is barely hanging onto the #3 position.</li><li>Colombia vaulted from #11 in 2011 to #6 in 2017.&nbsp; Bangladesh jumped from #26 to #14.&nbsp; Japan jumped from #19 to #9.&nbsp; Wow!</li></ul><br />Usage of apex.oracle.com doesn't necessarily translate into usage of APEX.&nbsp; These statistics are only a measurement of who is logging into apex.oracle.com - the actual usage of APEX is far greater.&nbsp; Also, I fully anticipate the comment "...but as a percentage of population size, our country has the top usage in the world!" (here's looking at you, Netherlands).&nbsp; But just because someone's country has declined in the rankings doesn't mean that APEX isn't growing there....it's just growing in other countries too!<br /><br />Lastly, the statistics presented below are <b>sessions</b>, not to be confused with activity.&nbsp; At the time of this writing, there are&nbsp;36,133 workspaces on apex.oracle.com.&nbsp; In the past 7 days, there were&nbsp;4,643,958 page views, and&nbsp;1,808 <b>new</b> workspaces requested and approved.<br /><br />Not only is usage of <a href="https://apex.oracle.com/" target="_blank">APEX</a> growing on a global basis, but that growth is accelerating.<br /><br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-Hm1Q-zUFrhg/WmNdoMo6tfI/AAAAAAAADnA/OKjV51zJauUjluaP3ahUn6oOx2_i_WTNACLcBGAs/s1600/apex_oracle_com_usage.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1296" data-original-width="1058" height="640" src="https://1.bp.blogspot.com/-Hm1Q-zUFrhg/WmNdoMo6tfI/AAAAAAAADnA/OKjV51zJauUjluaP3ahUn6oOx2_i_WTNACLcBGAs/s640/apex_oracle_com_usage.png" width="522" /></a></div><br /><br /><br /><div style="display: block; font-family: &quot;helvetica&quot; , &quot;arial&quot; , sans-serif; font-size: 14px; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; margin: 12px auto 6px auto;"><a href="https://www.scribd.com/document/369586358/Usage-of-apex-oracle-com-in-2017#from_embed" style="text-decoration: underline;" title="View Usage of apex.oracle.com in 2017 on Scribd">Usage of apex.oracle.com in 2017</a></div><iframe class="scribd_iframe_embed" data-aspect-ratio="0.7068965517241379" data-auto-height="false" frameborder="0" height="600" id="doc_79662" scrolling="no" src="https://www.scribd.com/embeds/369586358/content?start_page=1&amp;view_mode=scroll&amp;access_key=key-ho54r85A2uBCxwptYMyd&amp;show_recommendations=true" title="Usage of apex.oracle.com in 2017" width="100%"></iframe> Joel R. Kallman tag:blogger.com,1999:blog-12214002.post-2384893940432788877 Sat Jan 20 2018 10:55:00 GMT-0500 (EST) Understanding Best Practices for Virtualizing Oracle http://www.dbaexpert.com/blog/understanding-best-practices-for-virtualizing-oracle/ <p>One of the key benefits of virtualization is the ability to achieve a high consolidation ratio, thereby getting higher utilization of the hardware. This is especially true of the CPUs, since software licenses are usually tied to the number of CPUs in the hardware. During times of heavy utilization, the environment needs to be configured to make sure VMs with SLAs have their resources protected.</p> <p>Remember best practices are recommendations which are dependent on their context. One often looks at two sources, stating a best practice that conflicts with each other. The difference can be the context. Here is a perfect example; one best practice is to never overcommit VMs running Oracle applications with stringent performance SLAs. Instead, protect the VMs with features like memory reservations, right size virtual CPUs, resource pools, allocation management mechanisms; such as Storage I/O Control (SIOC) and Network I/O Control (NIOC), etc. This is strongly recommended when virtualizing high workload intensive critical Oracle applications. The virtualized environment should be able to guarantee the resource and the Quality of Service (QoS), needed to meet the business requirements.</p> <p>Another best practice in conflict with the previous one is to allow some level of overcommitment from Oracle environments. This is a great way to leverage all the features of virtualization by squeezing every ounce of utilization from your hardware that you can.  vSphere can manage resource sharing with its algorithms for fair share CPU scheduling, memory entitlement, NIOC, SIOC, and resource pools. However, this approach requires that the virtualization team have a lot of expertise and experience managing the overcommitting of resources and at the same time, ensuring the business SLA requirements are met. Latency-sensitive environments need to perform operations at the millisecond level. In order to achieve both goals, not having the required skill set will severely affect applications, especially when the environment grows or the application encounters increased utilization.</p> <p>The best way to approach this issue is to start conservative and grow into aggressive, as and when you attain the required level of confidence with the workloads. The recommended way to go with over commitment would be:</p> <ul> <li>Overcommit your development and test environments as much as you can, staying within common sense and meeting defined requirements.</li> <li>Try not to overcommit production high profile environments, unless your expertise is ready for it. Initially, be conservative and do not overcommit production environments with SLAs. Then you can begin overcommitment of databases that do not have high utilization or strict performance SLAs. Use this strategy to build success and confidence with your users that the Oracle software will perform well in a VM.</li> <li>Once you develop the right level of expertise, you can overcommit some production environments, if you have guidelines that ensure SLAs are always met. Your team must be good with resource pools, setting DRSpriorities and rules, I/O controls (Storage and Network), and SR-IOV, etc. To say you absolutely do not overcommit production environments is a simple answer, but it is not always the correct one.    Over committing allows much higher utilization of your hardware, but requires you to be smart as to when and how you overcommit.</li> </ul> <p>&nbsp;</p> <h2>Goals of Best Practices for Virtualizing Oracle</h2> <p>A goal for best practices is to reduce the possibility of errors and minimize variables when trouble shooting.</p> <ul> <li>Develop virtualization best practices and make sure they are consistently followed.</li> <li>Build analytical skills and metricknowledge around the four areas you are virtualizing: Memory, CPU, Storage, and Networking.</li> <li>Understand dependencies and inter-dependencies of the various layers of the stack.</li> <li>Educate the DBAs about the key metrics they need to understand about the virtual infrastructure, so they can determine if it is a virtualization issue or an Oracle issue.</li> <li>Building custom widgets, using vCOPSfor DBAs, to be able to look at the virtual infrastructure the same way they would look at storage and networking in physical server environments.</li> <li>Your bench marking should allow you to create consistent and reproducible results that you can compare against. Metrics should always be quantitative.</li> <li>With VMware, develop best practices around vCenterand vCenter Operations, or the management and monitoring software you are using. Understand this is going to take time as well as the development of skill and expertise.</li> <li>The approach that since the Oracle software has no knowledge if the underlying platform is physical or virtualized, the DBAs do not need to know about the virtual infrastructure will not help solve problems. DBAs and vAdmins need to work together as a team to effectively troubleshoot issues.</li> </ul> <p>What are key metrics for virtualization? With any infrastructure it comes down to people, processes, and technology; learning to understand key metrics with tools like esxtop will be helpful. KISS (Keep It Simple Stupid) applies, because complex systems fail in complex ways. Good design is critical. It&#8217;s important to develop internal best practices, management processes, and guidelines for managing and monitoring a virtualization environment. It is vital to ensure your infrastructure management is ready to handle tier one workloads and the dynamics they can create.</p> <p>&nbsp;</p> <p>Posted by Charles Kim, VMware vExpert, Oracle ACE Director</p> ckim http://www.dbaexpert.com/blog/?p=1215 Fri Jan 19 2018 16:46:51 GMT-0500 (EST) The EBnoR Manifesto https://svenweller.wordpress.com/2018/01/19/the-ebnor-manifesto/ <h1 style="text-align:center;font-size:200%;"><span style="color:#ff0000;">The “EBnoR” Manifesto</span></h1> <p style="text-align:center;font-size:200%;">about</p> <p style="text-align:center;font-size:200%;"><strong>Edition based <span style="color:#0000ff;">not only</span> redefinition</strong></p> <p style="text-align:center;">Author: Sven-Uwe Weller</p> <p style="text-align:center;"><img data-attachment-id="6200" data-permalink="https://svenweller.wordpress.com/2018/01/19/the-ebnor-manifesto/suw_logo/" data-orig-file="https://svenweller.files.wordpress.com/2017/07/suw_logo.jpg?w=111&#038;h=111" data-orig-size="400,400" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="suw_logo" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2017/07/suw_logo.jpg?w=111&#038;h=111?w=300" data-large-file="https://svenweller.files.wordpress.com/2017/07/suw_logo.jpg?w=111&#038;h=111?w=400" class="alignnone wp-image-6200" src="https://svenweller.files.wordpress.com/2017/07/suw_logo.jpg?w=111&#038;h=111" alt="suw_logo" width="111" height="111" srcset="https://svenweller.files.wordpress.com/2017/07/suw_logo.jpg?w=111&amp;h=111 111w, https://svenweller.files.wordpress.com/2017/07/suw_logo.jpg?w=222&amp;h=222 222w, https://svenweller.files.wordpress.com/2017/07/suw_logo.jpg?w=150&amp;h=150 150w" sizes="(max-width: 111px) 100vw, 111px" /></p> <p style="text-align:center;">ceo <a href="http://www.syntegris.de/" target="_blank" rel="noopener">syntegris information solutions GmbH</a></p> <p style="text-align:center;">Germany</p> <p>&nbsp;</p> <p>&nbsp;</p> <hr /> <h2 style="text-align:center;font-size:200%;"><span style="color:#ff0000;">Mission Statement</span></h2> <p style="text-align:center;"><b>Edition based redefinition</b></p> <p style="text-align:center;">EBR &#8211; is not well known.</p> <p style="text-align:center;">It is barely used.</p> <p style="text-align:center;"><b>Edition based <em>not only</em> redefinition</b></p> <p style="text-align:center;">EBnoR &#8211; will change that.</p> <p style="text-align:center;">EBR is a tool with unique possibilities.</p> <p style="text-align:center;">EBnoR deals with cases</p> <p style="text-align:center;">beyond</p> <p style="text-align:center;">the originally intended scope.</p> <p style="text-align:center;">EBR is difficult to use.</p> <p style="text-align:center;">EBnoR is easy to use.</p> <p style="text-align:center;">EBnoR avoids complexities.</p> <p style="text-align:center;">EBnoR is powered by the strengths of EBR.</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <hr /> <h2 style="text-align:center;"><span style="color:#ff0000;">EBR Basics</span></h2> <p>Edition based redefinition is a unique feature of the Oracle database that is available since version 11.2. It can be used at <strong>no additional license costs</strong> in all database editions (EE, SE, SE1, SE2, XE).</p> <p>The term “edition” is used to describe a set of plsql based objects. Among those object types are plsql packages, views and synonyms. A complete list is here <a href="https://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_editions.htm#ADFNS99923">in the Oracle documentation</a>.</p> <p>A different edition can hold different code for the same plsql object. In essence each edition resembles a version of your database application code. EBR allows to store and <b>run different versions of your application at the same time</b>. The different code versions do exist inside the database at the same time.</p> <p>This opens up a whole set of some very special possibilities that usually do not exist in other environments. EBR allows to do an upgrade to a new application release without shutting down the application. The new code version is installed in a new edition. Currently running sessions will still work with the old release. Deployment problems can be tested using the new release. Once those issues are solved, then the new edition is made available (as the new default edition). Only when a user ends his (database) session and reconnects then the new code version from the now new default edition will be used.</p> <h3><b>distinction to VCS</b></h3> <p>EBR should not be confused with a version control system like SVN or GIT. Although there are some similarities it serves a different purpose. A version control system supports the <strong>development</strong> and deployment process for a <b>team of programmers</b>. They can store and merge code there. Forks and code branches can be used to support development that temporarily goes into different directions. Code merges allow to combine branches again. This is something that EBR can and will not do. EBR is about <b>running</b> the <b>different code versions in parallel</b>. Application end <strong>users</strong> profit from EBR, not developers. At best an edition resembles a release in the version control system.</p> <blockquote><p>Sven says:<em> A VCS saves and documents code, EBR executes code.</em></p></blockquote> <h3><b>versions of data</b></h3> <p>Data resides in tables. Tables are not editionable objects. That means two things. Changes to table structures are not editionable directly. And the data itself is not subject to code release changes. That is a good thing. The data and the code that works with the data is separated.</p> <p>Creating a new edition means that code is duplicated. Code can be duplicated easily,  duplicating data is a much bigger issue.</p> <p>Sometimes a code change requires to change existing data. This increases the complexity to run the old and the new code version at the same time. EBR offers solutions using cross-edition triggers and editioning views. How to use cross edition triggers is described in Bryn Llewellyn’s excellent white paper from 2009 (<a href="http://www.oracle.com/technetwork/articles/grid/edition-based-redefinition-1-133045.pdf">http://www.oracle.com/technetwork/articles/grid/edition-based-redefinition-1-133045.pdf</a>). Read and understand this paper first before you go on and read this manifesto.</p> <blockquote><p><i>“Executive Overview</i></p> <p><i>Large, mission critical applications built on Oracle Database 11g Release 1 and earlier versions are often unavailable for tens of hours while the application’s database objects are patched or upgraded. Oracle Database 11g Release 2 introduces edition-based redefinition, a revolutionary new capability that allows online application upgrade with uninterrupted availability of the application. When the installation of the upgrade is complete, the pre-upgrade application and the post-upgrade application can be used at the same time. Therefore an existing session can continue to use the pre-upgrade application until its user decides to end it; and all new sessions can use the post-upgrade application. As soon as no sessions are any longer using the pre-upgrade application, it can be retired. In other words, the application as a whole enjoys hot rollover from the pre-upgrade version to the post-upgrade version.</i></p> <p><i>This whitepaper explains how edition-based redefinition works, and how to write online application upgrade scripts using this capability, at the level of detail needed by engineers who will write such scripts.”</i></p></blockquote> <h2></h2> <h2></h2> <hr /> <h2 style="text-align:center;"><span style="color:#ff0000;">the current status</span></h2> <p>EBR is in the market for a long time now. Still many developers and DBAs do not know about it. If they know about it, they are not using it actively. I identified a set of problem areas that are responsible for this current status of EBR. I see possible solutions. Using EBR the focus should <b>not only</b> be on redefining the code, instead EBR can open up a set of new and unique possibilities. Zero downtime application upgrades are only one of them. I call the set of solutions “Edition based not only redefinition”  or short <b>EBnoR</b>.</p> <p><strong><em>problem areas under the influence of intelligent people </em></strong><em>(developers and DBAs)</em></p> <table> <tbody> <tr> <td>the deployment dilemma</td> <td>shortly before GO-live it is too late to think about EBR</td> </tr> <tr> <td>the design change gamble</td> <td>keep changes required by EBR at a minimum, design with EBR in mind</td> </tr> <tr> <td>the zero downtime promise</td> <td>Perfectness &#8211; if even possible &#8211; is expensive. Don&#8217;t go for perfectness, almost perfect is good enough.</td> </tr> <tr> <td>the cross edition complexity</td> <td>Cross edition triggers are needed for extrem cases. Huge effort for only a tiny result.</td> </tr> </tbody> </table> <p><em><strong>problem areas influencing decision makers </strong>(architects and project managers)</em></p> <table> <tbody> <tr> <td>the cross plattform idependency nonsense</td> <td>EBR is only available for Oracle databases</td> </tr> <tr> <td>the marketing confusion</td> <td>Editions are not license editions</td> </tr> </tbody> </table> <p><strong>EBnoR</strong> does offer solutions to each of those problem areas. Using small sidesteps from Oracles recommend path will lead to major improvements in development time, flexibility and ultimately results in a quicker learning curve.</p> <h3><span style="color:#0000ff;">The “deployment dilemma”</span></h3> <p>The advantages of EBR shine during one of the later steps in the software development lifecycle &#8211; the deployment phase. The dilemma is that at such a late point the additional programming effort to use EBR competes with adding more features or bug fixing of the application.</p> <p>Oracle propagates that the advantage of using EBR to do application upgrades with minimal downtime is so big, that it is worth the additional effort and time. This is true in very rare cases only and mostly only for very large companies than can effort to spent money on this additional effort.</p> <p><b>Problems</b></p> <p>The problem is the <strong>decision point.</strong> Budget is reserved for a specific change in one application. There never is enough budget. There never is additional budget. Especially not shortly before the next application upgrade will go live. At this point there is not enough budget and not enough time.</p> <p>EBR is a tool not an application itself. As such most companies hesitate to set up an extra project or a major software change just for using a tool.</p> <p><b>Solution</b></p> <p>The decision needs to be moved from budget owners to the developers and to an early point during the software life cycle. Only then will EBR find more integrations.</p> <p>EBnoR: <span style="color:#008000;">Start with EBR from day 1 in the project!</span></p> <p><span style="color:#008000;">Use editions already during development!</span></p> <h3><span style="color:#0000ff;">The “design change gamble”</span></h3> <p>EBR requires some changes to the data design and to the schema.</p> <p>One requirement is to add a view layer on top of all tables. Among others this allows to use cross edition triggers to do data changes. This is certainly a solid approach, however it is a major change to the data model. As such this will face critic from various other parties involved.</p> <p>Typical arguments that are raised against such a change are:</p> <ul> <li>Performance will suffer because of the view</li> <li>The views do not confer to our naming conventions</li> <li>The views hide complexity</li> <li>Some tools work (better) with tables instead of views</li> <li>Enabling EBR can not be undone</li> </ul> <p>The <strong>gamble</strong> is that EBR will take the blame if implemented at a final stage during development. If any issue arises, e.g. performance in the production environment drops, some will argue that the reason is in the additional view layer. Just because that was the only thing that was changed. It might be hard to prove otherwise, as long as comparable performance data is missing.</p> <p>Editions can be dropped. Switching on editioning in the database has no implications on using the feature or removing editioning features.</p> <p><b>Solution</b></p> <p>EBnoR: <span style="color:#008000;">Avoid major design changes!</span></p> <p><span style="color:#008000;">Use a view layer if possible. If not, still use EBR <strong>without</strong> this extra layer.</span></p> <p>Test early while using editioning!</p> <h3><span style="color:#0000ff;">The “zero downtime promise”</span></h3> <p>Absolute zero downtime is very hard to reach. Even a simple ALTER TABLE statement will lock the full table. During that the table is not available. Sessions will wait (which is a different term for downtime)  or even break.</p> <p>Focus on changes that have a minimal impact on downtime. For example adding a column is usually no problem. Even if the column is added to the old application without adding the new code it should not break anything. Write your application in such a way that added columns will not break existing code. This is easy to do. If the column is mandatory always provide a default value. Updating the data in this column might need more time. Dropping a column should be avoided because this usually breaks old application versions.</p> <p>If the normal downtime window is a few days, then using EBR can change that window to less than an hour by focusing on the DML changes (tables mostly). For a normal user such a small downtime window is the same as zero. He will often not even notice such a short break. This does not mean that the new application version needs to be available after an hour. But just that after an hour the user is able to continue to work with the old version. After that downtime window the new edition can be installed, tested and then a gradual switch over of user sessions can be done.</p> <p>Zero downtime is expensive. Even with EBR.</p> <p><b>Solution</b></p> <p>EBnoR: <span style="color:#008000;">Aim for very low but not for zero downtime.</span></p> <p><span style="color:#008000;">Don’t promise zero to users!</span></p> <h3><span style="color:#0000ff;">The “crossedition complexity”</span></h3> <p><a href="http://www.oracle.com/technetwork/articles/grid/edition-based-redefinition-1-133045.pdf">Bryns paper</a> describes how to use cross edition triggers to handle data changes between one application version and the next one. There is a major intrinsic problem with that. Let us first investigate how cross edition triggers work.</p> <p>Cross edition triggers allow to manipulate data in one edition and add transformation logic so that the same dataset is correctly represented in the next or previous edition.</p> <ul> <li><i>“A forward crossedition trigger is fired by application DML issued by sessions using the pre-upgrade edition. Such a trigger is used to implement transformations from the old representation forwards into the new representation.“</i></li> <li><i>“A reverse crossedition trigger is fired by application DML issued by sessions using the post-upgrade edition. Such a trigger is used to implement transformations from the new representation backwards into the old representation.”</i></li> </ul> <p>The problem is not how to write a trigger, but in the complexity of forward <strong>and</strong> backward data manipulations.</p> <p>Sometimes the data manipulation needed to go to the next application version is simple, but can not be automated easily. Manual data cleansing actions can be such a case.</p> <p>Some scenarios do not have a simple 1 to 1 transformation rule from data in the edition A and data in edition B. To do the forward transformation is usually part of the project. Very often it is much harder to provide the backward transformation. Sometimes this is only possible while keeping the old data structure thereby duplicating and replicating data. This defies the original reason for change.</p> <p>The EBR solution is to have this change only temporarily. Therefore old editions should be dropped very soon after the application was switched to the new code (and data) version.</p> <p><b>Problems</b></p> <ul> <li>Often requires to store several versions of the same data. Usually in different columns.</li> <li>Need to automate data transformation rules</li> <li>Huge additional effort not related to a better application</li> <li>Multiple editions require lots of cross edition triggers</li> </ul> <p><b>Solution</b></p> <p><span style="color:#008000;">Start slow and avoid cross edition data transformations!</span></p> <p>This needs some explanation and examples.</p> <p><b>Example</b></p> <p>For example if a design decision was made to trim the time component from all date values in a column. So that instead of a range comparison an equal comparison can be made.</p> <p><em>Old code:</em></p> <pre>dateCol &gt;= trunc(:searchDate) and dateCol &lt; trunc(:searchDate) + 1</pre> <p><em>New code:</em></p> <pre>dateCol = trunc(:searchDate)</pre> <p>The typical change includes a DML statement that updates the column using TRUNC.</p> <pre>update myTable set dateCol = trunc(dateCol) where dateCol != trunc(dateCol);</pre> <p>This change<strong> can not be undone</strong> because information (the time component) is lost.</p> <p>So to write a reverse crossedition trigger to mimic the exact same source data is difficult.</p> <p>One solution could involve keeping the old column including time precision and adding a second column that holds only the truncated date value. Then add (or change) a editioning view in the old and new edition that serves as an api to the relevant column. A forward crossedition trigger would truncate the data that is inserted using the old application version. But without knowing where the time component is coming from, it would be impossible to write a reverse edition trigger that adds the time correctly. A default logic would be needed. Maybe depending on some other values. Like the time should be between the time from previous and following rows. So we need several new objects, a fairly complex code to do the reverse change, the data model is more complex than the simple update solution but above all data would be duplicated.</p> <p>But why care? In this specific example the old application code might still work, even if the time component is truncated. So there a two possible easy ways to avoid complexity</p> <ol> <li>run the update several times, for example after each batch load of new data</li> <li>add a normal db trigger <b>in the old edition</b> that truncates all newly inserted date values</li> </ol> <pre>:new.dateCol := trunc(:old.dateCol)</pre> <p>Yes this would require a change in the old edition and as such would change old application code. If this can not be done because of organisational hurdles, then create an intermediate “preparation” edition and add the trigger there.</p> <p>Consider a step by step approach. There are many situations out there, where we can get away without the need to implement additional cross edition logic. Avoiding this helps to get EBR started and become acquainted with the feature. Once we got used to it, we can add more &#8211; eventually even using cross edition logic for specific use cases.</p> <p>EBnoR: <span style="color:#008000;">Do not depend on editioning views, do not use cross edition triggers.</span></p> <p><span style="color:#008000;">Avoid deleting objects, don’t hesitate to add objects (especially columns).</span></p> <p>If you need to delete objects this will influence all editions. After careful consideration <strong>just do it</strong>. After all, rules are there to be broken. Announce it as a major application version which will take a small downtime. Do not let the zero downtime paradigm make you write complex code. Complex code in the end costs more in terms of maintainability and testing effort.</p> <h3><span style="color:#0000ff;">learning curve considerations</span></h3> <p>A learning curve comparison shows how a reduced approach will ease the first steps into the feature.</p> <ul> <li>plsql code versions: start using EBR already during development. Then the developers get used to working with editions. Building a new release and deploying it in a specific edition then is nothing strange anymore. <strong>Do development and tests in the same database but in different editions.</strong> Each step in the development lifecycle deserves a new edition.</li> <li>design changes: avoid changes in the data model that would influence old editions in a negative way. For example avoid dropping columns. Also write your code in a way it does not break when a new column is added to a table. Model your data first before you start to build a new application.</li> <li>low or zero downtime: often a tiny downtime is ok. If the aim is to be fast, but not to be perfect then the additional effort suddenly is way reduced.  Do not aim for perfectness!<br /> Example: Adding a column to a table requires that the table is locked for a moment. Especially if the new column is not null and is filled with some extra values. Other session might wait for this. If the table is very very large such a lock can take some time. If it takes a  minute thats fine. It will not be zero downtime, but almost every project can effort to wait a minute during a new deployment.  If it takes half a day, then you must invest effort to optimise it.</li> <li>cross edition data: avoid using cross edition triggers. They serve only a very specific very special purpose. Build your data changes in a way that you do not depend on cross edition triggers. The need for cross edition triggers is the major contributor to why there is a increased programming effort when EBR is used.</li> </ul> <h3><span style="color:#0000ff;">The “cross platform independency nonsense”</span></h3> <p><i>“EBR can not be used in our company because we want to stay database vendor independent”</i></p> <p>Such an argument can often be heard from java developers or other programmers outside of the database world.</p> <p><b>An analogy</b></p> <p>You brought a Porsche 911. This is an expensive but very fast car. However you choose not to drive it in 5th and 6th gear because there are other cars out there that do not have a 5th and sth gear. Does this make sense?</p> <p>In my opinion the claim for database independency is often made to hide the incompetency or inability of the developer to learn about the unique features that their specific database allows. In general it is easy to structure code in such a way that vendor specific features are encapsulated and properly modularized. This will made future changes to another database less problematic.</p> <p>This is also true for EBR. If you decide to enable and use editions you can do it in such a way that all the specific implementation details are hidden from the normal code. The developers and the DBAs should be “edition aware”. But after some initial setup, there is no extra effort that EBR requires. In general you would simply use a connect string that connects to the edition of your choice. There is almost no need to consider editions directly in the code.</p> <p>There are a few exceptions. Like if you want to start a scheduled job then you proabably want to start that job in the same edition as the session that is currently running and creates that job. This is possible using a <a href="https://docs.oracle.com/database/121/ARPLS/d_sched.htm#ARPLS72302" target="_blank" rel="noopener">job class</a> using a <a href="https://docs.oracle.com/database/121/ARPLS/d_serv.htm#ARPLS68020" target="_blank" rel="noopener">service </a>that is tied to an edition. Or more general: Everytime you have a kind of client access to your database, you want to make sure that you can influence the edition that is used at connection time.</p> <p><b>Solution</b></p> <p><span style="color:#008000;">Modularize and structure your code well!</span></p> <p><span style="color:#008000;">Immediately counter the argument by using strong analogies.</span></p> <h3><span style="color:#0000ff;">The “marketing confusion”</span></h3> <p>I think the EBR name is suboptimal (nicely spoken). First of all the term “edition” is confusing, because it is also used as a name for database editions (EE, SE, XE). The R stands for “redefinition”. The term is a poor description of adding a new code release to your application.</p> <p>I admit I’m not creative enough to suggest a better name, but as an analyst I’m able to pinpoint a flaw when I see one.</p> <p>Nowadays every “thing” or “technology” has a smart speaking name and a funny logo.  The name usually is also an abbreviation, and one could think this is only of minor importance. It is not. This is the name that feature/tool goes by. This name and logo is used in slides, presentations, and social media channels.</p> <p><b>some examples </b></p> <p>Node JS packages: <a href="https://www.npmjs.com">https://www.npmjs.com</a></p> <p>Here are just a few of them. But every of those javascript packages has a small but recognisable logo added.</p> <p><img data-attachment-id="7721" data-permalink="https://svenweller.wordpress.com/2018/01/19/the-ebnor-manifesto/ebnor_npm_packages/" data-orig-file="https://svenweller.files.wordpress.com/2018/01/ebnor_npm_packages.png?w=809" data-orig-size="1163,399" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="ebnor_npm_packages" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/01/ebnor_npm_packages.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/01/ebnor_npm_packages.png?w=809?w=809" class="alignnone size-full wp-image-7721" src="https://svenweller.files.wordpress.com/2018/01/ebnor_npm_packages.png?w=809" alt="ebnor_npm_packages" srcset="https://svenweller.files.wordpress.com/2018/01/ebnor_npm_packages.png?w=809 809w, https://svenweller.files.wordpress.com/2018/01/ebnor_npm_packages.png?w=150 150w, https://svenweller.files.wordpress.com/2018/01/ebnor_npm_packages.png?w=300 300w, https://svenweller.files.wordpress.com/2018/01/ebnor_npm_packages.png?w=768 768w, https://svenweller.files.wordpress.com/2018/01/ebnor_npm_packages.png?w=1024 1024w, https://svenweller.files.wordpress.com/2018/01/ebnor_npm_packages.png 1163w" sizes="(max-width: 809px) 100vw, 809px" /></p> <p>Architecture components for Spark: <a href="https://www.linkedin.com/pulse/hadoop-summit-2015-takeaway-lambda-architecture-laurent-bride">https://www.linkedin.com/pulse/hadoop-summit-2015-takeaway-lambda-architecture-laurent-bride</a></p> <p><img data-attachment-id="7720" data-permalink="https://svenweller.wordpress.com/2018/01/19/the-ebnor-manifesto/ebnor_hadoop_summit_logos/" data-orig-file="https://svenweller.files.wordpress.com/2018/01/ebnor_hadoop_summit_logos.png?w=809" data-orig-size="763,321" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="ebnor_hadoop_summit_logos" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/01/ebnor_hadoop_summit_logos.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/01/ebnor_hadoop_summit_logos.png?w=809?w=763" class="alignnone size-full wp-image-7720" src="https://svenweller.files.wordpress.com/2018/01/ebnor_hadoop_summit_logos.png?w=809" alt="ebnor_hadoop_summit_logos" srcset="https://svenweller.files.wordpress.com/2018/01/ebnor_hadoop_summit_logos.png 763w, https://svenweller.files.wordpress.com/2018/01/ebnor_hadoop_summit_logos.png?w=150 150w, https://svenweller.files.wordpress.com/2018/01/ebnor_hadoop_summit_logos.png?w=300 300w" sizes="(max-width: 763px) 100vw, 763px" /></p> <p>Just look at all those small but important looking pics in this simple architecture diagram. It makes you feel as if you missed something important, if you don’t know them all.</p> <p><b>Problems</b></p> <ul> <li>EBR is hard to pronounce and to spell out.</li> <li>The term “edition” is already established in the Oracle namespace. And usually it stands close to “license costs”.</li> <li>A nice enchanting logo is missing.</li> </ul> <p><b>Suggestions</b></p> <ul> <li>EBnoR / EbanoR = Edition based not only Redefinition</li> <li>Edi</li> <li>ebar</li> <li>PRETI = plsql runtime environment and test integration</li> <li>or something completely different = OSCD (could be in use already by some other organisation)</li> </ul> <p><b>Solution</b></p> <p><span style="color:#008000;">Oracle, get some logo wizards and marketing people to work on that!</span></p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <hr /> <h2 style="text-align:center;"><span style="color:#ff0000;">beyond EBR</span></h2> <p>The EBR feature allows to do more than the standard model intended by the Oracle development team.</p> <p>The standard model is</p> <ol> <li>install a new application version in a new edition in production</li> <li>test if the deployment went well</li> <li>switch the current edition to the new edition</li> <li>after some short grace period drop the old edition</li> </ol> <p>During this whole time the impact on connected users is minimal.</p> <p><b style="font-size:200%;">This is great!</b></p> <p><b>But there is more…</b></p> <p>Using EBR in certain ways can open up new possibilities and ease the upgrade pain.</p> <p><span style="color:#008000;">New possibilities</span> include</p> <h3>restore and run old code</h3> <p>Assume a problem is reported, where you suspect that the reason is gone meanwhile. But the problem existed inside some older code version. Useing EBR it is now possible to quickly prove that assumption. Create a new edition in the environment where you want to reproduce the issue (usually DEV, but might be some integration or QA test database). Fetch the old plsql code from your versioning system and add it into this new edition.</p> <p>Run the test in both editions to see if the problem occurs with the old code but not with the new code.</p> <p>After that test simple throw away the whole edition (<a href="https://docs.oracle.com/database/121/SQLRF/statements_8015.htm#SQLRF20019" target="_blank" rel="noopener">drop edition cascade</a>).</p> <h3>develop and test in the same database</h3> <p>Build releases in ORA$BASE</p> <p style="padding-left:30px;">=&gt; test in edition TST$BETA</p> <p style="padding-left:60px;">=&gt; develop in edition DEV$ALPHA.</p> <p>This is something I discovered when actively developing and working with EBR. It is one of the best things to do. It might even save license costs because you can eliminate a complete test database. Although some test databases do not need additional licenses. It does not mean you can save up upon tests. But <strong>certain types of tests</strong> can profit hugely from EBR. Testers use one edition, developers use another (child) edition. Developers can actively analyse bugs that testers found without the need to move data from the test to the dev database. And developers can fix bugs without disturbing tests running in the same database.</p> <p>Build the test environment automatically from your versioning system.</p> <h3>provide backward compatibility</h3> <p>This is often useful for <a href="https://en.wikipedia.org/wiki/Application_programming_interface]" target="_blank" rel="noopener">API</a> development (see also <a href="https://blogs.oracle.com/plsql-and-ebr/noplsql-versus-thickdb">ThickDB</a> | SmartDB paradigm).</p> <p>APIs provide a specific interface (usually views and plsql packages). APIs expose a limited set of objects and methods for a specific task. APIs do not expose data directly. This is were EBR shines. All those objects are editionalble objects!</p> <p>Often we have multiple and different consumers using the same api. If API functionality is enhanced, then we can provide the newer version of the API in a new edition. If we keep the old edition instead of dropping it almost immediately, consumers can still use their old code without the need to immediatly switch to the new version.</p> <p>As long as cross edition triggers can be avoided, there are no major problems with keeping multiple API versions for a longer period of time.</p> <blockquote><p><em>Tipp: All editioned objects should be compiled in each edition even if there was no change. This actualizes a separate code version in each new edition.</em></p></blockquote> <p>&nbsp;</p> <hr /> <h2 style="text-align:center;"><span style="color:#ff0000;">Recommendation</span></h2> <p><strong>the EBnoR </strong>(Edition Based not only Redefinition)<strong> approach</strong></p> <ul> <li><span style="color:#0000ff;">Start using EBR on day 1 in the project</span></li> <li><span style="color:#0000ff;">Aim for low but not zero downtime</span></li> <li><span style="color:#0000ff;">Avoid (complex) cross edition logic</span></li> <li><span style="color:#0000ff;">Develop and test in the same database in different editions</span></li> </ul> <p>&nbsp;</p> <p>&nbsp;</p> <hr /> <h3><strong>Some</strong><em><strong> final words</strong></em></h3> <p>I had planned to publish this manifesto for quite a long time time (several years now). Since I started to put down those thoughts, EBR was enhanced. New recommendations have been made by Oracle plsql development. Other people, including the AskTom Team, encountered similar things with EBR. Some of those ideas and recommendations match with EBnoR. Still I expect EBnoR to be very controversial. This is intended.</p> <p>For sake of brevety I skipped a larger part of examples and direct code demos.</p> <p>EBR also still has issues where I see no immediate solution. For example editions are database level objects. As a developer I would prefere them to be schema level objects. The problems connected to this are beyond the scope of even EBnoR.</p> <p>&nbsp;</p> svenweller http://svenweller.wordpress.com/?p=4740 Fri Jan 19 2018 12:31:29 GMT-0500 (EST) ORDS got a new love for trailing slashes http://www.oracle-and-apex.com/ords-got-a-new-love-for-trailing-slashes/ <p>We recently upgraded a Web server from <a href="http://www.oracle.com/technetwork/developer-tools/rest-data-services/overview/index.html">Oracle REST Data Services</a> 2.10 to the latest version 17.4.1 . This might sound like jumping from the stone age to spaceships, but there have been only roughly 3 years between those two versions.</p> <p>The good news is, ORDS ran fantastically stable for so long, and would have continued to do so even longer, but we wanted to use the latest and greatest features, hence the decision to upgrade.</p> <p><span id="more-1377"></span></p> <p>All ORDS tests on dev/test systems have been successful, so we decided its time to upgrade our production Web server, which serves the <a href="https://www.tryfoexnow.com">FOEX Website</a>, the <a href="https://trial.tryfoexnow.com">FOEX trial instance</a>, and others.</p> <p>Today finally was the day, we upgraded 3 ORDS instances on our server and everything went fine. Everything appeared to work, all sites were displayed successfully.</p> <p>Everything? At the first glance it seemed to be fine, but then we found some RESTful webservices, defined in APEX, which did not work anymore.</p> <p>Instead of showing the result, ORDS presented us with an error page, just like that:</p> <p><a href="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-19-at-11.50.18.png"><img class="aligncenter size-full wp-image-1378" src="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-19-at-11.50.18.png" alt="" width="768" height="338" /></a>This worked just fine, right before the upgrade, now it doesn&#8217;t anymore. Other webservices (even in the same workspace/schema) did work just fine.</p> <p>Long story short, after some testing and tinkering, we finally found the issue: ORDS developed a love and dependency on trailing slashes in the URI template</p> <p><a href="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-19-at-11.56.35.png"><img class="aligncenter size-full wp-image-1379" src="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-19-at-11.56.35.png" alt="" width="523" height="544" /></a>Above is the definition which worked just fine under ORDS 2.x, but causes an error on the current version 17.4.1. Why? The URI template misses a trailing slash. As soon as we add that slash in the definition, everything works like before.</p> <p><a href="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-19-at-11.59.39.png"><img class="aligncenter size-full wp-image-1380" src="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-19-at-11.59.39.png" alt="" width="659" height="297" /></a><a href="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-19-at-12.00.04.png"><img class="aligncenter size-full wp-image-1381" src="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-19-at-12.00.04.png" alt="" width="680" height="122" /></a>Investigating that behavior a bit more I also found that ORDS must have developed that longing for a slash in 3.x, since apex.oracle.com running ORDS 3.10 shows the same errornous behavior.</p> <p><a href="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-19-at-11.25.39.png"><img class="aligncenter size-full wp-image-1382" src="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-19-at-11.25.39.png" alt="" width="1045" height="635" /></a>&#8230;doesn&#8217;t work anymore&#8230;</p> <p><a href="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-19-at-12.03.12.png"><img class="aligncenter size-full wp-image-1383" src="http://www.oracle-and-apex.com/blog/wp-content/uploads/Screen-Shot-2018-01-19-at-12.03.12.png" alt="" width="572" height="246" /></a></p> <p>I also reported this to the <a href="https://community.oracle.com/message/14675092">ORDS forum</a>, since it feels like a bug to me.</p> <p>&nbsp;</p> <img src="http://www.oracle-and-apex.com/blog/?ak_action=api_record_view&id=1377&type=feed" alt="" /> Peter Raganitsch http://www.oracle-and-apex.com/?p=1377 Fri Jan 19 2018 06:15:59 GMT-0500 (EST) Dynamic LOV with Pipeline function http://www.apex-at-work.com/2018/01/dynamic-lov-with-pipeline-function.html A new year brought me some new tasks. I had to take over a generic Excel import and the customer wanted some extension by checking if the join on the master tables were successful.<br /><br />Unfortunate we were talking about a generic solution which meant that all the configuration was saved inside tables including the LOV-tables which were saved as simple select statements.<br /><br />Goal:<br />Show all import rows/values which were not fitting towards the master data.<br /><br />How did I fix it?<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-JoTiMUM4ncU/WmCObcfE91I/AAAAAAAAB1E/cW01mWUtnWMaY_YEeEo-EllTA9VRHONFQCLcBGAs/s1600/geograph-150015-by-David-Gruar.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://1.bp.blogspot.com/-JoTiMUM4ncU/WmCObcfE91I/AAAAAAAAB1E/cW01mWUtnWMaY_YEeEo-EllTA9VRHONFQCLcBGAs/s320/geograph-150015-by-David-Gruar.jpg" width="320" /></a></div><br /><br />Source of LOV data:<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-w8yjrC-112w/WmCQRi7kWMI/AAAAAAAAB1Q/1s-YRydqb5EPqkMRiIEHOGCBr39GD58SACLcBGAs/s1600/Wert_anzeigen_und_Oracle_SQL_Developer___BN_NTDC_ADB_TEST__2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="283" data-original-width="1103" height="164" src="https://1.bp.blogspot.com/-w8yjrC-112w/WmCQRi7kWMI/AAAAAAAAB1Q/1s-YRydqb5EPqkMRiIEHOGCBr39GD58SACLcBGAs/s640/Wert_anzeigen_und_Oracle_SQL_Developer___BN_NTDC_ADB_TEST__2.png" width="640" /></a></div><br />Source of import data:<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-dAgIU03bqxk/WmCNUmSkVFI/AAAAAAAAB04/04eIFmfuXJEoKGoubld2k0uYX25N7MvqwCEwYBhgL/s1600/Oracle_SQL_Developer___BN_NTDC_ADB_TEST__2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="420" data-original-width="827" height="323" src="https://3.bp.blogspot.com/-dAgIU03bqxk/WmCNUmSkVFI/AAAAAAAAB04/04eIFmfuXJEoKGoubld2k0uYX25N7MvqwCEwYBhgL/s640/Oracle_SQL_Developer___BN_NTDC_ADB_TEST__2.png" width="640" /></a></div><br /><br />I made a little abstract data model so that you understand what I mean:<br />I have two tables "I_DATA" including the values from the import and "I_DYNAMIC_SQL" including the LOV statements. <br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-cQM7zi0h1S8/WmCB7dvvQYI/AAAAAAAAB0c/X_B857IwimMzynvSOyXWrp1PPWwcWqKGgCLcBGAs/s1600/Oracle_SQL_Developer___Relational_1__Unbenannt_1_.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="134" data-original-width="653" height="129" src="https://1.bp.blogspot.com/-cQM7zi0h1S8/WmCB7dvvQYI/AAAAAAAAB0c/X_B857IwimMzynvSOyXWrp1PPWwcWqKGgCLcBGAs/s640/Oracle_SQL_Developer___Relational_1__Unbenannt_1_.png" width="640" /></a></div><br /><pre class="sql" name="code">-- ddl<br /> CREATE TABLE "I_DYNAMIC_SQL" <br /> ( "ID" NUMBER NOT NULL ENABLE, <br /> "SQL_STATEMENT" VARCHAR2(4000), <br /> CONSTRAINT "I_DYNAMIC_SQL_PK" PRIMARY KEY ("ID")<br /> USING INDEX ENABLE<br /> ) ;<br /><br /> CREATE TABLE "I_DATA" <br /> ( "ID" NUMBER NOT NULL ENABLE, <br /> "DATA_VALUE" VARCHAR2(1000), <br /> "DYNAMIC_SQL_ID" NUMBER, <br /> "DATA_GROUP" VARCHAR2(20), <br /> CONSTRAINT "I_DATA_PK" PRIMARY KEY ("ID")<br /> USING INDEX ENABLE<br /> ) ;<br /><br />-- data<br />REM INSERTING into I_DATA<br />SET DEFINE OFF;<br />Insert into I_DATA (ID,DATA_VALUE,DYNAMIC_SQL_ID,DATA_GROUP) values (1,'Jonas',1,'G1');<br />Insert into I_DATA (ID,DATA_VALUE,DYNAMIC_SQL_ID,DATA_GROUP) values (2,'Sven',1,'G2');<br />Insert into I_DATA (ID,DATA_VALUE,DYNAMIC_SQL_ID,DATA_GROUP) values (3,'Annika',1,'G3');<br />Insert into I_DATA (ID,DATA_VALUE,DYNAMIC_SQL_ID,DATA_GROUP) values (4,'Jens',1,'G4');<br />Insert into I_DATA (ID,DATA_VALUE,DYNAMIC_SQL_ID,DATA_GROUP) values (5,'FH Trier',2,'G1');<br />Insert into I_DATA (ID,DATA_VALUE,DYNAMIC_SQL_ID,DATA_GROUP) values (6,'TH Bingen',2,'G1');<br />Insert into I_DATA (ID,DATA_VALUE,DYNAMIC_SQL_ID,DATA_GROUP) values (7,'FH Trier',2,'G2');<br />Insert into I_DATA (ID,DATA_VALUE,DYNAMIC_SQL_ID,DATA_GROUP) values (8,'TH Bingen',2,'G2');<br />Insert into I_DATA (ID,DATA_VALUE,DYNAMIC_SQL_ID,DATA_GROUP) values (9,'Frankfurt UAS',2,'G3');<br />Insert into I_DATA (ID,DATA_VALUE,DYNAMIC_SQL_ID,DATA_GROUP) values (10,'TH Bingen',2,'G4');<br /><br />REM INSERTING into I_DYNAMIC_SQL<br />SET DEFINE OFF;<br />Insert into I_DYNAMIC_SQL (ID,SQL_STATEMENT) values (1,'select d,r from (<br /> select ''Jonas'' as d, 1 as r from dual union all <br /> select ''Sven'' as d, 2 as r from dual union all <br /> select ''Jens'' as d, 3 as r from dual union all <br /> select ''Annika'' as d, 4 as r from dual<br />)');<br />Insert into I_DYNAMIC_SQL (ID,SQL_STATEMENT) values (2,'select d, r<br />from (<br /> select ''FH Trier'' as d, 1 as r from dual<br /> union all<br /> select ''TH Bingen'' as d, 2 as r from dual<br />)');<br /><br /></pre>It actually took some time to find a solution fitting my needs. <br />1. Fast<br />2. Easy to understand<br />3. Not tons of code<br /><br />What I needed was some kind of EXECUTE IMMEDIATE returning table rows instead of single values. With pipeline functions I was able to do it: <br /><pre class="sql" name="code">create or replace package i_dynamic_sql_pkg as<br /><br /> /* LOV type */<br /> type rt_dynamic_lov is record ( display_value varchar2(4000), return_value number );<br /><br /> type type_dynamic_lov is table of rt_dynamic_lov;<br /><br /> function get_dynamic_lov (<br /> p_lov_id number<br /> ) return type_dynamic_lov pipelined;<br />end;<br /><br />create or replace package body i_dynamic_sql_pkg as<br /> /* global variable */<br /> gv_custom_err_message varchar2(4000);<br /><br /> /* Function to return dynamic lov as table */<br /> function get_dynamic_lov (<br /> p_lov_id number<br /> ) return type_dynamic_lov pipelined is<br /><br /> row_data rt_dynamic_lov;<br /><br /> type cur_lov is ref cursor;<br /> c_lov cur_lov;<br /><br /> e_statement_exist exception;<br /><br /> v_sql varchar2(4000);<br /> begin<br /><br /> -- 'Exception check - read select statement';<br /> select <br /> max(sql_statement)<br /> into<br /> v_sql<br /> from i_dynamic_sql<br /> where id = p_lov_id;<br /><br /> -- 'Exception check - result';<br /> if v_sql is null<br /> then<br /> gv_custom_err_message := 'Error occured. No list of value found.';<br /> raise e_statement_exist;<br /> end if;<br /><br /> -- 'Loop dynamic SQL statement';<br /> open c_lov for v_sql;<br /> loop<br /> fetch c_lov <br /> into <br /> row_data.display_value,<br /> row_data.return_value;<br /> exit when c_lov%notfound;<br /><br /> pipe row(row_data);<br /> end loop;<br /> close c_lov;<br /><br /> exception<br /> when e_statement_exist then<br /> rollback;<br /> /*<br /> apex_error.add_error(<br /> p_message =&gt; gv_custom_err_message<br /> , p_display_location =&gt; apex_error.c_inline_in_notification<br /> );<br /> */<br /> raise_application_error(-20001, gv_custom_err_message); <br /> when others then<br /> raise;<br /> end;<br />end;<br /></pre><br />Now I just had to create a SQL statement doing the job for me: <br /><pre class="sql" name="code">-- ddl<br />select<br /> da.data_group,<br /> da.data_value,<br /> /* check if a return value exist */<br /> case<br /> when lov.display_value is not null<br /> then 'OK'<br /> else 'ERROR'<br /> end as chk_lov_data_row,<br /> /* apply error check for the whole group */<br /> case<br /> when min(case<br /> when lov.display_value is not null<br /> then 1<br /> else 0<br /> end) over (partition by da.data_group)<br /> = 0<br /> then 'ERROR'<br /> else 'OK'<br /> end as chk_lov_data_group<br />from i_data da<br />/* Join on my pipeline function including the dynamic sql id */<br />left join table(i_dynamic_sql_pkg.get_dynamic_lov(da.dynamic_sql_id)) lov<br />on (da.data_value = lov.display_value)<br />order by da.data_group, da.dynamic_sql_id, da.data_value;<br /></pre><br />Result:<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-HVnYi4lDqsw/WmCMqbki5pI/AAAAAAAAB0s/_BGP80q9SsoeLEqc8gdzzNxLbQBoIaayACLcBGAs/s1600/Oracle_SQL_Developer___BN_NTDC_ADB_TEST__1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="279" data-original-width="547" height="203" src="https://1.bp.blogspot.com/-HVnYi4lDqsw/WmCMqbki5pI/AAAAAAAAB0s/_BGP80q9SsoeLEqc8gdzzNxLbQBoIaayACLcBGAs/s400/Oracle_SQL_Developer___BN_NTDC_ADB_TEST__1.png" width="400" /></a></div> Tobias Arnhold tag:blogger.com,1999:blog-6481483192141562388.post-3391700518705834916 Thu Jan 18 2018 07:19:00 GMT-0500 (EST) Oracle Cloud - Database Services http://jaffardba.blogspot.com/2018/01/oracle-cloud-database-services.html <div dir="ltr" style="text-align: left;" trbidi="on"><div>This blog post highlights some of the essentials of Oracle cloud Database service offerings and its advantages. Also discuss about Database deployment (DBaaS) benefits and tools that can be used to automate backup/recovery operations and maintenance tasks.<br /><br />No doubt, most of the software houses are now pushing the clients towards the cloud services. Though Cloud provides several benefits, one should really understands the benefits, threats and offerings from the different cloud vendors. I am going to discuss here about Oracle Cloud Database Services offering.<br /><br /><br />Database service<br /><ul style="text-align: left;"><li>Oracle Database Exadata cloud at customer <i>(Full Oracle Databases hosted on an Oracle Exadata Database Machine inside the customer's DC)</i></li><li>DB Service on Bare Metal <i>(Dedicated database instances with full administrate control)</i></li><li>Exadata Express Service</li><li>Oracle Database Exadata Cloud Service <i>(Full Oracle Databases hosted on an Oracle Exadata Database Machine inside the Oracle Cloud)</i></li><li>Database Schema service <i>(A dedicated schema with a complete development and deployment platform managed by Oracle)</i></li></ul>&nbsp;Provides :<br /><br /><ul style="text-align: left;"><li>Rapid provisioning to use in minutes</li><li>Grow as your business grow</li><li>Provides tight security to protect the data</li><li>Off-loads your day-to-day maintenance work</li></ul><br />Database deployment (earlier known as DBaaS): is a compute environment which provides:<br /><ul style="text-align: left;"><li>A Linux VM</li><li>Oracle software</li><li>A per-created database</li><li>Cloud tools&nbsp;</li><li>for automated and on-demand backup and recovery, automated patching and upgrades, web monitoring tool etc.</li></ul></div><br /><img alt="" height="297" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAxYAAAFyCAIAAADnJtuVAAAgAElEQVR4nOy9Z1RbWZrv3dO3b8/0WvfDXe97150Pd0t9jkRXVXf1dJ65PfPOTE9Xd1fsru7KyVWOVeUq2+UI2AZscg4GY4PJGYzJNsbkKHIQSCBQBgFCOZ0jHaXD++EgWeRoHGr/1n/VIhwkmdJh/87ez3n2dxYhEAgEAoFAINvkO4/7BUAgEAgEAoE8fUCFgkAgEAgEAtk2UKEgEAgEAoFAtg1UKAgEAoFAIJBtAxUKAoFAIBAIZNtAhYJAIBAIBALZNlChIBAIBAKBQLYNVCgIBAKBQCCQbbNSoX75y1+egUAgEAgEAoGswwcHj39+/NRKhTpz5sx+2RsEAoFAIBDI08eCnsAJB1QoCAQCgUAgkG0DFQoCgUAgEAhk20CFgkAgEAgEAtk2UKEgEAgEAoFAtg1UKAgEAoFAIJBtAxUKAoFAIBAIZNtAhYJAIBAIBALZNlChIBAIBAKBQLYNVCgIBAKBQCCQbQMVCgKBQCAQCGTbQIWCQCAQCAQC2TZQoSAQCAQCgUC2DVQoCAQCgUAgkG0DFQoCgUAgEAhk20CFgkAgEAgEAtk2UKEgEAgEAoFAtg1UKAgEAoFAIJBtAxUKAoFAIJBnDpLcTh73q306gQoFgUCeIUiSdDpJh8NptzusVgdBOCwWu9lsN5vtuNmO48tiNtvNZofF4iAIh9XqtNmcDgfpdJIkHE8gTwkkSTocTpvNYbHYcdyqN1jUGnxhwTQ7Z5yeNogleoFQxxfopqa0k1Na3qQ7uskp3RRfzxfohSKjRGKakWHz82alktBqbUaT3Wx2EITTbiedzsf9L3yigQoFgUAeHzbbot2+q0cgSafNZsMwQqszK5TGmRnd5JSKPbrQ1zfX0Slrbpl+UC+9d19Sc09cVSOurBa5Iq6sllTfldyrna57MNPYNNvWLu/pUQyPaCZ4BrEEk8stGo3VaHQQBBxFIE8cJOkgCEKnM83OqjlceVf3TH2DqLxiIjNrODa+J+Bq+zdnm498Xv/Rgbq33qv9y9/uvvpG9Z9erf7DK9V/eJlKzcuv3X39zdo3365794PGTw+1fvl11wWf/pCw0evJU/mFkpq7spYWRf+ATiDEFQqbyeTc5Xn6jAIVCgKBPDZIkYgcGNiJRZGk3WKxqNV6sXiexeKX3B5NSu67Ethx8pv6jw7UvPaXyt//sfzff1f2f/+/st/89s6v/qX0F78p/dmvSn/2q9uulP7sV6U///WdX/1z2a//b9m//Fv5v/1nxe9eqnr59fvvfNBy7HiP7+XhmFheTt50Q6OGx8PlCzaTCboU5LFDkqQdx00zstnmFs6NlI4z52rferfydy+V//O/lv7TL4uefzGP8VwODc0GyFJo6CZxHwmQnB8y85nPl/zkn+784jcVv/33qj++0vDpwf6rQVMFRcrhEbNS6bTZHvcv4MkCKhQEAnlsONvbbb/7HdndvWixbPFHSKeT0OkMQpG09v5gaPiD9z+8/c+/LXzuJ0XM54sYzxUgXnl0BjUwZG0/2TQ0l87I/yGzCP1REeO5Aq8Xin72q5rX/sy64DNZUKge4+ALCw6r9ZH+TiD7DEmSTpJ0bg512FaOdP/E1h556wvHJIkrlaKKqtYvvy77598Web1QgHjl0hjud3vmXsTzdMijMwrRHxU//2LNK68PhIYrBodsGLa4o5VukiTtdoftUWC3Ox/T5Q1UKAgE8thwtrVZ//EfbS++6Kyr26JFGadnODdT695+v+gn/5RLQ3NdV9J7NX6sGEiyaWguDc2jofnM56pfernncoC8pw9a1DODw+k0mS1aI6YxmjaO1oQZcbPWtPmR7ugx3ICZtZsdpjNhFqt1KyLltNk4N26W/ctv8+iMnL1+w298LlDn2oO33lP09e9gLsputy8oVRze1MAoZ4A9tofpHxkdGuNKZbMWC7H/VYxQoSAQyGODUijiu9+1/fznzoaGrazojUTHlbzwU0qb9m0IoUaRbIDm/ZDZ8slBbG5+ZxfikCcKJ0mqdAaOeHpIINk0o+Jp/twCW7Slg4cEkkGBZHx6blImHxFJNzhsWCAZFkqmZHMms2VTA3BieM+nh4qYz+/nO59KBkAyAVL14s9lpWUODN/e79lJCsTS65l5X/leOXTG59DpvczB0z6Hz1y8GnNtcJRjIYhdvB12AlQoCATy2FhSqO98h/i7v7O98ALJYm06FzVy6NhtGrqHyxbbsqg8gHT850u4QAgV6hkAt1jGhBIWd7Kdzd00XWMTw3xR5+j4Vg5uZ3Pb2Nw+nmBoavMf6Rgd7x6fmpLN2Ta7hHCasJlPDjUyni8CSC5AHsXk61pXDkgOQPIBUg7QsRd/jpWWkdtUKCOG3cjK/+CL0699dPiVDw7ueV798NCfDxyLSEqZmZvf5xU9qFAQCGT72O2LZvPu46yvt/7v/0185ztUbD/5yaYresqjx4dojBqA3AZIPkByPEaRDNe18u4vuDM8rryzAZIHkBKAVgOURWOo/utPDqEIKtQzgFKn7+cJ2tncthHOpukcmxiaEnaObungthFO6winb4I/OCns2MLjd4yOd3N5ZmKTBWKHCdN8cmia8cIoQNsBeg+g5QApAUghQHIBkuMhVeudCJt+3e1MeQApAkgpQKoA0gzQERpjmsY0/fSXtu0r1LRszick6o1Pjr7ywcE3Pv38zcNfvXn4+F7lz59+/uqHh1798NCBE+f6R0Zt+1vwDhUKAoFsE5Ikx8ed5eW7TVmZPTjY+j//p1uhiO9+1/azn228oqc+elxOYwoBgwNQFkAbAFoFkNsAKVjrunwrUrXiGGp+ixpCigFSAZD7AO0EDB6NOUtnauhelt+/7IQK9fRDkovzak0Pd3KLSrS5Qg2P7Vih2tncLs6WFEr9yaE5xgvTgCEFDBFgTALGGED7ANoB0EaA1gK0CqB3AFoCkCKAFAAkHyB5AMkDSK5Ls3JdyQNIPkDyAVIAkGKAlAKkHKDVAK0DaAtAWQAdAug4YIhpDAXdS0P30tC9TD/9pXX7CiUQS84EhL7+8ZHXPj5y0PfqiYj4U1HX9iiJR/1D/vLZF69+eOidI1+3sXqJzX6He8vToVBOp9PhcFAfkyTpcDjcn6747lYOflyl+xDIM4LD4QgKIn7wgz3I3/898Xd/91ChqBW955/f4B49SqGkgDENGDOAIQUMIWBMAMYgYLAA2gTQ+wCtBmg5QEoBUgKQYoAUulLgGjOoYYP6YpFr/CgDSBVA7gG0HqAdAO0H6Bhg8AFDChgKupeW7qWhe2npXmaoUM8E5OLOFGq8Y5TbOTbO4kz0jE8O8ARDk8KhKeHQlGCAx+/hTnZxJjpGx6mZrUekULOMF6SA4Q51IlDnggQwhIAxCRjjgDEKGMMAHQBoL0C7AcoCaCdAOwDaAdBOgHYBtAegfQAdBOgIYHAAYwIw+IAhAgyJx2PO0phKupfalZ0plFAiPXMl9PWPj7xx4NiJ8LiLqdmX0nL3JJfTck/H3/jr0ROvfnjo3aNft3VDhVqFzWZTKBQLCwuUCdlsNrlcPj+/tORpt9tVKpVCoaA+XXGw1WqVy+Vzc3OeByuVSmhREMjOcTgcAQHLvGevs8GKnluhVg8hM4DhvjrnA8YUYEwAlAvQMYCyAToC0GGADgF0EKBDAB0GKBugowDlAHQcoJOAwQcMIWBIAEPq8YAywFigMd1DiAYq1LMCubgoV2t7xrdSCMVpG+GwxiZGheLBSSFHJBXNLcjVGq3BaMTNmJnALQRmthgws1pvnFOqBbPzo0JJ78TUIE8wyBN0bKF8qoPNZe1UoVacC9PLz4htZdp1BkldZ8GChz/tTKEIq5UzMfmNX/DrHx9545OjX4ZEX7ie5p2c7puSdTE1e5e5dCvndFwyVKiNMBgMLS0tbW1tGIaRJKnT6err6+/fv282mxcXFzEM6+np6erqIghicXFRr9e3tLR0dHRQB2u12vr6+traWovFQh3c3d3d1dVl3a97kkmSJKxWjU6nVKuVarVCtWdRqjV6g9Fud2z+IiCQveXRK9TSPXqNjatX9FYr1HqjyI7j+WjzHv4EFepZglxcVGj1Q1Oibu7kZuH1cCdHBZI5lUZrNOEWq9Vmt9nsNrvDZndYbXYLYbMufWq32uyE1YaZLUqtXipXcsUzfeNTmz5F7/hUP09g2Wxg2lSh9jDTgCGnMVW7UyiHw9k3zE7Oyvvkq7OvfXjotY8Of3jqwmfe/gd9r56Ovb57i4IKtTk6na6urq6+vt5oNJIkqdFo7t69W1lZaTKZFhcXTSZTW1tbc3MzJUnUwY2Nje6D7927V1lZieM4dXBra2tzc/P+KJSTJA1GUz97NCW3ICLpZnjiDc+EJd4IS0wOdyXs2sOELsv10ITk0ITrVEKWkhxxPSW/vEoomd70Jo49hyRJct0Wc9Q34ejyTLMPCuVe0evpWTEXtalC7WFkgKFcPoRAhXqWUBuME1IZWyjZIKNCyYRUJlOqDbjZarVRzmS12a02G/UBZrZI5hUYbnZ9fSnUkXoTLplXcCXToxs+y5hQyhVPE5uVQu+nQs2u8qcdKBSGm0MTbrxz9IT7XryX3//s5fc/e+WDg0f9Q3xuZkKFeuTo9foVCnXv3r2qqioMwxbXUaiGhoYVB1NTVvusULjZzOofjEvNCEm4Hhh77WrMtasx1wJjl3I1NiEwNuEqlZiEq9EJV2OWciUm/kpM/BXqg+iEK9Hx7gREx/tHxftHxQdExwfHX08vvC2bm390/wSqmIywWnGzxWjCdAajSquTK1Uy+YJ0dl4smxXNyETTMtGMTDQzK5HNTc/JZxcUC2q1WqfXG01GDDdbLFabzQFXTp8l9kehqBW9H/94xYrevinUDGAolk9BQYV6lqAW8nrHpzrY3DXTzuZ2jo4P80Xzaq2FsBE2u9lCEJQhWW3WBYXVhNlsdgOGD/PFehO+QqEshBUnrJRjSeUKakVvvefqGB3fk4W8R3fxsDOFMmJYUFzi3w59+eah428cOPbqh4f+fPDLv3z2xWsfHYYK9QihRm673W632zUaTV1d3YMHD3Q6nc1mUyqVlBUZjUa73a7X6ymFwnHcfXBDQ4Ner6cOvnv3LuVb1MEtLS1NTU1ms5l6cIfD8YimTEiSVGu0heXVodeSA2OvBSckRyTfCklIpkTKbUtLzhT9MAEPbSkhIDo+IOph/KPiA6ITghNuhCamBEQnBETFR99I7x0c8ayX3xOcJGkhrDqDcU6hHBeK2vuHapra8qtqbxSWxmbmh95MD0i8eSk2ySf6mndUgju+0dcux10PTEoNT81KyClMu11efO/B/fauXvaYYHpGodYYMcxms8M5qqeefVSopXv0WlvdyrI/CrWmP0GFepagysm71y8nb2dz2UKxymAkrDarzW7EzZJ5hRG3WO0Oq4VwZGXbBodsFsKIm9lCiR5bqVByjVYiV+AWglrak6t1A+s3UNhNOfmjePMvrOVPO1AoE4YHxSa9+8U3XwZFfXza540Dx474hxy5HPznTz8/4hcMFWrvIUnSarWq1WqpVCoUCgUCwdjYWHl5eUVFBYfDEQgEbDa7tLS0pKSEy+UKhcLx8fG7d+9WV1fzeDyhUEgdXFVVxeVyPQ+emJgQCoVcLrempqaqqmpyclIoFAqFQqlUqtFoHsWkFEmSCpU6u+ROUHxSSEJyalH57QftqUXlgXGJG/jTSoVa7k/+UQlh11Ozq+ry7zZG3szwi4iNuJ7S0dO/hwrldDqNGD49L2/u6b9RcPtS3PUvA0I/Onvx/dO+7532ffcbn3dPeb990vvtk+ff+vr8W1+fW5YT598+cf7tkxfeOen97invd7/xff+07wdnLh644H8yOCro+q28ynv9o9wFtWb/e8hC9pL9VKjvfIf4wQ/sH37oLoraH4WaX8ufoEI9S2x8R177CGdUKPGcWzKZLcN8kVSuMBNWq93uuJ5sLyyy6Q2YhRDPL5hwi6c/YWYLWyAWzS2YCav7i/NqTT+Pv6ZFPVEKNb/WEt6OFSo4Numdz08euhz03tfnXv/4yKcX/D897/fGgWNH/OAs1F5DkqTZbB4fH6+srMzKyspwkZaWlpaW9ig+zc7Orq6unpqa2nOLohQqq+ROYFxSWFJKwb2m6o7+gtrGkGs3rkQ/XJ7zlKSAqHj/yDjPj93xi4zzi4zzj4qPy8grb+0pa+5Oyi25HB4bnpTS0du3VwpFkqTOYKxoaPGOTnj/tO9bJ86/deLCW1+f+9tXZ/96/MyO87evzi491InzB877hd7M6GVz7Hs9cwbZP/ZTob7/fdsf/0gOD+/nLNSaVSBQoZ4xNlaooSmh2mBcMbE0p1IPT4l0RoxwOu1dLEd8gnVebrXaqGkqzyxodOOSGePyAinCaptXafom1rCoLSqU8xEr1DRgzK3/5t+RQmHB8df/evDLVz889LK7n/j7n726fi2Ub0qWr/vj1OyNS86hQi3DbreLxeLi4uL09PQ0D27dunXr1q1H8SmlUxUVFfPze1xRtKRQxXcCYxOD46/fKCjNv9uYnF96NfbamvK0csJplT/5Rcb5R8aFJN5Mv1OTVVEbkZzmFxEbnriXCuV0OkWyuQvRiW+dOLcbZ9owZz86e+l6wR3cvKU9ZSFPIvumUN/7nu3f/o0cHl70qKVTH/nykSqUbHkjHKhQzyrrKVTr8Fg3hydXay2rxMhitc2pNEbcTNgdNoXSGRFhm5qyEsSKw6w2u9Zo0hmx1WpFWG1SuZLF4e1QoTBcc+Bha839vHiggv30V9bS8q0rlIUg0gtvHzt36S+fHnvlg4OvfHjojU+P/eWzL948fPzLoCjf5Qrlm5rtm5p9OS0nMKvQPz3PLy33amaBf3ruxdSHUgUVaiMsFsvQ0FBOTs6tfSQtLa2wsHBkZGRv/y2eCnUlOuFqzLWguOtXY66tmH+6GnMtKC4pLPFmbErG9az8G7lFN3KLEtJzIpNvBcdfvxKd4B8V7+dhUX4Rsf5R8VeiE/wiYv0iYsP2WqFkC8qo7KKDFwPf+8bnHdcU1N++Ovu34zuciFr68a/OvvX1uXdOXvjw7OWTYXElDW2b/rGAPLl4KtR/+2/E979v+Yd/sPzgBxaqVeb3vreyW+bO8vd/b/v1r0kOZ4WsqL84sfDDHz0if5oBS42Y1xtCtHQv8x9fc4jEUKGedtZTqHY2VyCbN1usq8XIfZ+d1Wa3EoQj6bq9v9+66l68ZYetislsGRVKVvTb3KJCkQRhOOcjf/EX04/gKoJ682/gT+of/oj499/b6+rJLV8Ak+SiWqtr6mB96e33+seHX//kyGG/4JORCaeiEy8kpy/zoVs5/hn50UVlpS0drLHxG5X3YorLG/uH73f33ay4F5RdeOlWDlSoTTCbzf39/dnZ2SsUJ2OvSU9P93z8/Pz8gYGBvf23UAqVWXznamziUpFTVHxAVPyV6Pgrrtmm0Gs3krLyi6vv13f2ska4/eP8QZ5wYELQO8ZrH2BXN7VnlJRHp2Rcibl2OSLWz5XL4TGXw2P8ImIvR8SGJaa076VCkXMqTXp1fXB6wcVrt74JT/jiSsShS0GfXPD/6Ozl90/7vveNz7unvN85eeFtquzpxPm3XRVRb3993v3Fd05eePeUN1UI9fE5v0+9rxy+HHw8KOpC3M2gtPyEkpp73UMW677uZATZSyiF+u//3fL//L/4j3+C/+6/sD+/ib31Dva3t/BXXsV/8xszAJb/8T+I7353N+t39j/+kRwZWW0qptR05W/+7VEMIVQjnPUmn6j/ap/7qfWb884FBVSop531FGqELzJgZsJqM+Fm3GIl1jEhq91uLy2137tnNa5c71s71AOaCavNPqda+bxbVKhFpxNr65D89R0+43l3G9i98if5qhZoGtc7X0n3mqN7TT//U41/oF06vbjNO6xF0umzV8I8u5NfTstdMf/kn55X2tIpmpNbrFbCZiuob75eXjO9oLA7HCqdoa53MDS3ePWiHlSoZaxWqNzc3Lq6uq49pbOz88GDB+5necQKVXo15trqgqcr0QmxqZllD5pZoxPDk6IRvoTNl4wszzBf0j8haO4bziqtDIxLuhQWTckTlUvhMZfCY0ITb7b37LVCVT0Izy4JzyoOyywKzSgMTssPTM31T868lJTmE59yLub66chrp8LiT4TEfhUc/VWQK8HRX4fEnAyN+yY84UxU4vnYZJ+ElMvX0wNuZAWm5oakF0Tk3I4trIgrqkosvXeXNQgV6inG4bBHRWH/8R+GoGDN/Qc6zrhBMmOUzRlnZg18oba7V5udYzx61MxgEt//PvHd726UNeerqPW7kZE1/1Jb5XLheR8O4/kp1xCyV4sac4CxwSqGnO4lpnvx/vCqkdVN7u9WppBHwVJ3cu5k+/JdXGRKtYWw4hbr1PQsXzanNZoIYuV6nNVmt9oddla3Iy3dqlJv6k8WwqbSGbji6Vml2mK1mS3EuGSmY3TcU6G20tSAdDjEd+/df/WNSvRHjQDtBwwuYPABQ+yhUzs4Hdz+5Dn/qqJ7KeheMroXn84coDHraYxyrxdYp8/ppvjkNkccgfjhBi9fhcWtXL9LyfJPz72Smd/QN6QzmpwkiVuIvAfNSWXVknm5w+m02ew93InI/NLLabkr5qK+7QpF3X9nNptxHMdxXKPRdHd3u+UmIyOjvr7eYDDgOG7aO8xmM9XxPDU1lVKovLy83t5e3IXFYtn9jffrKRTlTwnpOQ2sfrZAOsKXDE+JV2fIlRGBtJc7VVhdGxSXtMKfHqFCZZWEZRa5E55V7E5Edok74dnFnt8Kz17+Xc9vZZXEFFTEFlbGFlZChXqqIRcXHXYHPjCkHuMa9EaN3qjU6hUaHRWlVq/SGXQGTLug1BWXYH/4A/HTn1pffHHdIAjxve+tXL/71a9Wr9+5kTU1l/3n7/NpaAVA2wE6Ahg8194sIsAQAYbYNaJItnOZTpVAuaOgey3QveSuIWSIzmygMYoAmvf8i4MRkVa9YZ9/7ZA9h1xcXNDoBnh81thElyvDUyKdCSNsdsJqU2r1I3zRiECsMaxR1WS12W0CoSM8wiaRWNf67sP6J5t9Xq0dmhTypmV6DCdsdpvdsaDV9U3w3c/L4vB6x6c2705utnR+frzwRz/OBEg6QLIBUgyQGoC2AEYPYAwBxphrqzsBYAhcZ8SmkdKYc3TmHN1LRveS0r34dC8OndlPZ7bSGFUALQQI9XSZAKn42a+lldV23LytX/UGCuWbmh2QkX+npfNW9f3Q7ML2Yfa8SsMVSZLLayILSrtGuXKNhisUxxeVxRaXlzR1RBaUelrUt12hCILg8/nd3d2dnZ2dnZ2tra3l5eXuVbasrCwWi4Vh2OjoaFtbW/te0NnZOT4+juM4h8NxV5dnZmaWl5dTr6Grq2t0dJTqZr4b1lQo6oa7xMy8pp7B9eTJ05+oDPPF/RP8sgfNIQk3LoU99KdL4TGh127sg0LtMuHZJdH55bGFVVChnnZIkrTZ7UbMrDNiKp1RodEtqLVrRqHVawwmnVKNCQQOPp8UCteMo6jI+r/+11bW79wMfHWqiIZmACQdIBkAyQHIbYBWAfQBQFsA2gnQXsAYAowRwBgFDA5gjAPGBGDwAGNyVXiAwQOMCcAYB4wpGlNAZ/LozFE6c4jG7KYxW2mM+zRGOQ0tAEgmQNJcg1bzS38ywVqoZwK13sgRTw/zxcNTIirSBSXuakNgszvMhFWu0RowM2FdS480WkdoqJ3VbTVbNlAoq82u0OoVWr2FsLprpMyEjS+bH3E99YhAMiqUbtqd3GnCuB9/Vs14LhcgWQChzgLqRMgESA5ACgBSDNAygFYB9B5A6wDaANAmgDYDtHV5WgDaDNAmgNYDtJ7GqKOhNTS0jIaWADQfoFkASQdImuttnwGQbIAUAqT9xz9T3y51Yti2fs8bKlRWZm39glYnU6gy7z0IySq4frsiIqcoqqA0uqgsNLvwxp2qyLySpDtVowKx1mi809IZkJHvCxWKAsfxwcFBqvtlVVVVRUVFQUGB22wohdJqtXfv3k1JSUndC9LT0xsaGjAM43K5bldLT08vKCigXkN1dXV7e7vBsNurzBUKRd1bFxAVH5+W3dQztHV/WrKoKfHAhKC0tiEgOuGhQoVFhyYsU6hdTp49CoUKzyqOziuj5Akq1NOOzW7XGU1q/Uby5BmlVq8z4ZiFcK7zznS2tVn/8R8frt/967+SbPbGlRZzR75spTHyAZIFkEyAZLiSCZBMgGQBJBsgOQDJXxpOkNsAKQVIGUDKAVrhkXKAlgHkDkBuA6QEIMUALQRoHkBzAJK9zoPnAuQuDZX+7o82oRAq1NOOuzu5516/s0qNZfmyHbXt3dohrI5bt+w5OVa9YdO1PNuqUirRrLxrbGLpqUfHWdzJrfSFUn1yaIrxQidAawBSBJCcVe/V1clcP5v+VBZA8gFSBpAWGjpGZ6hfpJoa7JlC+aXnssYmzAThdDpHheKwvJKgrILa7j7B7Nz0grKdzYktLvdLy+0c5eIEQZLkCF8Ynn/bXRT1bVcokiTtdjuO40aj0Wg0qlQqFovlXshzK9S9e/dSUlL25P67jIyMxsbGFQqVm5vLYrFMJpPRaDSZTGsu5FHX31v/s+lWqCseChWakFxe37JU+TQlHp5cmaG1IxqaFA9NibpGOElZ+RfDoil/WqFQdodDodbgZovTucM/7o9AoYojc27HupbwoEI91TidTgOGq/XGrcjTCota73/3Q4Wi1u+43E3VRHP0+DyNOQLQJoCWAaQAILkAobyHUp/VI0r6ZvEcNrJcHkapWC5ACgBSCpB6GsqmMRboXhbY1OCZYEU5eevwGIvDU+mNa67ZrVNR7rA3Njn8A4i5+a3+iMfPzqk07u4G22qtOcd4YQYwxIAxBtAugNYDtBIgJQApAEje8tPB86RYHUEmm+gAACAASURBVM9jclzv9jzXtUc5QOoA2kljjNEYM3QmdTsqts2+UBTrKZRvSlZIbvGYUIJZLGaCaBkcCcwsqO3uN2A4dXo5SXJMJIkuKqvt7lPrDYTNNqNQJd2phgt5a7OinPxRKFRmZuYKhaLKyQcHBzd+bbjZPMKdUGt1DseWbkYgSVKhVGcUlVL+5BcR6x8Zl5iZ182eGBNOi+bkExLZyCb+JHL9d+mDgQlBdVP7leiEi6FRHgrVSymUSqMNvXazpqFFNi+37khQ9lyhIrJvxyz3J6hQTynk4qLZQqw5/6RQaxUeH6+2KJXOoDWa7PY1lpuXFOr737f/6U8br9+5oVprzgDGNGDwAWMUoD0AbQPoA4DWAKQCIKUAKQZIEUAKAJLvGlRylw8tOa6v5LnmqwoBUgyQEoCUAaQSoPcA2kBDO2iMQRqDR2PO0JgqupeW7qWDfaGeFVYr1ABPYMTW6FCwgQbhQpH8zFlxV7dSpbYQa/dBWC8qvaF3YmrH3cmnAWMGMGYAQwoYIsCYBIwxgA4CtAegHQBtAWgjQB8A5D5A7gHkLkBqAFINkCqAVAGkBiB3AXIfoPUAbQJoCw3toKHdNHSAxmDTmDwaU0xnztKZSuouVLqXdqetNSk2UqicoprO7s6R0bYhduLtipiiMsn8gucsgN3hKGnuSCqtqu8ZYLE5zQMjcSUVF1NzoEItLlJTOzabxYVOp+vp6dl/haLKyd0vw2q1rp6Fmp6d/+piYOytrCmRxEIQmy6ZUQqVXlgSEBVPdSK4Ep1Qcrd+ZErKl8kXtLoZhYormtnQn0TLLUo0NCnqGuFezyrwDo64GBp1MTQqJD65rXtJoeYWFO99efrNQ8cvR8Z39A0YTCbnNm893VuFilgqgaqECvXUQZKkkySdTtJJLmF3OtV6g1KrX6FHcrVmXqmeVSin5YppuWJWoZpXaVZblMZgMq71Z9fZ1mb9P//H9q//ut79d6vx7E4+7YoUMMSAIQIMPmDwAIMDGGzAGAJoH0B7ANoF0A6AtgO0zaMWpB2gXQDtpzGGaQw2jcGlMXh0hpDOlNKZs3TmAt1LQfdSLb+1G7bWfJZYrVBjQglmXqNP5noxE9be/sH4gKArwRFp+SWiadm2LEpnwgZ4gnb2HmzwMr081Bep2ynErlNDBBhCV6gS8nm6l4LupaR7qZZ3MVjxnt9Nd3KKje/I87uV5Zea5Zea5X0j40b5XaVWv+x/E0ne7xkIzMz3S830u5XlfyvrErwjz427nLyjo2O9cvJHrVDUFysqKjo7Ozs6Orq6uths9upycvGM7K1jJ1/+6MgX3gH3WzoUKrXVattApFYrVFjizebeIa5YJlOqFTr9glY3s6DmCGcoZxrkiXo5Uyz2RPcor39c4OFPyxRqcEJ4p7bRNyTyYmiUb2hU8HKFeveLb37/3md/eP/g346cuJ5VIJ6R4Wbz1kVqDxUqPKs4Or9stT9BhXqSIUnS4XDa7HYzYcXMFiOGG3EzbrEQVpvJbFHrHi7hyVWaOYVKKJsf4gka+0cqW7tvN3bcbuq819k/IZ5ZczlPozfaV83gOru67K++upX1Ozcbb/DiHkVmPCLz+Nj9XRlgKGlMamJJ57rU1q4/eECFesZYrVATkhmzhaDcCLcQuIWwWDdSolm5Ijwx5czV0Ksx17708csuKVNrdMRa+70sKZfF/bA2q81uwPDBKSG12cs+75G3wUbCG2fPZ6FCc0saB0dGBMLBSUFq9f2YwjuCmVm7R3Wv2WItami9VXWfxRkfFYp7x3nXSqvcN+V92xUKw7CBgYHGxsbGxsampqb6+vrS0tLV5eSPWqEyMjJKS0up19DU1NTb26vT6Va8VEqhfv/eZ79/77PXP/3iamxSR9+gSqNdb683kiQXlOr0whL/qPjLETGXI2ITM3L7uXyedHZerZFrtHKNdl6jlciVowLpIE/U3DuUVng74npKXGrG7XsPesZ4w1Mr/WmIJxriiRpZA1djrvmERPqso1BUXvn46InLQWW19RKZjNjaDoB7pVDhWcWRuaWrl/CgQj3JOJxOwmrTGzGNwaTWG/WY2YBb9JiZ+lStMyo1epc/aSelspbB0bz7LYm378YUVkbnV0Tll8cVVd9pZglk82sWRelMOLHqfzo5M0NKJNvSkT3ZI2+DLpobByrUM8MaCiWdMRNWnLBOzcyNiaRjQolco1vPh2x2B08ovhgafTOnsH949GrMNd/QqMb2Lp5ANLeg1BuMuIUgPArSzYRNNLfAEUnHhNI5lcZitRkw82NRKOrNv/FGLvumUCE5RVyx1Ga3O0mSxZkIyiq83dQ2q1BR8qo3mbrYnIi8ksaBYaPZQi4uzipVSXeqL6bAWajFxcXFRZIkCYIwmUwGg8FoNCqVyq6urseykMdisajXYDQacRxfPXPjqVC/f++zP35w6P0vz4QlpnAm+Wuu61EKlVZQ4h8Zdyk82j8yLqOknM2XjotnRLNy4ey8YHZeIJufmpnniGZY7ImkrPwLgaHeQeHegWGXw6MLq2qHpySr/WmIJ+oc5kYk37oQFO4TEhkcf309hfr9e5+99P5nr3/6+bmgiJauHp3BuOl01B4pVHFkzrr+BBXqycThdJpwiwE3q3QGqs/Tijkkz6+Mi6YL6loTSqpjCytji6riiqriiqquldTc7eyflivWu1lPrTdie7Ex4p4o1PyO/Akq1LPEaoXiiqdxC0FYbUbMrDdieiOGb7iuJ5LOXIlO8A6KiEq+dSYgOCg2KfTajaC4pPjUzOKqu6z+IfHMrE5vtFiWHsSEW/QmXG/CMDNBWO16zDw4+RgUan6n/vQoFvIupWY3D4yYzGa7wzHA44fllVxOycqqud8xzO7ljBfXNwdm5PndymkZYhtxs8PpZI1xg3OK4B15a/MYy8k37U6+QqGWROrDw4fOXKxpbJErVMTyCqplChUWHRAVn1dew+ZLhyfFwy4lGuQtLdU96Oq7HB7tExJxMSzqYmiUT3BE5PXUXs7k8JR4hT8N8UTd7Im4W1lbUSiXSB1889BX8beyBGKpCVvDDt3siUKtWUIOFepJhiRJzGzRGEyrS51WRqXhSWay7zXFFFTGueQprqjq2u27VW09M3LlBs0OVDqDETfvvmnt7hVqdsMu5FChviWsVig2X4yZLVab3ebKBv5kwvDG9q7A2MRL4THnA8OvZ+YKxFLZ/EL3wHBeaUVIQvKlsOjguOuZhaUtrF6+SKJQqfVGk9ny0Ml0JmyAx2/faTn5ziIDjA120d5/hfJJybpRViOenRfMzCaVVkbk306pqg3Kyr9w/db5xBS/1OzUqtr4koro/JKBick5pSr3foNfei6shVqC6k6O4ziGYRiGqdXqR93UYL1ZqO7ubsyFea36oTUVyr2udykirqmzW6HWeLZo8piFigmISsgrv+tSqGX144OT4vsdvX6Rsb4hkRfDonxDo3xDoqKSb7HY4y6Fch3MEw9PintGeXG3simFCopLamNtolDuabPPTvsUVd0TSqfN67Rf371Cha9TQg4V6omFJEncQmgMxs39Sa2Vzi2UNnWu8KfEkprKth7x7PzGzaKUGp3eaLLZ7Q6nczcitUuFmgEMxU6noKBCPUusVqi+iSmDCd+0DNxmd+j0hoa2zoiklObO7um5eYlsVm802ewOh8NJbUii1Rt4AlFTByv3dnlsSnpkUkpSRk5RRQ2bO4G7tiVW6vTuZ29nc7vGJh61Qu24BOrRKZRvStal1Ky82oak2xVxJeV9E1Nao2lqRkZ1J2dxJnQmTDg7n1JxLyK3OPtuXUh2Idzg5SFms3lsbKyhoaGurq6urq62trakpGT/y8kzMjJKSkqo1/DgwYOenh6j0bjipW6gUFQF99vHTkZcvzXGm8LNZuqGJkqh/CLjLoZF+0XGZZSUj/Clbm1yZ2hK0jHEjb2V5RMa6Rsa5RMSeTkiNqu0cmhKPCac5ohmuGLZuFg2IZFxxbKRKUkXeyLyRtr5oHDvkIiguMTWrSkUNR312qefH794tfx+g1qrW93TfJcKtbqLJlSoJx+b3a7WG1U6w6b+JFdphydFSaV3Pf0pobi6pr1vo/knlUau1rjuyzMacYvBhG98K8bG7EahpgFjYRf+BBXqWWJpj7zxKWoeqHWE0zU2odIZNu0LZcSwmvom/4i4B60dehNmszuoPHQsm91md9gdTpvNbrZY1FqdQDLd3tOfX1bZyuoxuixNplCzOBPUU7ePjj/qWajpXfvTo1AoyqK8k9MDMvI6R7mYxUKSpMVqza9vTiqvkcoVTqfT7nCMicTRhXd8bqSv+Nlvu0KZTKaurq6ysrKKioqKioqysrL8/Pz9LydPT0/Pz8+nXkNlZWVLS4tWq13xUjdWqCWR+uDQe1+eLqq8O7+gMFss8wqlW6EuhkcnZuX3jwuGpyQrFGpwUtw/Iaxp6QhNSvGLirsSe+1GblHHMGdEIBXMzM+rlmrP5RrtjFLN5kube4cDYxN3oFCe63rh129NCIRGE+Y537YbhQrPKo7KLd3Un6BCPSGQi4tUtwJqCW8rTTLlKk37MDe+uNpToW6W3x8XSZXatf1JrtYKpmXsSYHc1emA6rSpx8zmLXQGWRP1kS93plA7LiGHCvVMQi4uKnV6tlDSzxP0T/D7J/j9PP6cSrOiMQFhtREen+JmS3tPf2Dstbv1zQYT5mlOG8xa2ewOu8OxYmVQMrcwOCnsm+D3T/AHJoXDU6JN/yo6MUx94NAs44Ud7CW8mxIod3bQWtPhcE4KxGcCXAoVGuNzI+Oiq5hpKbdy/NPzSpvaRbPzegzTm7DcuqaksmqBbM6I43K1pq67LzSneNmPQIVaXFwkSdJisej1eq1Wq9Vq5XJ5R0dHVlbWPitUbm5uZ2cn9Rp0Op1prY5KW1Eo97qeT1hMfXvXpFCcVlByOSL2Ylj0xbDI8KSbbQPsYb5kcJVCDU6KBnjCpr6hisbWu62drNGJoUnRIE/I5kvEcwtyrXZBq1vQaCXziiGesKK+1Sck8kJwuHcwpVA921Iot+19cvJ86d06neHhfNtuFCoyZ5MSKKhQTwgkSTqcTpvdbrXbrTa71ohtZQmPUqiGvpEVCpV4u6ZpkC1bUK15PIcvziitLrnfNK9Urygt1xox62Y7gq2J+ujxhR0p1NxeDCFLCiWAG7w89ZCLiyqdYVQgGeQJBlzhT89iHhvemcwWlc5gwi3U3sAGE9bW3RdxPaWuuW2L/kRFazCp9Uaz5aGc4biZK5K6n3dwUjgiEK++ZXUFTrNZ98XX88/9dLsKNbtXb/5f/9ZWVUNueZthp9Mpks5U3m84evbiax8dfv3jIwd9rnwZHPVVWOy5xFRfD5HyTck6f/1WSFZ+QV1jQ+9A4p2qyILS6g5WRVtHQvEd35vpPsvnn6BCrcFTV06+3qLenw9+eSEkqrGDdaug+HJEzMWwKN/QSP+ouDt1jUNT4sFJ0ZoZmnJlUjTIE1IZ4YtFs/IFrU6u1vKkMhZ7/GZe0bmrwd7B4d7B4YFx11q2r1AvvX/wtQPHjpy7VHG/AfPogLVjhYrILonZrAQKKtSTgIMkLYRVb8L0mBkjbCaLdStLeFTmlZp7rAFPf4orqootqkq8XdPYPyJTKFccP8YXJeaX+sQk51TUzinUK76r1Or1Jny9niAboLsUoGb+eLtDyMzuqmjd0SPPWf/2rnN6GirU086KWigqvdxJjcFIzTyp9AaOSDoiEGsMJsJqw3BLQ1unf2Rc9YNG7RY2xVvWQUqpGZoS8mXzBsxM2OxWu2NOqWaNjbuft4PNZW1hIY90OPDScvnvX5n54Y+2fgrsyZtfQ/fSMF8wf/G1gzuxaLdv8ZeMmy3xqZkHTpx745Ojr3xw8JUPDr764aHXPjr8+idHP78S7nMjY8WKns/NTO/kNO/kNN+bmRdTsryT0y8kp3vfyPBdMWsFFYqCKie3WCxms9lsNmu12u7u7sfVndzsglhriWErCvXS+wdf/eTYgZMXkrML5hYU8wqFW6GoLVmuZxf0cCbX9KfhKdGYSDo8JR6cFLr9icooXyKVK6Vy5RBPeL+9OyA6/nxQmHdwuHdQeGDs9hTqpfcPvvLx0Q+On4m8kSaSzqyYbNuZQoVnFW1aQg4V6rFDLi46nE4jbtZjZmrmSaHRbXG3YCpzSnVle89DeSqs9LSojhHurELlrpriS2W3Siq9o5N9YpJzKmtnVynUglprNBP49tscWMa4c2++K/mhF9V8eUtLeDTmLqtAVO784l/MOfmkeatX4ZAnljUVqn2EMy1fsBBW3EJwRNIJ6Ywew61Wm9lC9A6xA2Ouldbc1+kNW59/cq/lqfSGYYFIuqA0EzbcQozyRe2ez7u1O/IWSdIoFLGPnxh67sUJV59xsasR+Xr+tIP6P/cbXkH3UtC95uheArpX/y9+I80vJLTarV8/GE1YUGzimwe/fO3jI69+eOiVDw6+9vGR1z46/OqHh476h6w5sbQ8ORddXTShQq2BxWLh8XhUW/COjo7H2J28vLyceg2dnZ1sNhtbtRP1pgr1p48Of/j12dDEFNbAMNXgQK5UpRYUX4qI8aXuswuNCoxLqmnpHJwUDfKWZWhSxJPIdEZsVqlm8yWDE0LPDPGEo3zJmEDaNcJNLSg5Fxh6ITj8QnD4+aDwq9tRqD9+ePjdL74JiEls7GCtOXTtQKHCs4qj8+5s3Z+gQj0urHa7Cd9a54L1FaqkqZNqBBWZVx6UWRyRW+bWqRtltW3DnJkF1YJKw+GLbt2u9om54ROT7Bt7o/he44qFPCoqnQEzE85tTudoJ6e6jn/dgD7HAigbMHiAIaA2rNiginY7Q4hna3Il3WuB7iWje4noXmM0ZieN0fAf/yW9d99u2YMGV5DHy5oK1To8OjA+qTOYCJttqcGB3YGZLT1DI1HJt6rqGrR6o3Wb/uS2KJywUn2nZAvKrlFu2/YVymm1DoWGF/38V1k0tAigNQBtBmg3YAwDBgcweIAxtdyrtlICRamSku6loHst0L3m6F4yupeE7iWgM7l0Zh+N2UJjVNLQfIBk0tDqP7wy397uIIgt/pJNGB4cl/TOsZOHLgW+9/XZ1z858ukF/wPn/d44cOyo31YUapN82xUKx/GBgYGqqqry8vLy8vLHW05OvYaKiorW1la9Xr/ipW6gUH94/+Abn315+kpYe0+/u7RomUKFLinUxfCYhIzcjmEOtaOLK8LBSeGoQKLRG212h0KrHxVIBicEg7xlIjUwLqhubL8cEXs+KIzyp60r1EvvH3ztwOfHL1590Nqp0mrXK+PdrkKFZxVH5d6JLdxSCRRUqMcISZJ6E6bZctnTmplZUObeb40tqoopqDifkHEsJPFMXFqU26KKqhJL7zb2jYzwBEl5d7xjkn1ikimFqm1nydd6QIVGpzNijm3u5NjnF1DIfD4DIFkAyQfIHYDUArQVoL0AHQGMccCYckkVNYrMgY38SeMaRTyHkGm6F5/uxaEx+2iMFhqjmoYWAzQHIBkAyaYzGv72DjYzAxfynnbWVKi2EU7L0ChPPI2ZCZtLfQTi6bBrN0pr7qu0eqttk/v1Htahr/N1A4YP8vgrnnSrCoXh/Z8cLGI8nwmQDIBkACQTIFkAyQVIIUBKAVIFkFqANgK0DaAsgPbT0DEaY5zG5NGYU3TmFJ3Jd2WSxpygMcdpzDEac4jG7KMxumiMZhrjPo1RBdBSgBYCJAcgWa4nop6r5sc/m7t9x7FqimE9KIV69/NTR/1DPzhx/o1Pjh70vfqZz5U3Dhw7AhVqT3A4HARBPPnbDK+pUJSafHba53p2/oJSvaK1plypTM0vuhQW7RsSScUnOMInJDI1v6RnjPfQn3jCQZ5wiCfiT89abXa7w6HU6sf4kgEPf+ofFzSwBsKSbp69GnIhKOxCUNj5wLDzgWFXYxJaujZSKGpt8eMT52NuZkhlcxs3KN+uQm3aRRMq1BOC1WY3mgm13rhjf1pQa6eksykVdXFFVaFZt48GXzscGH84MP78tYyovHL3XNS12zUJ+WU+sTd8XArldy2ld3R8vcdUavXbLYfiHvr8Dg3Ndv1xT3clEyA5roGkAqC1AG0AaAtAe2iMQRpzmMZk05ij9GUZoTGHaMx+GpNFY7TRGE00Ri2NUQnQEoDmAjQLIOkASQNIusdYlQeQ3v98yQLLyZ9+1lOo1uGxtkH2rEJpJqxUhwKlWjs4ytHpjRbCptDoTbhlY3my2exUF/LV/REIq00om+tgc3aoUCZs/pNDnYwXSgGSBxDqLMgCSKbHuZC2/E1LvW+zAZK7PDkAyXYdsObPut/zWQDJAUgBQO7RUNGLv7CUlpHbUaiQuOt/PfgFtYr3ygcHX/nwEFURtbWFPKhQ2+EpKid/6b3PXv7oyAfHz8SkZIxwJ1b3WFpSqLzlChUScSE4zCckIrWgpH1w1LPgaWBCODQhnFepSZJ0Okmt0TQhllH+1MuZqm7qCEu6eSYg6LyHP7kUqns9hfrTR4ff/eKbsKSU3mG2bQsFgNtSqIjskuj8bfsTVKjHAm4htCZsW5VPq9MyOErdjheZV3YqOuVIUMLhwPgjQQnnrmW4m23GFlVF5t65cjPHN/aGT0yyd/T1+OxisWxesc5jKjS67SqU+ujxCRqjAaDlAClwXSi7RwJPqXLHcyzJ8hh1Mtc5Pt1jFKGGnwKA3AFoPUDZdKbxv/4Emxo8A6ynUNREVB93QqnVEVY7dVnrcDptdse8Wjs4KaDqzT3FaEUfBJvNPqfSjEtmDNiyRp0EYaWW8FqHx3amUA4Tpvnk0CzjhUmADgC0GaA1ALkDkCKA5LusyFOqMtY/KdKXH+B5juQAJM91NVIN0EaA9tEYfBpTQffCt9nUADebE9KyP/7qzOsfH6EU6rWPDr/28ZE3Dhz7/OrKcnKoUNuGJEm73W61WgmCIAhCr9c/xlkowoXNtkbfP0+F+sMHh948/NXlyHjWwLDBZFpzXWy1QvmERFDxDg73CYmMT8uu6+gemBAM8USDE8KBCWH/uIA9JTbiOPXjRsw8KZllsceLquv8I+POXgk+HxjqlqeNFYq6K/B8cFRrd5/eYNxiA56tK5SrC3kVVKinAhNu2Y0/KdRankSWVlXv3hEvLOv2yaibhwPjDwXGfx6S6C6KohJTUBGYmusbe+NSXEpT98AGj6zWG3egUAs0pgQw+IAxAtBOgNYBtAIgxctHkcxVo4h7kNj4W+5L9mKAVAD0AUBZNJRDY0zTmQq6l47uZYF9oZ4JNlAoyqL6JybVeiNlUVabHTNbRvgiybxihTBhFmJ6QWkyL5uaws0WtkAsmV8wuw4mrLYZuaKTmuVa9XTb7U4+DRjUHXliwOADBgcwBgCjC6BNAL0PkGqAVAKkDCC3AVIEkEKAFAAkHyD5AMkDSB5A8gFSAJACgBQBpBggpQApB0g1QOoA2kxDWTTGMJ3BozOldOY8namkbseje2m231qTJEmhZLq4oubQNz5UU4MDF/w+vxL+RXDUuWsp691nBxVqq1gslsnJya6urvb29vb29ubm5rKyssdSTl5WVka9ho6OjuHh4fXKyf/w/sHXP/384BnftMLbaq1uAzVxK9TFsGifkEjvkAjPXAgKP3sl+FJYdFZpRXPPUM8or48z1cfl93Gn+FIZNWNEkqRGbyivazh3NeTMleDzQWHng8LOBXom9EpMfPNyhaLWFg+c8k7MzFOo1E7nNv7Qb1GhwrOKo7bQhRwq1JODCTev1/1y86g0Qtn87abOmMKH+7rEF1WFZZeeiLr5RWjSxeSc2MKqFc0OYgorA1Nys8rvzSqU601BKbV6o9my3Vooz+7k04AhA4xpwBABBg8w2IDRA9BWgDQApA4gtQCpBkgFQO4ApBQgtwFS4pHbACkFyB2AlAOkEiB3AfIAIM0A7QSMQRpjnM4U05lyupea7qWje+lcVVNa2FrzWWFFd/KVYXOb+of7OBMqrZ5yJgOGi2blK1TJZncYMHyEL9Iv3xnGZncsqHXCWTluISh/mlOputic1uGxNjZ39dN1jI5vpanBmt3JKZ2aAYwZl1fJaMz5h4XhTBGdyaczp+hMniuTdOYUnSmgM0V05jSdOUv3mqd7KVzVgVqPrKgd3EF3cpIkRdLps1fDqNaaJyLiL97KuZyWu/GtdlChtgSO44ODg40uHjx4UFpauv/l5BkZGXfu3KFeQ1NTU29v7+pycsnM7PvHz3xyyjsxM3d0YnLT24gohUrJK/INi17hT94hEd7BEd7BEeeuhp4JCPaLiI1LzcwoKS+qvn/7Xn3lg2ahdJoqWnI4HDNzc3l3Ki6GRZ0LDF3hT6sV6sOvz3309bnY1MzBMe7GZU9rsjWFKo7MKd1BCRRUqMeIhbAacMtOask1WqFsvryle4UhxRVVxRdXR+TeCc4oji2sXPGt2MLKayU1JQ0d/GnZBrNfWiOGmdfernED1tzgxT2EUKPIHI2pdFWIy+nMOTpTRmfO0JnTdKbUlRk6U0ZnztKZcjpzge6loHupVo0fmuU36Klhd/JnCHJxUakzsAWSAR6/f81M8Ls5EyOTArlag1sshNVG2FbWNtnsDiOGs4Vi/arN9Qiqs7nVbsTNsgXlIG+qd3xy7Sfi8QcmhcN88aZ/FbeywYsMMFa/kzfN6rf6mtntBi+fHP0qNNbnZqZvavae5GJqzjcxSX89+vW3VKFIkiQIAsMwo9FoMplUKtVj3GbY5MJsXmM/+bkFRfj11N4hNo6bt/LHc0mhcgt9QiOpHgRLCVqW80Fh5wJDz1wJPhMQdCYg+Kx/kHdgWHZxqdFkoh7H6SSVKs3t6nvngyPOXAk5ezX07NXQs1dDqAREP1QopVoTlpTCGhgyYfjOts7YikLtrIQcKtTjxeFw6Ey41oht15/4M7LSpq4VHclXhpqCKq6KK6qO05ENXwAAIABJREFUL66+VlKTWvHgPmtQJJtXaNZfHNToTBZiBw3KN90jT+ZxF7dmy9l6ywOoUM8G5OKiQmcY5ot7x6d6xyfXSzdnomtkbEwgUun0hNW2uqMBZraI5uQm1+bBK2qkFtTaoYmprhFON4e3wbP0TfAHJ4W7V6gZGnNPWsjuRqGonaMWPc4PgUhKbfDy6oeHPj5z8fMr4Z8HRu5JvgiM/PSC3xuffv4tVSg31C8dx/HHW06+8cKc3eHYupqQJClXKG/mFixTqOXytCrh54PCz10N9Y+MY/UPuEvUSZLU6gwV9+t9QiM9/WlJoTqXFGq7r3A1mypUxFIJ1M79CSrUY4FcXDThFpXOsPWJKLlayxWIQlOyvBNSYwoqVptTQnF18p17mXcb8+tabzd2VrX31HUPtQ6O9XIm+TOzCrV2g/knhUan1hsNO3L9jRVqBjAUj3IIgQr1zEDVQnVzJ1uHxzYIVRdV3zvYOTImnZfrjCbcQlisNsJqe1hU7vqA+qKFsOFmQqnR8aUzPaPc5oGRjZ+idXhsu7VQ67ZAe5Rv/q0rlN1ut7lwOp1TQvHpgFCqovzl9z/by7z36cvvfUrd4vdtVCiSJG02G47j1PTP452FwjDMZDJhGLbmLNQO/mkrFWoDf3KVh1MrdGevhkQmp0hnZ5dehtO+aDFiek1TR6dfVNyZK8FuhfL3UKjds7FChWcVR+fvvAQKKtTjxekkLQShM+EqvXHjvuSU/XD5otCbGW8eP/3uKR+fVRaVfOdeZXvPyJRIMieXLajkKo1Co1No9EqtXqXVKzU6xfpRavVag0mPmbfbVJNiY4Xa/UbCUKG+JWxcTr5Wxno4450jY8M8vkg2J1epNXqD3oQZcbMJNxsxXGc0qXT6WYVyalo2OD7ZOjDSxeb2jU91rFX8tOM78jZQqD3ZBXL3CrW4uOh0OgkLYTKajAYjjuFc3tQ3fsHum/LcAkSpz6sfHd5uqM4I7gf59iqU2Wxms9n19fW1tbW1tbV3794tLi5es5w8NTV1TxQqIyOjoaFhdS1USUnJ/fv3a2tr6+rquru7jUbj5q9+Q1Yq1Gb+dG7JokIphboQHFZYXoWbzYtO+6Kcu1jnT3Zd1yllRZU1pwOCKH86cyXEPypufxTK1UVzt/4EFeoxQpKkxWrTGTE9ZtaZcLXeuGZUOgNPJA26nva3r86+efzMm8fPvHfa1/da2pI/FVdfL6ttHuRQxUxag0mzFExjwDQPP10ZrRHTmXADbtHoDCazZQe741FsoFD7MIRAhXpm2K5CdY1NDE0J29ncpoGRht7Bht7B5oHhjiE2iz3GYnO62GPtQyPN/UONvYONfUPNgyMtw2PU8tw+KJQEMGb3aBfIPVGoxcVFp9NpNBrVarVWqx0Z5Zy6FORWKCp/PnDs7SNfHThx9tA33tvKwVMXPvji1F8+/fxhr6lvrUKZTKaurq4yF6WlpXl5eZ7l5F1dXXq9vqWlpaioqGTXFBcXl5aWslgsDMM4HI77iaiJKOo1lJeXNzc3azSaXf7THipUSATVDHOpJWZQ2Pmg0IcJXMq5pYS4ExyXODHFd+LaxZaIRZ9/WAxFLZya1u7eM1eDz1xZin9UXHMn65ErVFZxRE7pnvgTVKjHjt3hwC2E3ohp9cbV0eiNk2JpUHLa68dO/eXL05RC/eXL0++c9Pa9lhZbWHWjou5e18CCRqfRGzV6g0Zn0OgMmrUeamUMRr3RZMLN9i20KNuA9RRKti9DCFSoZ4alO/K2rFCdYxNDU8LO0XHKeFpHOC1Do82D7KaBESrNg+yW4THqu20jnNYRzr4p1F7tor2HCrW4uGi32TRqtWJhoW9w6OTFq54K9ZcDxy4ERtQ1twkl07Pz8jn5wtYjm5ez+gevRMa/c+Qrt0V9SxWKKic3GAx6vV6v1y8sLHR2droX8qhFN+q7KpVKvUcYDAaDwcBisdxTU7m5uZSrUWAYtmcLeTkF3sERHut0octydVk8i5zOXAm5EBSeXXJHp5pf7E9bjGQu3vgdPtVa39pxOiDodEAwFb/I/VCoyJzdlpBDhXrSIEnS6XQ6lsfucMiVypiMvLe+Pu/2J7dFvXfaNzSjqH2Yi1ksTpL0/EGn0+l0kpvFufvTanEdhdq3IQQq1LOEQqfv4/Hbt6A4Hgq14mBuO3spK47flkJ1jI73jE/uuKnBoy6B2plCLS4uEgShUipZPX1f+wa4FOrQax8dPhMQMjo+YbPt8GqKJEmRRBocl/jWoeOvutqdv3Pk6zbWt0yhVrCiOzlV6N3W1jYyMsLeO4aHh9va2nJzc6nFwS12J98uqxVq6/5EKdTpgOBL4VGNbW1WvdwharXJBmdmpEkZ2af8Aj0UKvZRK9SelJBDhXrycTpJhUYTk5H77ikfT3mi8tevzn5ywa/kXj1u2eoOo4+INRXqUZdAQYV6JsEsBEc808XhtY+Ou01ovbA4vBG+qIszsemRS0bF5vbzBENTos7NHrxjdLxngj81M7fpHhJODNccODTHfGHa482/6UbCexjsp7+0lpZvq6mB3W4fGBo5cyXkvS9OvXPsxDvHTr73xTdVdY2mLe8SsyYkSQ6Pcb/xC3732Ml3jp149/OTH311pr27DyrUQ4W6detWamrqzZs3k/eUGzdu3Lx5011c9YgVKt87OPz8w0U691Jd6LmrIe64zCnY5U9L63Tf+Af6hkRU1TfxxNNDXF56fvFp/8Bv/ANPBwRR8YuMae7s2juFcs4r1Z4KFZ5VFJW3NyVQrlQlldbe7R60WPf1jQ7ZGKfTOa9QxWTkvH3ywpvHz67hT+f9kvNvG027+qu3J2iOn1z44Y+mPapA5vfRn7Q//JHlj685RWKoUM8AJEkqdYYRgYQtnmGLp0c2DEc6K5QrR6WyjQ/zzOSsXDCvHJVs8iNs8TRveha3EJtO0zqtVoPfFeUv/lmGPDdNY0oBY3Zf6v80dC8t8pye+WPrS6/Ym1rIbV5HaXX69u6+2saWe43NNfVNLV3dOv1W98zYAJIkhznj95tb7zU232tsftDSPidf2KvRcIs8cQo1ODiYk5OzJ5XjWyQtLa2goGB4eHhv/y1LCpWdfyE4/Fxg6PmgMO+QCKoL1Fr+5L7J7mGdk9uiTvldPR8YevZK8IlLV04HBJ+9GnouMMylULFNezgLRZIKra6wvi22sDwiuyQ8q2Q3XchXmBNViZxQUnOrurFlmEPsdAoXsuc4SXJeoYzPLnj3lPea808Hfa/mVNYYXL3KHi/YnTL1v78kZ/54lu5FddHcB3Oi5MnI/LHpZ7+x+geSu66VhDw5mAnr/8/efX630eV3gv9T2m67p4PXdq89DmPPeGa9Z2dnd3aO22G94+62SSQiBxIEc845UxKzSIk5E2KUKFISk0RSJMWcI4BCzrGqbu0LkCAoBhFUep5Hv8+po0OBF1UXYKHqi3tv3dKZLRqTSWO8adGZzAaLTWsy31zMf9FbrAaL9eanqI0mg8XqxvFbBQqEPDs7luw8wz/8M/Ynf6H5d39g+PHPjD/6iSHwGc5u3tt9M3Oafuenlt//heUXv3T8zf/upLM9Hd2kwQDfH3y+WxHK4/FsbW35jyj/Avmpqqqqra3t8PDw074Wb4Qqr3skTc4IT83MfFBzv7U7835NWGJaaEKqb5GcLineH3w9dGfL6bAnUVySMDZJHJcckZadX9tY/KgtOitfFJcUk5n37OUna4WiKMqN4zvHyr5XM+Xt8pJ2eXnXUHH7QEFL3+Xpp69brphAqKWvpGOwvHv4fvfww4GxV0vruk/xFQR8Et7+u5zqh/8kurr/7tfS2Md9A9YA5yP+fJDL5ZqcMoRHq//mb3U//2PrT/7A8uOfGX7nJ4Yf/UTvXT7BKeQn+h/9xPCjnxh/9BPz7/7U9vu/cP78j2x/9td2Gsvd0oZ0OjiFgK8GIdJuJw6PHP0DjrQs2//8V9Nf/WfbH/6J4+d/7PrpH9p//xeWH//M+Ds/Nf7oJ4Yf+X0oblwMZ4vpd39q/b2fO37yB66f/ZHjF780//Gfmf+P/8vBE7oeVOKvZ5FaQ33ctSA/PN+tCEVRlM1mm5qaampqevjwYV1dXV1dXW1tbVVVVVVVVW1tre+/lZWV7/32hv/6F66urvb9tq6u7uHDh21tbbOzs57AZ0m+GUJIqdaU1TVIkzOis/JrugfaRidrugci03OuzE/i+Gvzkzg+WRSXLIpLFiekppRWNI28fDw0nl35UBj76SMURVGIojw4odDq59a2hmYW2semHg6M1Q6MVfePVsmfVfQ+vd89VN41WNo5UNo5UNIxUNLRX9LRX9oxUNo5UN45cK9r6H73cGXf0yr5s5r+57WD4w1D490vZ57PvlvdOzSYrXebDQh8Dgghtc6QV9PwD4Lwa/JTXOmjVrPlO9H+dA4hhOOe7R1XW4c9Isb8D/9s+5u/df/Ff/L8yV+6/vDfW3/+S+O/+wPD7//C+Hs/N/74Z4Yf/8zwuz+9afnxTw0//pnx935m/L2fG3/yB5af/ZHzf/lTz//65+4//2vHX/0X83/7H1aO0FVR5Xkzh+x2KvD7JgHwWZAkRRCkzYavr7v7Bx33K51xSXYW1/L3/2z62/9q/Y//m/0v/8bx5//R9Wd/5frT/+D60790/8lf+C+uP/kL15/+B9e//yvnn/214y/+k+2v/rPlP/2t+f/8f6z/8m8OUZgjM8f1qMnz4hWpUFAuF+z21/nORSiEkMPh2NnZmZmZmZycnJyc9M5o0NTUNDY2NjExMTo6+vjx44aGhvHx8cnJyfHx8ba2tpaWlhcvXvgKNzc3+xd+9OiR97fj4+Otra0tLS0vX770rnxmZmZnZ8fpdH6OF6I6i1CR6Tklj9oanjwrfdQmS8nyy0/nHXaXwtP54s1PorhkcXxKXG5xVWd/dfdgcvF9YWxSTGbu05evPl/vL0mSdpdLZzKfaHQ7J6rVvaOFzd3XK5sTS2vjb5efzy+Pzi2Pzi0/n1t+Prc8Nr/8YmFl6t3Gm9Wtpe29jYPjfQWm1BtMVrvL44Fmp+8ahJDRYut9OSPMLPoVL+xyfvq3iMT6brnlu9F/dy2SJA0GYmPTMzHp7nvirmtw5BbaYhLsojAHi+v8V5rz//uN8x//p/NX/+T8H3/v/O+/cv73Xzn/71+d/vB3/+j8h392/vO/OH8d5KCHOPhiW0S0PT3b9aDK3dHtHh3Dl96RSiWCcXvge4EkSYeD1BuI4xN8fQOfe+uZmHI/e+4eGnE/6Xf39rl7+tzdve7uXndPn7tP7h4YdA8/dY+Ne6Zf40vv8J1dQoWRJjNyu6Gd9Za+cxHKCyFEEASO4ziO6/X6wcHBoaEho9GI47hWq5XL5d3d3RaLBcdxk8k0Pj4+Ojpqt9txHDcYDIODg8PDw0aj0ePxaDSaJ0+e9PT02Gw2b+GxsbFnz545HA7vyomPuyPKzS8B02jv1z+WpmSEJqbJUrPicgplqb78lPKh/JTyXn4SxSV7B5LLUrMjM/LE8SnC2OSYzPznE9NfcgCd72J4nCA8OOHBcd+C4wROEN5L3CEwfcchhCw2R//kXGnHQM6jTn56vn+K8vbfNfQ8sXxn+u9uiyCQ240cDmS2kHoDqdGQShWpUJDHJ+TREXnoXQ7Jw0Py8Ig8OiZPFKRSSarVpE6HTCZksyOXi8JxOIUAAD7oOxqh/BmNRm8qslgsCCG9Xu9NRVarlaIoq9XqjVDeliRv4ZGRkfcK2+12b+GxsbHR0VH3F/laabZae4efxucUhiWmSuKSxbFJkrjk0PgUycVFHJd8tiT5/ZwsjksWxSZdXoQxiYKYBGFMYmhCau69qvWtHcgrICAIIaPV1j81V9oxUNjSm9/Uk/OoMyQ525ui/o4b+uvw2NJHLd+R8eMAAPDd9L2MUN5WqFtGKG/hrxKhSJJUYpqOJ0NpRWVR6dmXl8i07Mi0rCuXiLSsiNTM6xZZamZkWnb+g5qX06+drq88Tw/43jHb7IMzb8s7Bx90D1XLnxa3yvObejLqWjkpuX/Pl/5bREJ9t/z71/4EAABf1vcgQplMpuHh4efPn1/XsPTy5cvx8XGXy0VRlNFoHBkZGRsbs1qt/oW9Actqtb548WJ8fPzLRCjKe1cyl0ut1Z2osBMldqJU+S/HH7GcqDCdwfiR98oA3yCCJF8trZV1DVX3jazuH+0r1R1j04Utfd62qMiiisd9g5CfAADgg74HEcrlcu3s7Kyvr3svmnM6nZubm+vr694BQG63+/DwcGdnx/tfX2FvtnA4HN7C3q4ut9t9cHCwu7tLwvUF4FtltNqq+kZK2p48nV0kSJJEaOPguLClr6C5737PyMjMgt3x6a+uAACAH57vQYQCAHwqiKJ0JvOD7qHiticdzyd1JovZbn+1uFbcKq/offpycQ1uvAMAALcEEQqAb4sHx3tfvSlu6y9pe/Jo8Hnbs4n73UMPeoYnltYhPwEAwO1BhALg24IQUmj09UPjJR39Je395V1DlfJnI28WID8BAEBAIEIB8M0hSHJfqR6cnm97PtX98vXbzR0X5CcAAAgQRCgAvkUIIafbY7E7bE4XAVdXAABA4CBCAQAAAAAEDCIUAAAAAEDAIEIBAAAAAAQMIhQAAAAAQMAgQgEAAAAABAwiFAAAAABAwCBCAQAAAAAEDCIUAAAAAEDAIEIBAAAAAAQMIhQAAAAAQMAgQgEAAAAABAwiFAAAAABAwCBCAQAAAAAEDCIUAAAAAEDAIEIBAAAAAAQMIhQAAAAAQMAgQgHwA0GSBEEQJEIftRaE0Eeu4dP6RPVBJEGQ5DUrQt637jLy2qd8aHOBVBohkvzQH+42ZQAAXxhEKAC+/xCy608eFcbExiWUDm3f+TRLEh7d9vj47CH+KSt3d4gkDHtjz6b3Pro+hpGyhJiix8c6x+Xfuaz79TmxMVdJzqjZMHiIAIMLidsXXr1YV5lul3jw7emerPi4qvETD3FdeXzndV9OQnz1+PH1ZQAAXxpEKAC+9xDpOZyuFTCZbDpDGvf4hLjLSkjc+Lw0iskRN73Y+m5EKOvL+zEMFv/h0w3Px65K25HADI4p3lNbL//OYdooCKMFM3jSqPfIBCF0Oi2iZWHfE0BrlK4nlccUp03ta2+XvTwrz+olDHrWk333DRFqpjcrLrZy7AgiFADfHV8zQiGEEHnm6oZvhL5It8LHb8b/pfj7cp0igb2Gz/K+fpk/FrgE4e7jzjQxL62oKVXCEUeOrOjIwNdC4obRkgg6W/TdiVAvyqNoDN4XilCR9cdu/OLua1991pEURguWZb0+ct9619Z1p3Dowk8bocBdeU8zH31c+q4d2T5NfdBNpw2Erjytfa6D/Pf09PGVIhRCLqt2/mlD0lmDeWJWUcu0grzwFjo1RxOVaTn1wwtOzx3OCLdE2gwnI/XlmTnFT9ctd1uDXb83dD/1qn6A+PS8qldHts+9ZxC4Y395KD81u/7l0W0KH6wO5admPXxx+AmrYDdtdeZk5pRWb6icn2614BZI3LnWwWNychuenkzUMpnc0o4p26WGKO/BEF1+8HTnRIRH96xYRmeLGsc33RdPOhcOpZd2ZuR7+LyYr9CFr0mX6/7eMfrCRknzWFkUjcGrG1l3BVKf99eM0F0jFIVcFnlFPI0WnD+iIMgrXtOlKiBEarqSOXRB6uSe2kNceMMv1tr3G78IhV9Z4PzJ52/rWYkPvL8X3gb0/lp++NDak8K0xJiYB/1qo/2urxsh82pby4TS4vx856FAIGRe72idODbYP64+7q3x9vyMlJrBRYPt8pcU63zHvcykyx3cSfXDcxqr69PuRCS5312eX/Bw8EBjvePww6/ky0coRLpM29Nd8TwOm8MPj/A2mEfKpGJuCCcuu3zx0HT2Djo1h68epGQ9HPq8Ecqi3esoSBJLY7oWjXdaA2HVrLel8mkMlig0PNKvGyAyIlzEY7PYwuzyfo3nTp0rt6wB7th7N5ibkvXwdhFqf2UwNzmz9pNHqKz0rOLKNQwi1BdFuCxTdZFMXljn9J7DuVbOZbISHuzr/Qf9INx92Bwr5YXGvNz2ZQhEeJRN8ayQlCqFwekyqeuzJcHBQUFBQcHBNCYrpG2VoCiKQshpVE50PRCF0Ol0Op3BjK4ZV2IG9+knEpHEcVt8OEcUPjh3sNqbz2Qy6HQ6g5nzSqVzOG1q1UQei+l9ZnjNK5Pdjc7rZFftrlemi+h+qsYVJpsbURThMDblndeHTqc3vjv9BLnM2Iy8WsI+fQotq/1EpXNd+HjhZuVOS2mct0BUbt3qyX5bPOMOEYqi3Av9VQIaLfThPE4giqJIl+VgdjBWyj2rMi2EL+5/i9ncBEVRtr3plAg+LTgoKCiYRqOzhWGv9j0kohBJmnRrTSlRIQzvk2ipLXNqg41AyBeh0rveLY93x0hYDDqdRhPc63+jMvlOVJ7VscfSEGbWkz03jihqq0YsiM2tXtlWDJWJ2Ew6nU7j8FOeb2JO/PxQiUiPYWsqIz6MyaDT6fS0xy8295fvxXCZud1Gmyuwnez7iVDP5EeIQlhMGi1paF/rusvJGWHr4+mRfG5iy87HRpZPAmm2J3NixZz4x+say8edVFzLTyojRNyc1mmtxX3pt6ZXVcliNpMvCpVFnp/WImVSHpvFympZOzYSny7skORGfVJEVH7LttIIEeomiHArNt+UxElDZbkDc+/O/nC43XT8qv1xWiQ/sbh1Q3/5z/n5fKIIlSYSRWeMr6v8PmMId1m3X4+UJXL54fE907ufM0SBbxUiLHsTKaFcoSxrCXOTuHuxO53LCKue2vdvGsHdB03RoRxx1MUIpWiMZTCTKhV6B+GyLU70FEXzaQx2Wkld35P+NQ2iEGnenriXIqRxIyubO+R9fb2P74l4LDYvbnDxxENR3gjVGhtGZzLDw8MTCh/39fb1Pr4v4rJY3IjS0nyhLKOpr6+vr68mQ0yjswpaX1q9T0PmpZ4HwmBWXNb9LrlcLu/r62vMFPOCacyM+qcmF0l6nCvT8pJYQTCNmVxY0yOXL6tJiqKse9OVacJgUWxDS6dcLpfLm7Mk/BB2ZMfUtuPs86VZ6csQ09jhSY1t3X3ynsq8hBBZUrIg+C4RCrc/f5TFpAUndGzgJKIozcuaTB5NmPewqaevTy6Xy+W1CUxGcIik+vmGh0Ae08nLZ53ZYczgkLCyhhb54MiRiUCIUi8OJIUxaIKkhq6ePrlcXpfLYrJkGfWbOiuJTiOUMCIiPDq1sa2nr6+npjiFQ6dFFvQcW71V8qw8bwhl0jPlu94IVS3kCsViCTc8r76zp69PLn+YyGGFiBNHVlS+YVv7U4/ihQxBUklHV0+fvCUvIpQdlSTj0GhZXUbrtxChHMs9D0KF/LSie5ECdmLtFGbzBH52RtjaWJqM912KUBNZ0aIvFKGEER0TK2bXecc+4TDN9FXJxLzs2mfHRsenekMgQt2Wx2l8O94YIYkq6998r+nQaVKNN+eIwhJqJxTnj15sLvQ1bl/Rh4uu7de96Vk3RCiErl+lv+siFEVRFHLod4eKGRxRTtNLq+vsmzvyW/+lql69xetqcaEL4VIPy/X1v2no2TUdAuiDpS4+ePkZV72AK9b4fewR/1pIwrn29KGIw4p9NOsmKYRI/dFUioDOTevWnR+KPhShDA7qirFQiDDtPEwOp3PEjc83vM0byGNXrvRE0Bn8jHqlyXUaoWLCaMHMtIqeI5OHoijktk8+jKYFB9OEaaNrSu+qHMapHDqdlVR5YnBSFLLtTyaFcbiSrLcqx1ktPaYNeSQtmBZ/7+i0Ce3SWCj74aM0GYMj7Jg58hDeTxNu1qzXRTFCZIVLmMVbpiEljMkRdr72XryGnFbFk4JIOi0oKPAI5bLs3ItmBwdLe7ZtJKKMbxvFLFZiccexxXcydh1PPwql0xgFg47TprBLY6EMC0XhPFp45uTy8eloJ7d1a6CEyQp9/HrfTbi9ESqEl/xiR+siEEUhl3b1Xrw0hBs6uKzDSXRlhKIH8Ur7ZnUOb53dytlmWQgrrmHK6j3hmRZLZFxBXN6bLS1OIooirLrt5hQBkxYU9I1EKPNBdW48lxf/dHomPy2KK8qaPjJf7s/40OERqdaep8l43MTmHf0V3eO3OmReNVL15oMi8nfxN2cR6tG62nx9fW5zsHUtywOOUBRFkbqFB0kRsoS8+V3Ne+/ntbW+pgbn67wyQl13QqGufdD/JHLL9/faet7Ol45QbodhfqwhXBxV1r/1XoQi3Lbthae5WTn3hjcoiqIou3JnOFMYXtQx5fDgZvVOe35SqCyueezdRHsZj82g0TjSmPIXByqrw7SzOJwv4NBoNBovLP7hC6PVhSiKokiLZq+jMDk0PPbRs8WR+iwOi0ajscOiS8b3TqxO7+53KUIhhLtsh+uTdQl8Go1Go9HYIlmZfNHs1wfxXsVviFAUcmj2R5JZ/Kh7fSaH22Y46i3NkoXn9Iy/yIji0ZkhspTipSMLIjz6k/XeigwOk0aj0ViCsJz2Oa3BjCMKkbh2f7k4MTQ0Mn9a7feRQU7dwdN0nji3edxktWzMtkUJpEWDuxRFIZKwYLsvOot4NBqNRmNy+En3u/aOtd5XTHhsW/PtUYKwgoGd0zWRuFG5+aQmi8uk0Wg0Jk+c2fpGq/MdbnCr7l2tLDQ6NW/m3fZAmcS7VkFoxuiOznVaCLfpl2vDJeGJOYvHDhJ37C11xwlCq8d2196Mp0ppNBo9hCspax9XmM8/qwgRDoNiY7CcTqfRaDSOUNL4anusqVgkFOX3bwe2Y32jkMeMNRZEMFjC3m3vvoFcJlV9toTBDHm84OvLu1OEQqR+ZThCyBLHPNi1+W2SxFc6Uhj0mIE9LTprhaKFCJvGt/GzEpqX92h0WmJFr97pexbWEssIjinb19lPH7g4fMdtM2GKV7lsn9HJAAAgAElEQVR0WnBs2aHu6ghlXB+NFDIlRc8sF7+o6qYqWcH8upkTAlHKebmMFyyMaVX5Dc1Gu3IBg/aBCCW9//bwWHnBZCGbRWewwyqeO92n3ZoXa006jNrdjSdxDHpwjtxxeqZ5P0KpX1ZwQkIyaoZ0jvM6Ocxv78fH5Xe9dbqd3gglrZ/z64bT9efGs7nC7nnsugjFjMpbPTL6KuM0z2bzQ2jZPSa7i6JI1ctqIYeb/+ilwS8Xmt8+FrEZ30aEQtqNifQoniiz+9CsHqvOFXC4xd3zJof/aYfYn+tNEPFS2paMdl9KcL7tLA0TCUr7Fi0O/GS0LIzPCgry9szS0pumtFY3oijCaVEdL1UmS7xHbG5k6rPX63qbrwWQOFh8kijhJzVNrc1OFKTIQph0Gk1S+WRCYXZYTQfy8mwxm0Wn0WiJlXPrivO/O8KtBt1yX5FUGEI7k/Cgb3lX68JJRFGqFxUR4hBffVIbxpVGF0IU4bJiypXa9HDvMZwmiul5Pq+x+HddIpfVpJx8FBXKo9FoDCarbmT+eVO5LPAIRREHHelx0sjUiZVjl3fnIlxGDfa0ITuUz/JVO7NpckthOfuqQ1EU5bZqV1/3pMrE3jqKs+pm3h3a3Di6HKEIl3H7aX6MVCzOHdk8sZPWmdaqKAHvXt+C1uqrjGWmISs8IrZ/es3mwinK9rq9KlrIK+6YeNlbmyjjM+g0Gi2mYfzNsdnu63PEHRbt1tOCOKm3omxJVNezWZXJGejEJT5fOkIRbvvW/Ei8iCsIy2wbm1abbvgk25U7wxn8sIL2KYcHN2PbbXkJ7JAQaWJqZn5Vd3dPc31FpITH5Udkld5PTMl51NnT3dFSnhHJ4Qnz6/p1ToqiSLNmtz0/kc1iieMSIxLyO7u7O1rqM6MkHL7kfteE0UldjlBum2H2SXWYRChOr5DL5XJ5V/Ojogi2MLuy+5oexhsjlNusmK7nsQXJtcMWp8dmOOwpSeMwRdHJiQ8a2vv6ngwPT+nt9qM5eXaskBee2tDRLe/pbK7I4bLZEQnFb/b1BEXaDSd9D9IEQmnV8O7Z7oPcFsVMQypXEtczs+t02zZmWyP4YQUDOxTpMe/P308R8EIjqxu75fK+zpaGtCgJTxjfNnOCeyPUXFsET5LXv0NRFOlxKBYGcuOEnNCkhx3d8t6u1so8LpstjSmY2tURFOWNUNWhghAONyIiKf9hu1ze29lanchjC6Tx/XNHOElRFG7VL9dIRWHxWQvHdhJ37C51RTIYEYnJ0eGpj7vkfb3dDVVZAgY7uqj7yE5RFIUQadYcNBVEstmclHutcnlPR9u9qBBOeKiIzRXkPtn6qP3s24AQaVDMpgsZrIQ2zdkxgvQ45vse8EPoEUXysx32LhEKkZ6dF00SNj2q9vWF/R6RmqVmMY1e/OyERKcRiskPG1zW+QoQK60MOivn0XOzb38l1S2x9GBx9oLK7FuTy7o30u7VVpmfFEIPCgoKuj5CeVaG6wT0IE5SeftFjQ35wuCglI5VnPSsPH0oZAQldW1fPCQe1od9aCxU0BXYsvy20dcGm/8bQKi25uUdHe3t7e3tTYVxotNnXhuh3AtNKSFsXt3TDTdxZb/HlVfk2adqU9hcfsP4rocgr4xQouR7O5jNd4502XbuRbHppxHKNFqWzOXymycP/a/yc1mXi8LY9OwffoRChHu6s0jEFt0b27O6SeO6PCWUH5lZt4WZ/d4PYm+2O07ASW5dvBChOoolAl5J74LZgVv2Z7sbSsN4LKYkvb6t69XqscNNeKya5y1FIl6ILKW4ubO7r6+nIieWzeSl3R8+MHuHnBMHC30JIq4wISFaFl/7uL23t6cyL47N4iWVVGenJhZX1Xf29LY/qoySsFmS1JfbehdBURQyHb+9lxLFYcU+aGrvkcvl8r7HVXkSDospShleOnHgyHr4tq/pvkzAZohTa1s6XiwfWl04btO/7CgLFXIiM++1dvbI5X2PawpCuaKUsvYVldX7JddlVvRWpAs5rMSCmvau3t7emgRZeIyYH8JiZgcYoVxHEwVx0qiUB8tHehxRFOU+eC3PDBeHhqfXNbf3yuVyeWd5WhyPyZCmVSzuaby50qXe7CiL5fP4GSVV7d298s6m9PhwFjOibmhea3dfiFC4Y2u6LzNCIo0rfr60Z/MQFGWbbq2I4HPKet/6R6jp+kxpeHT/1FmEaquK4LNFMhlPllZT39zX13kvM4HPYsYXP147NuIkRXms071VEWJOTM6D5o5euVzeWJkbxhfFPxjc0tru1in5xYeTI2TTHo08TGMxghksjlQWGROXkF/RuI1dPrRdEaFCWLz04uZdvYskkV1/MvooM4RJF0WnD83vu0iESIdyczRfKIhIL10+sfoiFIvOjEwterOjJ0iSxJ3KzenaBIE0MW96V0++F6Fwm2pZnhgqSavpP9R6vy6Tbrt2drg5QhSWVjdhvlTLGyMUadftPMmXsoURdU/fuQjSZjjsKUlhM/mZJU/UHgIhhLusut2pokixMDptdPHIO/QUt6pXXtSHhQiTagYtThy5rYfT7RKhOK2kG/Me+kiXYW8yXyqMTi9a1+CE5zxC4Q7zylCVWCjMrn9h8pAUhUinZX+yXSIUpRR3Ys6LEYr0mI/elEZL+LKkobkDN4EoRBI27cbE4zAWP7ZCbnLg3ghVJRGwOJLyjlc6J0FRiHSbDqYaw9n89IZnZidxZYQKD6LzRGnPdkwekkKIsKi367NjuILwlrdGiqIIj2N7sjGMx09tmjY6cIpCuMe8OtUbww2icyBC3QqJu5e6UhlBwcEccVR0tPeCmejo6HAJn04P5obFTx+cNvncKUK51kYeikLo0c3LF7aKSP3xcDSNntC27ItQIYLw51sWX4EPRyiEdgaLoyJETG9UCQ4WpNxb3Hx+YyuU+23fA95VQccr8tEsTrjePqnkBwflDSsuRihtR/yHrsiT3p8/ODq5SKW1vvf19G1LYriYRw8+TVxh5QOry303tkLZJquTWBzBo5d7+NWjPD5HhNI+yUngcgXdc5j/PFIu2+79aM63EKFwl6IxIzQkuW4Hs5CIogi1PE/GEyc8fXfg19T34QhFUUh1OhaqecdgIymKQsTOVHuMhMvO7dw6MeAkoijk1G015CVx2aLK4WWLE/dFKBYzundu1+IiEELazamsWCGDTk+617uvtRIIER7t4P1sIYdT2rdgsuOIwGc6CyVcaeXTNZ3ztO3QYz5sKUrjsdmFXXMGm+dCR553LBQiDmZ7E6X8qIrhLaXF29yCu/STzcVSPj//8QuVxYkQeVrmwdA2ZiVIhJBzb344PVLIoNMDilB29d7jkkQem1naPae1eiiK8piOHpek8NiRHVM7Jpd3byMdJ2/uJ0aEiGOH32zZ3QTlMY03l4fx2YlVA7uYmSARReKm9WepsWERaVXLR3o3fhahFEbFu+Gc2DBWeNnLtRPn6beOACIUSxTZNf7OZHcjRDrMJ08rUsMksrbxJaPD49Ad1BXEcyNKXm4ond43ynjYdC+Lx0uULxxZL7a13dLXmdQA2XV7LxqiIiOkYj6NFuy9eiWEE5pfMXhkcZwdFK6IUDyhrEK+7P1rE3bD6tNaAZ+XVvLw6DTaEGbVSnOqKDylcOHA6ItQXI6kpGHifMYCp35/vEokjn48tuomL0Qot0n5ujFFEpv1alN9HoZIXH+4UpYSGRZdNK+//Gq8EUookCX1Trw7Oe8FONldn3+cm8BihkRk3l85NlPUaYTiCWUVowenT3aa10cfigWC9LIu/0vZHCbsaVW8RFY0qbFRFG5WL9VFimTJ+UvHttNnPauXCMU5lWNminovQi0NPBBxeSl5XXsmO3k27sp3swr/CEW6bDsvGsUCfnJhu/9cBC6rbqw2QRia9wqznrZChYmEMelT277X7zFppnI4nNDCdoPNc3WECuFH1M+c/TWRy6YeqcnmcYXeTjqXTff0fiQ/vHhWd3ZWQ6Rde1CfG8VgQ4S6DeSx79ZG0Olsviwi8sKUkJGREh6DRuc96Ju1I+r6CHX0KPKGCOXeGG0QsenRjYsXvhggUvP2kZBGL356ctcIhTxHM3FhHAZb9mh4yXZ2LxWEvyu8MUIt9lfyg4Oy+g+uvhsLQhTlXhysFtCCsgaOLiYfrCXmLpMavMf9ro0TwuQKM0b3MM/ZRq3aF0k3RSjHTF0yi82vH9vxTzOIJMw6lUpj8pCfI0LpBgsSOVxBxxvFxQi1VR75TbRCmWbqQvmc7I43vsv1FeP3QnnMpIZXWotvSMatItR7w8lJwjVan8rnRncsKe1++4t5uTdeKkwsaD8w2MmzCMVOat3RnzZvuDWb5ZlRbA6/Z15lP62Uc6GrXCrk5rfP6G1u6rSj2H/2DNys2+0ryxKy2fntby5GqNPh5Ih0vXicKYy7N3uo8fgPjVVMZcdKo9IqVk+Mbo9r4EGsgJc+sq30nV8pq6KpPIPLDrkpQoXQgoNpNJr/VbO04OAgWcXzI73zfMwSeeHuQ4THqdcuPU6O5opih15v2t2EW7dfW5DA5SYOLSvt56NRVM+rSrJzymY3FA73en1SRFT+4/mXHblRYeK4+9O7Kr9uyNtHKE50RuO60ujbCLk/kh0jy24YOtLZbJr92vw4Diul5/Wa3nna64reH1MQmK84tSZCuNN4vDY82N/b2VqVn8CkB9NY3Lii+rcn3o/3FRFKKI1tea0+XYHLfDDVJhZJcu73aE4PCN4IJQyNy57YUpNnEUoUGtM0g/lt2qU5nMgPFaXWP7O6PH4RSmNULNRF8TliWVn1I7+OgrbGhuq0CJEoPPbJ+uUbRHgnNeAFBQUFv4fO4svSGuUjb/e9A9VPI5QoNKpt3uB9E1xW7WRrgVAcVipf8w/BHodxceh+qDji0ayJoijcplvuyuCGxnZP73pI0m447nuQKgyNaJnztuicRyhEuNSbLwsj2cEMVmhibmNLe+/A6LbKfP7N6zxCbXvshtedJUKhuKB7xX/ruMuy+qxCIgh7OGM4i1BiaULO4rHv5RNW/Xpl9E0RKpIjypZv+o4GHodhqq1YIPBGKNxqWCgVcyLLegw235aR26F/8biADx15t4AIz/HLByJGSErNoMFB+A/kJAm3YrpaRGdIC1o0VvyaCEXixqk0Ov08QhG2mZoohi9CIRJbkIcLmKGpzUq/Ey4iie3eDBo9tHkJ842FCixCIWJ/sjWUEyytmHb5Xw6x3y+iBftFKNdsfSyN6YtQ6HCmI5QdJMkZvqox+HQl2EK/jM8QZw+Z/I+JtvlsJv2jI5T77eNkJpv3cHTTf7Jy00IDn07z68hzjBRcGAt1/KyYzWLnN74wuc6zqNOyWSJjifLkWqd9+dNHKM92fymfwy3rnLX6XQls2+mL5jCDf/hjofTDBTKOIG5ocd/X5uQxbFUmC1nS3Kk9w9koz7tEKMKtb8sNYyfWbGCmCzOhGhfKokNlyUUrRyacPI1QsuqJ83RiOqgqSOByE0e3dGcTTDkXu8rDBZzM2lGVxZdIjMvPBnva29vb21tb6pKlPCYtKIjGyLsmQhGe3fpkKVuSUFn3qK2tze+sVZ0mFkiiM99sYU7XXn1quCS3eRcz++259tm2++EC7k0RiifIKqvu6OmVn+ssS43lS5Ibel8oTed5DJGauacD3e3t7e3tDdUlEWIuPTgoSBjtjVCm43elqeHstNYNvzMR5XdJlbcjTxIui+BwWAxOScdLpcnp/wG+fYTKaZ1SmfxG3JIn7flx0oy6lQOtx2Ecay2XCkIYHGFuaWVTS9vwxIre6rpjeqIo6rtwgxeEECJxp9V4uL3S35DN4Ugz6qetFHVlhJLI4nuWTKfPvHWEkkYmju76X7uA607mS6OFcZUDFqfbL0Kp9cev7wk4p10LFwQFBQXxwqI7Fi5PfOBrhUrsfbV0rPCnxHQm9/k+e0WEcpqx5w05AnH4vad7/ivF3Za16UaZQFry9ICiKAq5DUevS6JFOc0vrA63dn+5KF4aFlm97qaoixGKoiiS8BiONkdqkrwvg85gicJkKVn5E0enhX0Rym3TvWouEIgkxUM7F16Sx7412xrBkxQO7qGPiFA510Yoj0U3lRvCTazqN/kuRqeQx2mc6SgR8CFCfRDC3ccdSWFMfnjP66NLHUQId+zVyugMbox8TYcoRHi0Q/kyJje0fWrfewRChGejL41Fo/kiFCI871piGOfDyZFbs1QgEzAEkUMrWt+aCe1MtjCEHlO2o7VTd4xQ+ObYIxErOKxk3DdOHSHNUE5c8IWxUGi1Pd4vQlG4fqUoQkDnyJ68O/seRVEURRlnG2NioutenRCIIo3rJVFiFj9yfMd69q7Y5xozQu50Rd5FtonKeCaLWz246vf9eK8xUkQL9h8LRU1WcBh+EYpQPk/ghITEl22rLL5ct/+0gMfgP3i+5cLdn6EViiKUL1IEnLCMql2Nr4xptFTGogf/4IeTm1f74iVcGp0lkcqiok9FRUUK2PTgYHpGz6r59Fqiu0Wok0dpoSEZjUca84WWC2K3MV4WGpszv6PxEKcRKrFpXuebtdJ8UFWQwOVdGaGeeSOUVblRX5YiDmHQTr+EM0s7hxvzM25ohSLcKxXRoaxrzllsWerUmsLuWKmKCYss6jpQW/zqfLsr8l6tmJ0e/y9odtNqU3K0UBjbN73uvfxT9VZekh3DZ51WO0QS0zf2pCY+8qwVCtcfzBYmhrHz+/Y1tksboqizCMUJCgoOS4kJ4/CFmUMbx/bAW6Ei+Zy60U294/xFIqSTlycIUyqWdjGCJF02k/pNa4JM4H2/mGxBuCyyamRdY73jBBFfOkIZFTuNOaHxRR0HjvenQ0W462hlKj1SHJFY8c5EfeIIteeffR3Y/tMMniS35aXd7d8KpTaczFZIRdHppSsnVvwy4sq5xC6Mhbrx73BVhLKoXzzOE4ql5UPb/lX0OIwLA+USccSjN6ehzWlWP6tNkqbWrmj0O/P9CeGy8mf73uq8F6G8a0YkgTtMqtct0VGRslAhg8EMT8pfPLJdjFD6ydYioVBS1L/pv3XcaVkZuS/+6FaomyKU/nUBlxtX8cTv4IU8DuNka7GABxHqQ0jcujUWJeaIItN9w7j9IcJzOFbOpDNj6mYcCJGEZ12ewaHRWPGlixv7JyfH80P1MqmIx7wQoVbb4+l0bnHj6L5SaXFRiCTUkw1iDo0Zmjm2sq1QnBwtjESHchlMwf2e1zbvZXt36siz7E2mhLOD2aKGp0sKhUJxsNVUHMPihYrYQUGCzDdKk3e32exOpgWzch8O7ykUJheiKLQ9WBLKCabRojrmVk8UCoVCsSYvYjEZ3OiSd+rTCmwPl4TxaLSo/NmVHYXi+PWTWomQz2d8fISiDPNNoVw6TZYz/W77RKFQrLxIjhKxBWFcZnCQtGbPcTrTwUy1kEGTNU0tHStVdg+iKHJ3uFTIptNl9+f2Dk8UirXBch6byU26v60yI/Q5OvIoiiLftiaJ2PTwMvn23pFCsTdUkcwTCNj04B94KxRpn2nMF3GYfLE00hegoqOjo6MjwiUsBi2EWzCPWXBEXROh7LMtRRL+DRFK1ZgZyk5r2NOYL5wO9HPF0aGy5MJlv1aoxOZAIhSBv+0rFQuF4TG1iyqDE8dxHCcJ42h1gZjDuTZCedarYsNkBe27KpPHc8U5CyGK8GzUxEtlhR37FyPUYk/FHSY1oChqoy9HxucWdrxSmV2E6eRxWRqXK8ws79lRm9zejRIHXZnxfPFphDIczhcnSTk53btqq/975rbo1Gq12e7E8fX6pAheeNHE1snO/JPUSFFIRuPKka+d78oIZZyozQiTvh+hHr4Xocjtx2nRUblN68eGs2EtJEEQuHKh7l5ebHQEnxtCZzAK22f8265u70tHKJv2aKAiXhiVK19/f1QRItyK9deZ0dKo5IYtF/UJI5RQHNkwtn++F3jMx3PNkcKIyoEFJ074RSi9Tbvbly+WxGS+XMduPT7/xivyLrgcoSjcYVoeqhILRTnVI0a/HdVl1ozXJQqkGUN7pycG3GVdn2yLCY+tHl2ZaM2Rxpe9weynNfAfC+W27S+86u17MrmlpyiKQojE3Zajd40F0bzQ+CfzBy6/sVCE07r+rE4sEKQ/GNT7bd1t0082JHHFKf075s8ToZDToujODRXGV24Yz9aJSIdR0VaSEALDyT+EcFsmWou5TGZG/dzVX+sQacYW88I5jJC4MRVJUYjAsYm2xlhRMI1GozPYyYXVI4tvH8ecj4WiEGnZe12dLgwODmYwQ2pfWyiKQiS++7r7flbs6cXKdLoovWp4dFbn8h2N7jKcHCHXwdzz2gxRcDCNRqPRWNyciuaxZcVKa1xQsKxrTe1du/1wri5THBwcTKPRHkyZKIpCiDyY66vMSzi/5jtYUNgysLSr9cUP7+DZsoyo0+u74zJbXk23xN5tdvL33lX72vOe7Bi+dxoOmiimvrlzYuWorUhKpyWPa04bp3SrozmxfDqdxuJLnm5YCUSRbsfSZHuuTMTwPjNYkPdYPr/pnQbzM0UoCnfp5/sbokL5dDqdRqNF5NR0vRgriQj5YY+FcqjXH6RFcDmyJ0squ5vwvw+PXb1RmR7JZnMaXuza3eTVEQrXPinP5LM5vgil257KihZwk87GQuGuoeo4nihtZEvj9OvJc673x4ULY7IfbmusBLpLhMJxQ2ehjJtQuXKix31Jx6ZsKk3jhoScdeRR+v25vPjz2ckJ3NRTEskLL5451Fx3H0eSMA9XJQsiiqcP1OdlCONIbaGYww70ijyKovaHiyKE/IL2lyqz03i0VJIi5aS3bvp30mnmS5IimKIYb0eeQ7NTlRfLCc17ua3xu0uOaaImPSIibvDNpsWx+jApIiqvZUthdFpUPRVZYg6ruG1aZfYOXLsqQrl227MTeKL3O/Iy658fG/zGaWmnSxMiUip6dzGL3aScGh3oerGitbhOB0G5rItPH8dK+dFZzRsK4x1aor741JoO0+JYs5TLjMosnVNd+JXbpnvTXykQyJIfv/FQ1CeMUGwWN6O8UXF68PQYFW/rY6Ti6Iznq8r3rsgjXcbdibpQjiS94ZnVd88IEjcqthrKMzPySl4rqEs+KkJRuANbHU4S8qRJhYtno+IpwqFdG0gUCmWF7eqzC6oR4VHtzGXHhwqSy4qSxCk1Q4azLjD/COWxG9/2lYv5wpyKMd+QEbdFM1Er40uThpdO3P5X5BEu3ebzFDFfEp87d+DbutOwNZIk5IfmNqus7s8ToSjCZV0ZuSfkhpU+2z07G3tUu1NpEgYdhpN/CCIJm1GrUCr1V9zc6hRJ4EatSqFUms9OlyTu1qu9Xcwqg8VBItykVig1BtwvfThM3hJK/dlJBSHCbtYrzzqn1SbnxQnvPGY1plBiNvf5vo9cZoVCoTPZ/L6m42a1QqHSOc7GpiCEnKfbUiiUKpPDgxCF2/QKhcrk9CUv5Doro7edxzGnX30UCszquTRDHiLtJq23jFpvwkncrFYo1LorMxIi3XpMocBMt7mZMSIJsx47ey90Lg+OSNJq1CgUmNU3z6CvjFLlO4wghFu0al+dLW7fpX7IZTNiSoXW4j8amHQYNUql0mjzPohcNhOmVGgt3jOg26hUqjR694XbubgNmFKhtfg3lSPcqVWf1lZrdtpMszmCkPCK5yb7bV7r9xFxMN8XJ+Tw8vsvDqahKIqikG26KV/ECUksaT8yOEhEKpafJkt5wsyeQ9PpRNuW48WiJAmTGVJ8GqEo4/58bpyQdxahKBJfflobzuOGVb88Tx4u3VBNnoDDyW+bMdjcvivyAotQHmVTlpQTWf72PEKRqvXR9AgRnc70RSjz8XJRcig34Wx2chJfe/4wUiiUVo+pTH7XBKnm7hdlZZbWrB0bcYLYfPE4WiTM6JjXeO8PQCHD0XxJUjiLwQg4Qlm3m7JjuFxp0/NFo9Ot239TkBDKjn+0qjKdnTLtCz21kQJOsPA0QiGnVl6dJ+Ly8jtfa862Zd0Zy4sPC08omd/VuDz+80KR9q2xjHipICZzYuXIhSOKcq8MPIwVc5MrBg50p8Pz1W97M6OFdGHke1fkiWOzX2+q3KdVUb+szA3jS+uH3uhsbpt6pyo3hssvfLWD+b5DqGa70qKFcYUdWxfHad3Slx8LRZg1e733svg0pjgitfPVwpFSqVQqDzcXR2oSmCxRUl7zqtW7H3yyCMWi0dgiWXZt/+7B0fbqm/rsOB5HVFw/onVRl+eFsmiPOgokLCYvIq52VqlUKpW764utheEsfmROwyvThzryAo5QFIXb9atPSgRcdlhq1ZudA+Xh7rvRJomAIwhL6Jja8jsxkQ6TYqAiPYRG54qjml+s+351oSOPdJsOZspiQjmCqMfDM4dK5cnBzmt5jVjAicqu2MSc780LRThMG0PlAm6IJOn+zNa+8mh/bbwtVMjli2NbXq67COozRShEErrD1ZJ4NpsvqRhaUyqPdzen70Wy2CFMJrRCAfBx9oeLxUJheeeM2X3eomFa74xkh+T2LNtcdxz58R2HCPurljxeCLfylfLKu7mQR+PJUiE3MuvNNuYhkOV4qSQplMUKyWse294/Oj7cby6OCuOx6IzzCGU6eJsXL2Jzc0dXtjCzgyCRU7NTmx/DDmGnVfSu7Bwojg+fNxeIOBxRRMHkvtFNUneLUCThmekqDuWHcHI7ljb2lErl4cv6KJlYyGXR6Yy0ymGFyYEoynK8UpISxmFnDy2uK012nERW5UZNbhSHxYzNrH+zvnOsVB6svC7JiArhiIqaX2DeUVaqrbr8GC6Hnf5waG378Pjo3cPs6FAOk06/MUIJpA+fvNjaP1L4LjQ/WGstzxKGMMPTShb2dB6CchuPGstSeGxWSnX/8taBUnE81X0vUiYVcRh0trR1fNHk9FAUZRy42jQAACAASURBVNl6UZQiZfGkdX3jm/tHB+vz93PiOFxhUdeMxuJ+f2pNRO6MlMaKeVkPhw50NhJR2GJfdrSQIYhoGZzYOTjeWX5dnpcYymNcjlBMFis0q3ZqYePkZGekvkzGY0dnVC8d6DwkRXnMk13VEUKeLP7+y4X1I6XycHOxKj+RIxBVDSzqbO83tt3GVxlOjtsMR68Hemvu5QhZZ5dL0thiaXbH2OSe2nQWDD5dR54orKihsyw5gsWg01hcSVJB/9PxQ+NpzH8vQiESN6r3RjofxLNPK8dgsiMSCuQTq4ZL7ZnejX5khKIoym03LY425cZKmTQ6nU5jcvgxxc2Tb9YsF780ky7L9vhjIY8tSy1YVp5/4Xh/LBTuMu/PPq4pErO9r4DJFcRV9g7O7hrQpak1KYryOCxLY835CeFMGo1OpzFCuFGFja9mVsynx6DPEqEoiiJw58nKZPf9JO9VsyFcfv6jJ20V2TCcHICP5Njuj+GzJdG5Y5tq7/WDuvUXD3PDedKUZ6sqz1WDOn8A3Lr5oiiBKOHhqtZCXPkSkXGqOpXP4pcPLBidOELO/bcz9VliNpNGo9FZIQn1g8NPqjJFPO5ZRx6FW3Wv2kvEvBAanR5XO+pthTXuLzwdrIsTcJk0Op1ODxFFVNT3vlOYz7pi7zQWikI2/dFYc5FEcHoPbVZsUcfgi7WxxpgwQWx247bGQiAKtxumuu+HCdk0Oj2mcuhEb0cImQ7fjQ3XJ4p4LO8MBDRWbO799pEFje+2YhQyHb4b63kQJeQyaHQ6g5lV29HxICdMwLlpLFQILZh2aVKD0OSHTR3z22rHabMrodlZelKdJuJ6N86QZdzrfbm8OXwvWhJa3jup9l7yhpBua6qvqSTCWwEaKzqztGVwTmV2kFfd4AXZjnsfpApFkZUj7/R2nELm7ZmXFWlS7ysUhac3PxuTlyWEXhpOnl7RWFmQEcoPodNpNElizaPWpT2dw9eEbVG8nhgoiA87/cvR2Al55S3jyzrLHbu2v9YVeYgkcIfNjCl8k9gpMbXJfaE9nsTdVq1SpTPbSYRI3G3WqVUqtcVJ+NbhsZtVKpXWcJ40SNxl0ihVaq3djfvmhZJIYzvmNVaDVqE4OVEo1QaL/7hwkvCuGTM7Cb9N23TKs8oplBq9+YaDDom7zRqlCtPar85YfiUJj0Wnubit0xdD4G6zXqM43aBKZ3FdcfseROJOi0qpVGv1br8VIES6HSZMqdJZ3b5HXA4Lpjzxrc+On3YcnBf2+9iQhMdytvUThVJr9t86IgmXUaVUabROv1sikYTLgClUOjPh/dbgLaPWOj0khZDbZcEUSv9PJiIJh1mvVCp1Fx/02A1nm1VqDepntTkCvqhm4sIlVwCAwOD2t80pbCaTJwmPiomJiYkJF7EZLHZ537zVeZdv298LyGPVqBSY3oJfHaAoiqLcFp1SodCaHN6TAELIYcS8B3uFUufAcYdZp1Iq9RYneX5XEDOmUpycnGB66+maESJJh151epJQYhq768IpwuO0aJRK9dlWKIqiCI9Rp1Eq1bbzIW/IadFjSqXWaDubdhXhDjOmOjtw6yxunEBumwZTYVqj66wQ7jRjmPLk5ESls3i8nbne+nhreXJycqLUme2e9y5/Qoj02LSY8uTkRKFQmOwuu9mAqZRas+Oq66QIu0GjOj9B+1EbnO6L08Qi5LEZzjau0BhtHpwkXRY1hunM9vOiCLmdVs3paUmhNVn9VuM2ajBMZ/Lrm0YOs06lVKiNdu97jhCyGtTejWAao9Pjthm1KkxttbtIhHwRqrRn7kipPa2MWu9wXYwVFELIY9arz07vSr3Z5r7yOrHb+dqTGnzwbn/ohv+druH6h84iVHhc16LJt7VbbOd2dftQPe5Q9FYbvN175b+6271vN9+a8eoHb/r73HhXSKdV/6RYKEmqXNHZzy+XNRy3FMbxheGDuz/Mb8kAfDGIcB8tPitIS4j1zlsfUzmnN7uvzxY/ELc4El8+xL1/5PvgTdSved4Ha3LT+eqWq/Uvc+0zb3jqxQI3bgRd6UOlb6r15Qp8qOyVT76qqC9CzWss+HXvz6XKfuzH4WtHqM/rPEJ1L5o+XBx8QbjTMt+dww2R5NcPHdq9j9jmn1RES4UxJfIT+9euHwDffwiRBHF+gfsPPT2Bb5lfhLrbvVruBCIU+DoQiWv35nNjuHQGJywyJiYmJjoqUsRnCzNqt5QWONYDAAC4NYhQnx5p0x8P15dn5pY827B8uDj4shAibMajZ1UZsbGxsbGx8fHJ5TWjGg/+0W2rAAAAvimOd8PtBWnJjaOrevuXu+D0hx2hvA3ZOI5fc4t08PUhksA9p3D8I4b1AQAA+GaRJIHjOHHnOwbfyQ89QgEAAAAAfAYQoQAAAAAAAgYRCgAAAAAgYBChAAAAAAACBhEKAAAAACBgEKEAAAAAAAIGEQoAAAAAIGAQoQAAAAAAAgYRCgAAAAAgYBChAAAAAAACBhEKAAAAACBgEKEAAAAAAAIGEQoAAAAAIGAQoQAAAAAAAgYRCgAAAAAgYBChAAAAAAACBhEKAAAAACBgEKEAAAAAAAIGEQoAAAAAIGAQoQAAAAAAAgYRCgAAAAAgYBChAAAAAAACBhEKAAAAACBgEKEAAAAAAAIGEQoAAAAAIGAQoQAAAAAAAgYRCgAAAAAgYBChAAAAAAACBhEKAAAAACBgEKEAAAAAAAIGEQoAAAAAIGAQoQAAAAAAAgYRCgAAAAAgYBChAAAAAAACBhEKAAAAACBgEKEAAAAAAAIGEQoAAAAAIGAQoQAAAAAAAgYRCgAAAAAgYBChAAAAAAACBhEKAAAAACBgEKEAAAAAAAIGEQoAAAAAIGAQoQAAAAAAAgYRCgAAAAAgYBChAAAAAAACBhEKAAAAACBgEKEAAAAAAAIGEQoAAAAAIGAQoQAAAAAAAgYRCgAAAAAgYBChAAAAAAACBhEKAAAAACBgEKEAAAAAAAIGEQoAAAAAIGAQoQAAAAAAAgYRCgAAAAAgYBChAAAAAAACBhEKAAAAACBgEKEAAAAAAAIGEQoAAAAAIGAQoQAAAAAAAgYRCgAAAAAgYBChAAAAAAACBhEKAAAAACBgEKEAAAAAAAIGEeqzQAhZLJa3b98ufGbLy8tarRYh9LVfMQAAAPBtgQj1WTgcjjdv3vQPDEzNzHzyZXpm5vXrN3Nz87NzcxOTk9PT0x6P52u/YgAAAODbAhHqs7Db7ZOTk1MzM8dK1V0X7FiFXf0rlUqpVhuMJoPRtH9wMDU15Xa7v/YrBgAAAL4tEKE+C7vdPjU1NTs/r9Yb7rJoteqTPbVGrdYbryygMRj1JpNGr9/e3Z2anoYIBQAAAHxhEKE+i4+NUGqFer5XvfVGbTDdUOwEw1Y3NqAVCgAAAPjyIEJ9Fh8XoYxq5ZH6WYl6rlttMN9QUqXRbm7vQIQCAAAAvjyIUJ/Fx7ZC7bxVt/LVC0/UxhsjlFa3tbsHEQoAAAD48iBCfRZ3j1AGo1p1pB4tUTeGqA/Xbu7IgwgFAAAAfC0QoT4Lu90+OTX1Zn4e0xsCWAwmTINh081YAw17047pDZjRjBlMmF5/ZXmVVrcJEQoAAAD4Gr7HEYokSc9XheP4dXNa3iVCGYyY6hibqMMqf4U9LcTUSsxgwk52sMM1TKu58ilKiFAAAADAV/J9jVBOp3N0dPTXX5VMJjObzVdW7y4R6mAF60/Dyv8b1hWJ7S1hW3PYdBM224ntr2C6q1uhIEIBAAAAX8v3NULZ7fbOzs5fflX/+I//qNfrr6verSOUEdPrsa03WJsYq/g77GkRtj6BPS/DuiKwN23Y4QamUV/3XIhQAAAAwNcCEeqrRyg9truItfCxwr/Gxiuww03sVQ3WEITNdmHYyXWjoAKNUAhRJEKfaUFwiz4AAADfHohQXztCYSfY83Is+5dYmwQ73sZWx7Ga/xd7VoSpMcxguvm5H4xQCFEON7Gntk+s65690zxbUl9enl63LKpHbrMsacZXtRsnVquTgCQFAADg2wER6mtHqJNdrDMcy/4lNtuFqVXYaAmW92fYmw7MaP7gc2+OUCRCmNHV+VqV1bsva1gNrVsJrVu+cpG8t9Qui69ZRLXvLi+hdcvJ7TtNE6oTveMz/9kBAACA7wqIUF87QimPsMEsrOCvsHdPMY0aGynE0n6KDaRhWg1mMN45QiGKMjs8nTMq6aMt5v3F4LL5oNL5oNK5oJK5oFK/pWQuqGTu3y4t/+pdiuf+tfjCz78tnvtt8ex7y78Wz9HKFkR16w+eHprtns//xwcAAAC+PohQXztCaTXY8ij28LfYaBmm0WCLg1j+X2LFf4PN92IGE6a/KUXdEKEIEm2rbPFt2/R7i/5p6TRCnf17OTxdnZ9KrkhOp0vR6b//VvpW0rD5fFkLI6MAAAB8CyBCfe0IpTdgmAKb68L6ErCtWUx5iA2kY+k/wxpZmPLw5oaoGyKUy0OOr2nZle/OG58u5qerw1Ox33Kh8ema8FTk90PJHPPBu7LBXYeb+Px/fwAAAOArgwj1lSOU2mBQ6w2Y6gR7249NPcKUR9jGFFb+X7Gaf8IU+74R5RqDUWM0qi8mqhsilMNN9M+r6PcW3u+8u779yb/N6fTn4uvbn4ou/VA8SytfyOratDjwz//3BwAAAL4yiFBfI0IZDGqDUaXTH2CaXQV2pNaq9AZMdYStv8IO17CDNawjFHtRqdbrvZnpSK1Z2jmaXttd3T9R+U2zeXOEks+paOULV7Q2FV9sbSo+feS3Vy5Fs7dcflM0SytbyOjcNNshQgEAAPjhgwj1FSLUsVozt7HfP7M8trCxvHd8rNFqjSat0ajVqXU6TIcd6Naea5T7Sp3hUKU5wrRHau3K/vHw7GpV/9Sb9T3McKsI1XdVhPLFpt8Uzf66cPbXhbO/LZr7bfHcr4vm/qVw9jdFs78tnvt14ey/FM7+S+Gbfyk4XX5TOPsbv//6Pf7mND8Vzv6mcDYYIhQAAIBvBkSoLx2hlDr99OpOWuNI/MOB1rG5qZWdha3Dd7tHSzuHb7cOXq/vvlraGHm91Df1rvPV4uDs6tqBwvusjSNlhXyyaXRWpTttnbp7hCqZY957y6tYDHmw8K/F878tnqOXv+VULNDK3v62eI557y23YpH7/7P33mFN5Gv//3Wu5/t7TnvOc855Tj87uCTquuuqKFiO7rqru0qxbbFhAexdbJQkdJDem4jSOyooXUCKgoJAAgkpJKEkEDLpENLLTH5/jGAEdNFFdxfzvt5/hGFmMplMktfc9/25P8mdp693nr7eeeo64VBcx+GEDuRPYx9JwCPwZEIok0wyySST3jeZEOpdIxQoEvcMcitau3MetOfXdxQ24gsa8AX1HQX1HQUN+FuNhKKmrrLW7poO2mNyL4XFGRIIkVqo3mFeQklT7oMOrkjMl7x2FMo4c3c8qTOrkd3ZP9JAFrplkR1iOxKr+tqYkpjy3sMJhNtPOETWKIk1SmKNElmjj6hCnwJqVCmDNL4QcRtTElXKHI9RmRDKJJNMMsmk90smhHrXCIWElAZ5wh42t5FIf0hi0Ae59CEufYjLGAJ7OWA/lz8A8ge4/EGe8FnJuXhkgCu410yMLmp8ShuYYS1UaQd4KLHT8VlLghd88npndRdfrYNEMs3NWpZDbEfhY45Uoc1qHDySSHhCF6u0EIsvayaDjylgVQfHI48ceIfSQBzu7BMpNfpRhaa1h3+/gxN4m2of9SwhuN+EUCaZZJJJJr1PMiHUT4BQiMkDnPh7jyLu1Je3kBo6e5q7mY/JzEckRnU79dZDQkpVS/aDdvIABxRLGENg2ZPurNq2J+Q+jkD0Wgg1lZ8OxnacTO6sIfL1EKzSQg1k0bFrnYWPOXKVLrNx8HAioYUuVmmgJoogoJB89RbZr5DimkW6kNZ1MZUQX8GQKbUckdK/kHLyWsfh+I4Jftof3e6U0BloQiiTTDLJJJPeD73XCLVs2bJly5b9VAg1AApq8NTU+y2JJU3RxQ+jihqjihqjixpj7j5MLG1Ku99S+oRIY3OHhaKu3sEWSh+VNcwVvjDrMFcoovf2vQKhnBI6px1nhyCURgcJRtW9oNyngJbXNCRX6bIfDp692UXoH1Fpocc0UWBRT1BRz9U7NM98insO+UoGKbaid0ypYwkULpnkvRFt+6KQwnMTQv1CBMOQXg9ptZBGo1OptHK5VibTSKWTrB0b08rlOoVCr1JBWi2k08EQ9FMfukkmmfQaQuZ/1+v1Op1Oo9FoNBr1uDQajVar1el0er3e1An5R+r9RahVq1bZ2dlt2LDhjSnqRyIUKJaweQICk93eM9DVy8YzWHgGi8Bgk/oGKaxhJgcc5Am4QjEoErP5wiGBiCeW8Ke21vwRCCVT69oY4l5QXtw6nN80JFfpi1qGPfMoJNaoHoKFUg1lUEoelD7uEYXdY+ByKV751NQ6lkylZwkUrpnkfVHtTnH4Q/F4p7iOAzEd+6LbHU0I9XOSXqtVicVjLJaIRBp+1DRQUcUovE1JSe+KSyRERLUFBbf6+j/x9H7sjmtywza5P3OzO/Yx1rPFy7fN/2pHSFhndAzpWjItK6f37r3B2ge8tjYJnS7ncrUymenL1ySTfm7S6/UqlWpsbEwoFHK53KGhITabzWazB43EZrNZLBabzR4aGgJBUCwWy+VyjUZj+kS/gd5fhNqwYUNcXNzt27e3bdv2ZhT1YxAK6ahJH+SmVbVk1bY1dNJbKH1tPf1Paf0PifTSx8Tipi4Cgz0p7PSCRWKuUEjvezlCtYNO8YSDMdP0djpxnVBD5I8qdBV4sJ0pZoLyKjxPptKVtYN+hTQSaxSCYKlcOyiQsfmyrn5x+DhCZdSz5Wr9oFDhnU89d5N4JaPbJbP7Skb3+VTikUSCU0Ln1aIeE0L9BIJhGIL0arVSIBASu/vLyklJ11u8fetPnancs++e3bbbX2wsWPNZnuXqXAurnCXLsz9dlv3J0qyPl2QtWpz50RQv+jRr0afZnyzJ/mRZ9qcWOUtW5C5fmb/qP7fWrS/+yrrsm++rHQ49vOTSERpGy8rhNDZJ+/o1Y2OwTmf6CjbJpHcvJNqkVCpFIhGbzabT6Uwmk8Fg0Gg0MplMIpGI04lEIlEoFBqNxmAw6HR6X1/f8PDw6OioVqs1fZBnrrmGUMuWLbOwsJi00MJixaRlFhYWGzduzM/P7+vrO3fu3NKlSyeWz2TzN0YovmQEFIsHuHzmEJcFCnqHeYUN+KD8Wr/sat+sKt+s+z6ZVd4ZlT6ZVZG36++3UQb5ExXlEr5EAoqNiWqGCPViA8zodsfYjktpxIdk4ZhSV4EHy9uHpQptHyiXqXTlHTwEodRaqJ0hjivtiS/ribrX45NP8cileOU9Q6hhiSqyhOmeTcblUhBjc8mumd3Oad0hd+mjJoR6h4L1egUX5LW10bJzn3j5VDsevme7tWDNupwlyzMXfJJuviDVDJUKmKd88GHKBx+m/HveM3/wYeoPeXwTo62QDQHztHnodPRHWYuW5C1feXv9xvLvdjecOU+IjBmoqByhMzRjY6avYJNMetuCYVin0ykUCpFIxOFwmEwmjUbr7u7u7OwkjAs/ro4XhSycWK2zs5NIJFIolJ6env7+fh6PJ5VK1Wo1ZMrg/5DmDkIh8LRmzZqlS5c+R6Jly5dbLLdaZWFhscJi2YqJNZcsWbJ58+bCwsLBwcFLly4tXbrUwsJi2bJlK1eufGFzi+WWlsv/88USq1UWE5u/MUKBIgl9kFvdQanuoHT1Dg6AAlAkZnLAtp7++s6eyqfk0hZS2RPS/XZKE4lBYLB6OTy+WCIcGRWNjg4LRaT+IfLAEF8s4YnEPLH4GUK9IpE3BaEcYzucU4i+hdTgInpLj1im0lXhwZvVfRK5Rq2FFGr9BEIpNVAdSeCaQXLLJLlndWOzyQhCpdez5Wo9V6KKKe/F5lAmEAqxZ35P4v0+qWmCl3cjGFYKhT05eXUnTt212Vqwam3Wok/TP5yfCphPRiXAfDb9Io2lfvBhqhkqA/1RztLltz/fUL5zT4u3H/dJ66yXT5mwzCSTJqTX60dHRzkczsDAAI1GI5FICDlNC0wz0QRRdXV1dXd3MxgMFovF4/GUSqXpo/cKzRGEsrCw+OKLLzw9PW/fvu3p6fnFF18gwaTV65buOGZ+JPhvO46br/rPMiSY9Nlnnzk7O9+9e5dGo3E4nEuXLi1ZsmTdunWXLl3Kzs7GYDDI5iuWL1/92VLrPQvtHOZb71m4Zv1Sy5UWn329ZIXlGyIUmycsbMS73ixNLnv8hNxLH+IO8oVckRgUi7lC8bBAxBGIhgQijkA0LBRxBCI2T8AcAom97CYSo6qNXN1Bow9yhwUi8E0R6nRyZ0kblzIkvdvKfdIjlql0lR1g8J0eMnsE2WQcoaQaHUQZHMt/NJTfNJTdOBh+j4HNIXsaIVR0eS9mCkL5FNJTHrBkKhNCvX3BsHyY+xjjkbt8ZQb6o1Qz1PMA0uwC08ygauKp0z6cn7Xo0+JNNv2l5bNLUWMyGZlG1+tNt8UmvdfS6/UymYzD4fT29pLJ5K6urldjU/vL9TKWQnCKSCTSaLSBgQGhUKhWq00gNa3mAkKtWLHim2++uXXrVl9fH4fDYTAYGRkZmzdtXrN+sYPvP9yLfuNd/V9ut3/j4POPtV8u2fy1dUpKCpPJBEFQoVBwudzLly/b2dnl5OQwGIzh4eHe3t6cnBw7O7uVa5bY7l+4aedHX327yO7gAtsDCz7btHjVumXLV7whQnEEoqZu5o3KJ9dKm1IqWzKqn+bUtRc24O88IhQ1dd5t7rrXTCxu6ipq6rzzqPNOE6Goqetuc1dpC6mqnVJH6Gnsojd20bv7hxB+elYLNTOEOhDTfjC23S2L3MoQi8bUtV38R1SheExd1sb1zKXcfjwoV2lHZJqSNq5vIY3QP6JU6yQy9bBYMSxW9IKy7IeD7tlkjzxq6gO2eEzNEsgRhMLmPjcul+J9i55ax5KbEOrtC9brh+sbchdb3PiX2U+DTS93yr/n3fjnB3UHHHVjY7P4kvtZg37hsTyhaBb3aZJJvyBBEKRQKHg8Xm9vL4VC6ezsnEpOE2yEx+M7OztJJBKZTKZSqTQajT4uGo1GpVK7u7uJROLETqYlKgKBQCKRaDQam82WSCSmkvOp+sUjlIWFhZWV1cmTJwcHB/F4fEhIyNOnT4ldRHv7fZ/bfuRS8Dv/xl/51f/Kr/5Xl3N/9/W3H+/eaU8kEslkcnh4OB6P53A4Li4uR48eHRoa7GWRcsqCOklPHzyo37pt2+rPF291mr/FYcHuS2Y7z3+47RB64zeLlhml896gFmqIL2IMgd39Q3gG6xGRWdlKLntCKmshlbWSKlq7K1vJ5S3dZS3dpU9I954Qi5q6ChoI2Q/as2qfFjTiq9oo7T39AyD/OUIJfgChHOMIByb6XsbjcbnklNre280D1yqZyfeZt5sG4soYuBxKcBHtdtPA7aaB2DKGVx41tba3+AmraNyFTQORpXRMLgWXRwkp7ilsGshp7Pe/TTPmJ8Tet3pS6wZMCPUOBOv04tLyqnnz0wHzFMA85afGpmfwNO6CfwLd1lugkZFZfMll1fU7j54rq6mHTF/iJr1/0mq1AoGAxWIh8EQgEKYlJyR01N/fj4y24/P5QqFQJBKJxWKJRCKRSMRisVgsFolEAoGAx+MNDw+z2Wwmk0kmkzs7O6ey1EREisFgsNlsqVSq1+t/6pPxM9IcQaizZ8/yeLySkpItW7YUFhZSKdSDBxy+2PIRpvg3/g2/8q37lV/9r1xv/WbzrkX2uw/29PS0tLScPHmyvr6ew+G4ubmdOnVKLBZ1UZ5c8P3mjPMxR8dDq1at+s8Xn25xnL/tCNreDdh9cd43x1Fffbdo6RLL10CoDjxPJH7BSCWTSMwViga4fGLvYHN3bx2Bdr+dUtHaXfqEdLe5q7i5q7ip624zseQJsfIpub6z5ymtv7t/sI8DDvGFoEjME4l4IhFPKOIKhPTe3pchVFk7ePRa5/EkwsnrhCMJ+ONJnbg8ik8BxbeA4p1H8c6j+OZTvHIpHrkUz1yKTz7FJ5/imUfB5VK88ik+BRTvCedTPPKeh5q88ile+RRc3mR+MiHUO5VOLy8tp3+4sBlAFQOoDCN8+QnJKQ0wzwPMH5ihaP82F9lshSWS2Xq5arXa1S9468Fjl70D5QqlwVQaZdJ7IxiGVSrV8PBwT08PkUicNvJEIBCoVCqLxeLz+WKxeHR0VCqVjo2NjY2NyWSysSmSyWTIcqlUKpVKR0ZGRCIRl8vt7e0lkUjTJvgIBEJ3d3dfX59YLNbpTF/yz/SLR6jly5dbWVmdPn2aTCZHRUWtW7cuMDCw6VHTgQMH13718dnrf/J98F9+jb/yrvmvM9f++IXNp9/u2Nnc3Mzn8wkEAofD6ejoOHTokL29PR6PB3nD1XVl7u6u69Z9tmyZxerPlm4/htpxAmW9Z+FWJ/Q3J1DrbT9ZtvRHRaEmTZY3LBAN8gQDIL93mMcYAulDXPrgMzOHwN5h3gDIH+QLh4UinkjMHw8+TfjVUaiaLr5rNsU9h+yeQ3bN6nbJ7MblUjzyKLhcigdSvZRD8ch9ZmzOM0LCITyUQ8HmUDCIX+SkqUvGTfa61ZNiQqh3I51eUVrO/nBhH4AmA+hWAFUHoEoB1C3APAcwzwTM016Em5Qfx1gv2086YJ4FmOcB5kWAeTWAajVDU83QnHnzhR+gRm23QbOEUHo9VF3/6Psjp2ztD33jdLKLTFWqVD29/abhQibNeUEQNDIywmKxqFTqpMwdEi4ikUhMJnN4eFgkEo2Ojk7gkVwuVygUSqVSpVKpVCq1kZAlSqVSoVAoFAq5XD5BVCMjI3w+n81m02i0rq6uqWVSRCKRTqdzERMZxAAAIABJREFUuVxTmTmiuYBQlpaWW7ZsuXDhgq2t7YoVK6ytrY8fP75p02bLlcs27Vx40Ocf51P+96D3P77+7iOrlRZr/7P2xIkTOTk5eDw+Jyfn+PHj69atW7t27dGjR5OTbzyofRDgH7Bu3ToLCwtLK4vPNy+23rNwi8N82/0L1tsstlq1bLlRd4OZIZT4uUViHqeX97SQR2vmSUYmWhUgcwa/0PtgfDnSPspoDyJjvyIKpdLqG8hCzwKaRx4FZ+zcaTwdD72GMblkxCaEenfS6RWl5awPF7IANAtA9wNoBoCmAmgigOoAUI8BVD2Aug+gSgHUHQBVMM5V6S/noVc4DTBPA8wzxmnpFoC6C6AqAFQtgHoEoFoBFAFAkQHUgBkanLdAOG+BeN4C0QeokdlDKHpf/0XPALt9h232Om05cDTrVnE3je4THkvuoc/K/k0y6ecpCIJEIhESGTLO3CFpOyKRiDQgkEgkUqkUwSalUon0H0eaj+v1egiCIAiCjYQsQf6r0+mQ9uUqlQrBKSQ0hQSl6HQ6gUAwTu0hJVZkMnlwcFChUJgoai4gFBKIWr169YoVK5Dq8lWrVllZWS1fvtzS0mLN+iVf2H28Zv2SFZbP8GflypWbNm3at2+ftbX1ypUrJxZu3Ljx+++//+qrrywtn2XrVlharFq7dN1XS1Z/tnRi8zdHKLGIR2/hpe7h3Q/nSSQIRfEkEt4zhJro+TSxvuR5+k8iGf/TGKEEL0coqJEi9Crs+SF4omLzaNg8GjaPis2l/hh+MiHUO9WLCDXhAQDdD6D7ADQTQNMBNA1AkwE0EUDhAVQrgHoMoB4CqHoAVQugqgFUFYCqAFDlU1wBoCoB1H0AVQOgHgCoRgDVBKBaAFQbgOoEUN0AmgKgewA0A0D3Auh+AD0AoDlm84XzFogmPHsIJZMrIq+n7nA8YbPXyWavk93+oz5hMbE3M747fNonLEYyKv3xT/E2BMOwHoJ0Op1OrzdFy0x6A+l0Oj6fz2AwkDF3k6JBPT09IAhOhJ0UCoVardZqtca0ZDDABhgywHoDrDPAOoMBNhgMBhiC9VoY0hkgvQGGDUZcpdfrNRqNUqlE4lJjY2NisZjNZk9N7eHxeDKZzGKx5HL5e05RcwShkKKo5dPJwmK5hcUK4+gR0gJq6iYW45q8i8kNoWaMUJNroYQ8ahMvfhOvxIsnEvGGB3hMPK+nhTfQzePzeAI+j93D4ww846ThAR67h8cHecMsHpPA63nC6+vkgRwej8Pjc3lCpBZqxgj1AjlRcXk0XB4Nl0PCZrRgb1Rir9/DptRiM9uxOWRsXg82j/YSnEJ4qwebR8XmkJE/MXlUzDhImRDq3eklCGVsNoBmG6HVBF31AmgmgGYAaDqApgPonulMB9AMAM0A0EwA3Qug+8ZRadqdc8zmC4z5afYQSqFU5RWX7T52ztb+EIJQtvaH7U9esD/hbGt/aOfRs3erarRa7ayc0VmUSq2mMXrLa+tz7twruFf28EnrEJerNZWPmDRjIcXjk/gJiQZ1d3ez2WyxWDw2NjYRdtLpdAg8GQwGAwzBWikkZ+kleB33vmYgR0NP0LLyYbXAAEPaIZK8Pklel6RsLdTQGnQcMjQKwlq1AYYNz6Y5gLRarUqlQkBKKpUiJIcUm0+lqPe8wHzuINS71+sjlIhHbeYlbObd8+INkHllfryc47xMJ176fl5dIo/Rzity5ZX583hc3jCLVxXKu3OFR27klXjxso7w0g/wbu7iVYXyejv5w6xnCMUX0JmvRKiCnuf8lEfD5dFxeT247C5cygNsXDo2JADrcxaL3Yd1343FOWD9LmHDwrAJ+di0R9jcbmweHZtHx+ZRsbkUbF4PNo+BzaVhM55ir5dio65hQ0MwkfGYa0WY9CeYXDImj47J7/G6RTch1DvSDBBqWqL6MZ66zwEAPWQ2nz+Jn2YJobQ6XXHFfcfzrrb2h6z3OCIIZbPXyW7fYYSo7PYdOe3uTe/t/1ndBY+MjuUVl1709N9/+uL3h0/tOnrmkLMrLiii8XGrWj35c2qSSVOl1+sFAgGdTp/ET3g8nsFg8Hi80dFRJPKk1WqNpwqGIbV+lKxlF6q6/ZStxxTNOxWNtor6Dcra1ZqO47C81wDr1ISSkbCvxT5WooB14rDN4ridIxlnZPej1d010ChogPSGcZDS6XRqtVqhULwsHIW0PBgYGJC9xzNmmhDqJ0IoTj+vo4SHL+W1FvBS7XlxX/HainmZTryYDTwmntfbybu+nZeyh8fs4D0t5HXc5T0t5GU48KK+4JEf8gRCnlAEzhShaLi8HlwuFZdNwN28j4tOwgW44bD7sVfssBc2YM+vw55fgz23Bnv+P1jnz7AXN2JdtmE9DmODvLBx6diUemw2EZvTjU1rxibewoaGYr1OYV2/w17chL3wBebiRozrDoznMUyQLyYuE5Na75VPTqljy1Xv7x3Ju9PrI9RbMs9s/mR+miWE6qb1nHLzstt32GaP43ank7b7Dk9Q1IS3OxyPuZGu+9ncBMuVyvSCO7uPnbXZ6/SN44lDzq77T1+0tT9kZ3/opKtnB7Fbb0rqmfRKQRAkFAqR+NMkXkFGwyHBJ7Va/RyeYBjWK/USgronWvF4n/zBl4pqS3X1Um3NYl3tJ/oHn0A1C6H2/QYZ3QDptB13ZP6rxlw/lLqaj7qaS9zQYvePhJ7LhIFfjqafUj69pR/lGvRaJOuHzCGjVCqRcBQIghQKxTiriMfjkaiYSqV6PynKhFBvF6FAkdjIIpDaBCZsAku8QJEIHB4AGR1gRwmYdQQMXga2FoIVV8HAT8CHKSChHAyzAu9iQT4IDg+AzA6wsxIsOA8GLwO7qkGRBBSKuELRMF/Q81KE0jeS+V45HbibNbj4HFxYKM7vAg67D3fZGnfhM+z51dizq7BnV2HPrTbyKuzZldhzK7HnVmMvrMdescPiDmL9rmCv4rAeR7Au27EXvsSeW4M9Y4U9Y4k5Y4k5swJz1hJzbhXG+XPMZVsM9oBXkGtKfq5coXj77/97r58BQrEBNHdSCdTsIZRKpY65kb7t4DGbvU5bHY47ungiCDUJpGztD9ufdCZRe2bx1L6xYBh+iu86cObS5t2Ol72vllTVdpKprR2dqbmFB05dtN7t4BUSJRCJ389fGpNmIgiCJBIJk8mcFH/q7Ozs7++XSCRI5g6peUI2gbVjOmGLmhqqaN6lrF2trl6sq/lYX/sxVPcJXLfYUL/YUL/Y8OAjQ8cBg4xhgHRafJHi6mq5O0rujpK5o+TuqDE3c6nrhyNXPhS7LRQFrBtNPa5oztLx+2C91jA+hzESjpLJZHw+n0qlGlMUgUBAqsvfT4oyIdRbRKinL0UoT5DVA1aFgjnHwVsXwQQbMHgp2HEP7LgHhlmC2UfA+6Fg8FKwtQBk08CqEDD7KHjnMnh9Oxi0BOysBEUS7g8ilFrd+KTJK+AyzsMB5/YN7vIm3IXPcedX486twp6bRE7j/PTcK7FnV2LPrsSeW4U9vw7r/Dn23GrsWSvsGUvsWSvs2ZWYs1ZGtsScscSctcScs/K6vD4l8ZJcNpsNFU2aXj8DhBqeNv40SwjF7GcdPHPZZu8h6z2O+5zdTvgEW+9xtNt3ePfpS0hSz3bf4a0Hj9nscdpy4GjM9dSfQ6MajUYbl5Kxebej47krrR2EMZlcD0FarU4kltwprdrucGz7wWN1TU9MgSiTXiaZTNbX12fc/Km9vb2rqwtpDj4l+KTXj5JV1HBF827VgzXamsX62o/huk+eYdMzf2Ko+9jwYL6hw94g6zFAOm3HbYW/ldx1ntzNHAGpCZwaczWXunw44r5QHLBuJO2Esr0IkksmaqS0Wq1SqRwbG0OSjJMoikKhcDicqb9Ec14mhHr3CLUZvIsBW/LBa1vAxmSQ+gi84wqGWICEcrCPCN7cBYYuB298B8ZvBhlPwYcpYMQasDoSpDWBZb5g8FKQUMEVjfwwQqnkjQ9yPC99gXP+D+78asTTkdMkeFqFmeCns1YveuUUeDKiqLOWmLOWnhdW34w9KR+b/pyYNJv6qRFqaGoJ+awi1K2Siq0HjiKhplP+YSd8QzbvdtjhdPK4TyBSGvX98fP7L2Gtdzva7jt89BJGIPrpr7oxueKSV8DG7/aHJiQj/T8nxOXxj13GfPX9/uuZuT8H2jPpZyidTjc0NNTd3T2JTths9ujoqFwu12g0z0d3Qlodv0H59Jiido2m5lPogVHM6Rk5LTLULTLUfWxoWG54tNrQ7WxQ9Btgva67Shltq/BeIseg5a5mctd5cvcXWcrNXOpqLnZfKAr4bKwsWCfonyiQ0uv1SFJPLBb39PRMOk46nT4yMvK+jT81IdS7R6hNYLEbWBcPRv4HfJwJUurBzENg4GKQUA6CHLDiKoj7OxjwMVjiBXL6wTJ/0AcF1iWAlEYw/wx4dTGXUD4ThFKr5W1N2bEBX0b7rY/yXR/luz7Sd32kz+fT+TNjh3l/fdVz31XPA8FeNhE+6yJ8PjPyugjvSV4b4b023HttuPfaCJ+1MQHrb2WcV8hnrSe1SS/VT4pQbADNewU//WiEgiDIOyzabv8Rmz2OWw8euxx7/aRfyObdDnvPXbkQmbDlwFGbvY7HvANPB4QjjLX35AVyD2N2T/AbaHRs7MQV3Jff2Kfl3ZpUniWXKy54+H/5rX1E4g3T0DyTpgqCID6fT6PRJvo/IePvent7R0ZG5HK5VqsdT5PBsFqgHchVNu9W1yx7MfL0iaFukaH+E0PTWkP7TkP3RUNvpIGTZ+DfN0iJBr3CYIDhMb6e8UiHL9I2JGnuYFTJ9srgz+W4hZPiUmNu5iNX5om9lkvzXbR9bbBWjRynXq9HBuvxeDwKhWJcrYX0qXrfmkWZEOodIpRQBFIegrEbwXteYFc1eH0HeH0bmHsczD4MXt8OEmtBkRjsqgJjN4JJO0ByAygQgO13wQRbMMEGzD0FFpzn3vieS3rAnUEiT6ORE9vzMuM3p8d+nRaD+KvU6KneOOG0mA0pUZtjQ49GhHpFhnlHBp+6EWmbGvVlStTGcW+Y4i9Tor68Gfnlzcgvb0Z9mRG3qfLOZaXChFBvXz8dQrEBNPiyEqhZQiiFUnXCBWe777D1bodvj551v5Z2Njjaeo/jCb8Ql7gbWw4c/f6Es0v8DefwOKQ0aufRs49a22b3BL+BpGNjR85fWWv7TVpugX4KQp3HeK21/TY09ppWa0Iok14QDMMjIyO9vb3GJeTt7e10Ol0kEr3ITwZIyVVTQ5UNm7U1S6AHRmk7JOzUYm2g4QzDtwySVoO816ARGHQyA6Q2wPrxvlCwQa+FNQpYIYHFbGiwU0eq1FSFKhO+k+MWGQelZO4oqeuHEtxiScJuFbEKVsufHQAEqdXqsbExDodDJBIntTkYGhp6r9J5JoR6ZwglAQV8sLUQjPwP+PAmyOOC5AawtRDsqgJ7WkHyQ5DTD4okIMgGyQ0gtQnkDYNCETjMBrsbwdZbYFc1l4nnUpu4nH6En16NUFqNvLsjP+eaTWb8psz4TRlxX0/xV5OcFmubGOEUEYKNjgiMjQoOD8HGhR9NibHNiN2YPp3TYjZMcnbi5qpiE0K9E/10CDX8g/z0pgilVKnlSqVcqRzm8fefuWi77/Dm3Q7fHT/vnpR2KTpp3wU3l7hkl7jk746dO301HJuc4RwWa2N/yGav03eHT5fV1MkVCmRzuVL5w082q4JheEyh7Gb2ncR4bzl4LD4jlz7ImTBjaJjI7LvoE7jF4XhAXNIgj69+SS8rGIa1Op1CqVQolT/DflcmvSVpNJrBwcFJKTwKhSIQCGQymTE/wVqpmhauqv9cV7vYKHP3iaHuI8OjVQbyZYOg2qAYMOhkBvjZqLpXCjZAeoNWCUtBiE3QVkcpwjfK3VHGqb0xN3OJK0oSvUNNbYC1KmQzCIJUKpVUKh0YGDBum97Z2Umj0cRi8fvTKcqEUO8MocQgswPMPgZmHgL7u0DJKCgSgwIBKBSBIjEoFIMi0XMLJywGhSJQIOAKhVyReAKeZoZQedmJ1tPBE8JPGxGnxWy+GbMtKdI+NuxUeLB7WLB3bHRwfGxoeIh3WDAmOuxMYsT+G1HbU2M2p8VsSI9FvDEtZmNq9GSEykrYXFVkQqh3Ip1eXlLOmrfgHfPTNF00X4ZQNltfC6FgGI68nnbFP+SKf4iz99VtB4/a7jtsvcdxu9NJl/gb7klpl6KvYa+nuyamnA2OdruWiruZddw70Hqvk81ep20Hjx+5hEG2Rfwu641gGO4d5hbUPbxWXI5JuOEcFuednBlVWBw57qjC4oj8O27xyc7hcbik1MTisuo2/IhMDk/ZzwB7MOdWcXBMfFB0fFbh7b4B1vvzU/TeCoZhiUSCTKViXELO4XDGxsY0Gs3z+JOKr+6JVdav1xlXPtV9bGhcbug8bODkGuRMA6SaATlNexwQPCbQke+rb7koAtdMqo6SuKJHkvZraI8mKAqpixoZGWEwGMbkh3SKen9m0DMh1LtCKKEYZPeAzZkguREUCkCR5MUyqZchlAgUiqbC04wQCp+flbg5PfarKd6IBJZSYuySIvfEhR+LCnGOCHEJC8KFBnmGBXvHx4YlJkRGhPqGBnmGBuHCg10jg51jQ48lhu+9EWWXFrMhPeaL1OgNk5wWsyErYVNV0WWVwjQi7+1Lr1dUP2CjFg3868N3A08DAHoQQE/TRXM6C/9hNrpzLzw2NvMXBMPwMRfPjbsdEW/e62S3/4jNXidb+0NngiKxyRmY6+mY6+nuSWnuSWnY5AzXxJSdJ52t9zja2h+y23fkq/ENEb/LEI5Mqcq6Xxd7+15CUZl/Rh42+flxuj9/kIa5no5JTkdehV96bk0bQfNiRo8vFF6NjNl15PTWfYe27Du089BJjF8Qs880m/Icl06nY7FYJBLJeBQeUgKlUqmMmhdI1YwEVcMGXe0nz4uf6j4yNFoZevwMI20G7ajB8KMvFa0KEvTqWrKU0bZyd/OJ6iiZm/mI+8KRhD0a5hNYp5k4coVCwefzu7u7jdN5VCr1/QlEmRDqXSEUEnMCOaBQ8ByqpvKTcAo/vdyvQCidVsWkVuUlb82Im8xPaTFf34jakRDhGB16LiLYNSwYGxrkERrkiTg8xDshLuJaYnRkuF9IoMe4caGBmLAgl6iQc3Hhjtcjv0mJ+jo1+ssXEerL3CSbxko/rfZdp1HeR8GwljUoOHdxcMFi9geod4BQSAnUD8KTeN4C8YcLR9Z9ocovNLzOdygMwyfdfWz2H0Vsve+IzfikLnvPubgm3JygKOTBIYyvLdIdat/hzXuckK027zvy7hFqkCcMzb1zo6QqMKvA40YmcpCY6+mY6xkIPxkteWbXa6lxd0pHxmTG9+ll1bXbDxzZtNvBeo+j9R7HzbsdbPY45t4pVqlU7+y1mPTuhYxuMw5BkUgkgUCgVCqf0zMMablVqkd2utpPjfjpY0Pz54b+BIO8zwDNXvkRDMGKER2xTJnwrRwz/3lplJu5xBUlzTyr4zEnxuhptVqZTNbf32+cziMSiSwWS61Wz9oh/YxlQqh3iFAiMSiWPGcmJIX3pvz0aoSCIJ0AJFcUnsxO2JQeuzE99qu0mM03o7dfi9gXG3YsMuRiWDAmNMgzNMhrAp7GEcrnWmJ00rWYqIirwVdxRhQ1zlJB7hHBF2NCjyeE2ydHbk+J2pQavSE1+ouMuA3FmbsZlEoYNt00vwvBGs1oUzNxx86OD8ypAKpvHHReNhnLj+Snabtoio0snLeAO29Br9l84ifLBgMCtVzw9V4ODOfcK08pLL5ZUHSzoOhGwR2fyLjtB49t2uVgt//I/kvYs8HRl2OSrsRedw6Pc3L32eZwfPNuB5u9Ts6e/sl5t24WFKUUFoddT/tqz7tGKMbQcEBGfljeHawRJLknpZ0Njj7o4nkE538lLhk7BaFC824LRkaf17jAcOS1G1/vPGBt1Dh0066DgdHxI6PS9yMl8j5Kq9X29/cbh6DweDybzZbJZDqd7nkKT0pXtR3TPVhqxE+LDI83GNgpBtWwAX4L8R61XN/TqEp1lHssep7Rc/1wxGuZoiEZUkgm2per1WqhUEgmkye1iXpPGhyYEOptIdSjpqaq6moCkfQSEwlE4ouPiYSuyca/0h2dXc1Pnjx8+HCaERAwrFKOkgkFxRl7MxO2X4/aFxd+PCrUOSLYNSwYNy08IY4I9b2eFJd8PS42KijkKi400GNahwViw4NcIkOeJfhSY7fdSt3Z8ThJIRe+9ffeJKR+eXCo2R17y8KqADAvAcxrANQTANUFoGgAehJOvXqeu5kYKSE3BiaJETb1z5tPNpvfYja/xgx9D0AVoBaU2Gxh3LoDv2Ykn84apPazqP0DiFuIpPi0bPuTF776/oD1XqdvjpzZfebS7tOXvjt+znb/kY3f79964Kh3ROyDxy3U/gFq3wC1n/WwDf/VHqd3jVCDwz6pObgbGcaQ5BJ/c++5K3b7j2xzPHHqajgmOWMSQoXlvoBQBoMh6nrqpl0HbV5EqODYa6PSMRNBzUnBMCwWi+l0uvEMvkgWTK1WP8drzYiaHKCtW/lC/u6hpaE/4W3xEyKtWs94pEzaLcfMl7uNV5e7fjgaYaPpeQTrnrc5UCgUbDbb+FWQSKT3JBBlQqi3glAajYZOp9fX1zc/fjyNmx83N79k4eu4qbm5ubmZQqFMWzwLQ5BsjEcjVRQXRiTG+sZE+ERH+EVH+L/acdFB6anJGWnJ1xOjosJ8o8P9Xmnf6DDvuEjPvMzgzrYi6QjHFIJ6N4L1es6D+pxPLVI++DAVME8DzDMA8xzAvBAwvwegqgBUA4B6AqA6ABQJQNEANANA9wLofgA9MG62UYRpKmYZ89YggObNW8CbtwCct2Bo3oIBs/l0s/kks/ltZvMfmaHvm6HvmqEKAVQ2gMoAzNMA81TA/OYH82r3H9S+Ti2UwWAY4gv6OMMT7h3ikBjMsroG38g4h7NXtjscs9t/ZMv+I1sPHt17/Pxl36D0W8VtJDJzcGhik7Zuyk+CUN4p2e5JL8aZ4m/uPn3Jeo+D3f4jM0So6oambxyOT0yojDy4VVJhmpx4rkqv1w8ODpLJ5KkhqBdSeMPlqoaNRv0LPjE0fGqg+xmUA2+RnxBplbrOe8rQL5+P0XMzH3Exl2af14sHDeNXr1arHRkZoVKpEwjV1dVFJpOlUumcLyo3IdRbQSgYhlUqlfjtSyKRvKKVGQxDKpVseJjd3d1FwD8l4Ft/0J2ENgqZRCWTSEQCoaPlB9bvaCV0tBK7OtisXoVcauKndyZYpxeWlFXMm58JmKcC5injTgXMUwHzDMA8CzDPAczzAfM7gPldAFUGoCoBVDWAqgNQ9QCqEUA1AahmAPUYQD2Z4scA6jGAagJQDwFUI4BqNEM1mqHrzNDVZugKM1QJgLoDoAoAVA6AyhpnphQjpwPmBf8y67Te8rpNDYaFwv5hrrEHuGDf8DCBSnvQ3JJ+q3jXifMRyWl5JRXldY2tXSQ6iz0A8ozX7yBTfyYIhbmeftI3xG7f4V2nLl6OTZpaCzUVoYQiSWRSyq6jZ+32Hba1P/T94VP+EXED7KH3IRvyfkqlUvX390/0gkKqoIRC4Yuj8HhqwgXdg6WGiRBUw2ID6bRhjGyA38WwU1gp1T66qbi6+nlRlMs8iccS1dNbsEr27CAhSKlUslisiUAU0iOKx+PN+V78v1SE0mq1dDo94yfVvXv33rjSE4IgnU6nVmtVSo1KqVGrtTqd/i0BO1L0p1arZma15pnUM9zkhWkHTHongnV6WWk59cMFjwFUGYDKBczTXuQYY6hKA8zTAPN0wDwDMM8EzLMA82zAPAcwzwHMc1/uHMA8GzDPBsyzAPMswDwDME8f39UkZro5/iADML8DoBrN0JR/fyiw2Qq/JkLR+geo/QOU3v4X3DdA6xvoYbEbWtr3nLp4t6aO3NtHZvYhyTtK3/M1qf0D9a3tr4FQMAxLpfrePj2dCfF4Bv0bXsPTIhQ2OeNCZMLWg8f2X8S4X0udCUJBEDwwOFRa/eBaek5iWnbJ/VpmH8vUynyuCullMKmQnMlkvhiCgnXcau2jTS+0MHjytYF/36B/d6N2YCmoKcIqvBZPUNTYFWAs7biOxzSM3zbrdDqhUGg8NI9IJPb19c35wRC/VISCYVij0Uh/UslkshlBDww/m+xapRmVjHGGBHQ6p7Oz7/Fjam1tV1lZe3Fx653ilqLi1uKStrIK/KNmCp0xJBZLVSr12+Mqk37Z0ukVpeXsDxf2AWgqgO4AUPUAqgRAFQDm00aGUmfJk/gMSSDmAubFAKrWDNVuhmaYzR+et0D4AWr0NVtrwjAcmpSCC43GhERhgqMwIVHY0GjkASYkyiMs5oJP0FbHk2c8AnBhMZiQaGxIFCY4Cmu0Pi40+oyH/4xG5MEwLJNpq2vlGA+pvcPYrn2yU+dVaZnQ4OBrjSJE9DKEuhiVuPXgsQOXMFMH5U2LUAaDAYIgmVzOEwh5AqFMrtC/KdWZ9PMXDMMgCE6000SmcxkeHjYOQRkgjYbso6+zMNR9bKj/5FkLTZqnQTX8hs2f3vBYIT2zWRllLcegn3U6cAWkfis15NqJiV9gGJbJZMYT5yGz5s30V/IXq18qQv38BcMGnVankCtFQunAgIBAYNXX04qK8ekZTxKTGqNj60IjagOD7/sFVHj7lXr6lOC872E877p7Fnv73w2NKEm6XpmXV1tb20Ih0wUC4dsLh8IwDMOGOX2Rz0UZdSdnA+gBAM0E0BQATQBQrQDqIYCqBVAVAOoegLoDoAoB87zxeFLGi/GkNKMw1VSnj6+PpAXzAPNCAHXHDHXPDFVphqozQzWbodrN0N1maKYZemjefP74ML2ZdCdXaTRS+fMcNAzD17LyI25QAkVtAAAgAElEQVSkhyWnRaVkXvQN2nn8fFDCjfAbaWHJaeHX08Kup4YmpYQmpYZfTwtLTgtPTgu7nrr71MUzHv6RKZlhyWkRN9KxodE/jFAwDA0OKYLDRr62Hd1kN7bfaczp2Oi2b0fWb5SdPKN72m54zc8aY2h6hHKJv3HwCu6EX/CzplDTINTzShGNVisSSzhc7tDw8IQ5w1yhWGxqUz4npdPpBgYGiETiBEIRiUSJRGLcTgmGtPqhWzDJ2fB0h+HRakPdR4bmLwyiBgP0rsu0YcWIuhir8PhYgZ2vCFyjvPa9qgirGyLC+ucXp0ajYbFYxt0NKBTKnG8QZUKo2RcEQQq5apgjJHYNVNdQ8go6kpKbI6LrA0Nqvf3v47wrsF4VHj4V/lcrfAPKfPwrMJ7lbrgyN1yZK7bUBVNyBXPPxb3YFVOE9bjt638rLLwwKamgsrJ2oL9fPxsgpdZC/QLZE6bwPol7t2Mwv6U/70l/QUt/SQerhsh5yhRwxHIIMiHVz1tTJnhhjzfA7AfQvQCaDqBpAJoMoIkAuhNAdQCopwCqBUA1A6iHAKoBQNUBqFoAVQOgqqdzHYB6ZIZqNkM9MUM/NUN3mKE7zdAkMzTFbH7PvPm98+YPzJs/NG/+8Lz5vHkLhEYNDmY4wYtKo23sJLXT6MYLSXQmntqDp9C6e/uzi0sPXcY+JVHwVBqeQsNTaHhqD4Hag6yAuIvOPOHunZiV193bj6xQ3fTkBxN5sFqtjIiRfLpCbDZfERSq68DriN2a+gZFQKBkxWrZkRPQ4NBr3VJwBCL/9LypoSb3pLTLMUku8Tem9oVySUyJv1M6KlMgTyMUie6UlF2NiMEGBGH8nxvrHxwQHnP7XhlfIJzbt/LvoRQKxaRJhRkMxuTCVhiGNWKDjGYQPTQM5Rqo7ob+eING8E5DUM+OBNLTG9UFlzUVwTp8EdTXCokGYI3C8EImGuLz+caz5nV1dQ0PD8/te4D3C6Fgg0Gv16vVmtGxMQ4X7GH2ESk0IoVGZfSyhjhiiUSlVht343jt/cOwSqXp6+XW13Vn57RExdb7B1Z7+lZivSrcPcrdPcrdPMrdcOXuHuU4r9t77c9stt7lfDHE92o18t9JdsOVuWJL3DBFbpg8DO7G1avxd+7c5fF4b1Z4BMOGUaX2AYUXXEY9nvp0Z+zDHZENduF11qE11iHVNsH3t4RWbw+r3h1Vcy71UXINpY8nhUzf2j9bzXiOvIFxrkLcB6B7ATQTQDMANANA08cfGJsJoAfN5nPnzefOmw/OW4AMx+PPWyCYt0AwDkw/Zo48rU7XRu25mlHwoKPTePnEiDyOSFxW13jC3ZsxNGw8Rm+Sh4Si815Xs4pLOCLxzEfk6enM0S83jfznC8mnK6QHD+tpPQatDtZoIM6w4mqI5NPl6ozs10rnyVWqtIpaTNJ4I3JjX59moVtSGi45s669U6vTwbBhZEQafzNt95GTW+yd7Owdbe2dnnuvo5290/eHjofEJAxyOKaKw7kksVhMoVCMYzZDQ0PG160G0oHqUblerYN1MKQx6KQGRb9BzX03VeRTBavGID4THuUa1HKDTgOr1XqBEJJKDRP902FYKpVOahA1MDAwt1sbvC8IpdfrJSOjVAazsq4xLf92eNJNj5CIC57+Z7E+Z3E+zp5+7gGhwXFJN3IK7lbV4EndApFIp3+9K1Wj0bHZgvr67tS0R8Gh1R4+le4eFe4elRjP53b3qHDDlbt7ll1xS/nkkyX/+tcHZ876+AY+eP4vj3J3j3LjTbCeVe4eFVfcipwvpV28HBMekdjY2CiTyV7r2GDYMKLQZD8e2BXf9MXV2vVXayw9K5bjylbgSlfgSlZg763A3F2BKVrudme5662V7re+9rmLyX7c2S/Qm8JRP0/9iGmGp+0XZWykC7lxF6iZTOoyQ4RSa7X4HmZkQfGVhJSS5la+ZIQ3bhYXHGejmSGUQOTsfTWruJQjFCFL2scRaogvnNitQDJqPJWKOidfsthClZKmjIkf+c962amzui6iQa83wLCezhj5fOOY4xFYoZj5WwHBMGOQk1vTEH3rXmRB8asdUVCcUFxW1dohlo7BMMzhggkp6d86HPt61wHrPY42ex2N+0IhPcq/3rl/y75D4XHX+llsE0XNDcEwzOFwKBTKRBaPQCAIBALjnBdZNnyFdsubeS+P+7R9dGBYPaKGtPCPiD8hY5gmSavVal6UWq1WIVKrVSqVcYcqAwRBo1Ito1dZWyeNSxSeOi/LyoVGRyeeQqVSGU+ZRyAQpgmtzS3NfYSCYXhMJnvU2haXmoEJCjtyyX3PiXPfHDqx5cARG3sn672O1vZONvZOtvsO7XA8vvvYWUdnl0s+VyOup5TV1g3zeDN87zUaHZU6lJXdFBx238Onwt2zHONV7hdY5u13e8K+AXcDQ6o9/ardPUqvuMT/85///Nvf/uGOCQ8IvOvjX3Q1uMIvsNYNV+7tX+ETUDSxFfKvgOA6N1zZJdfCs86JFy76p6alSaXSmZ8EjQ56RBdsj3m0MehBwL3unMf9F7LbrDzLrHAlVrh7Vti7VthiK0yRlfttK7dblq6Fllfy13vcwmY3DYtfj9VMekf6EQj16pAVZ7ou5LOFUDAME5n94Xl3kDxXaO7tm6VVN575PoHGYPP4LJDHG5Xeq6k75urJ5HBZPD4L5E1rjlB8ztM//fY9cGSUBfJYIL+VSEYQKuluxbPdllSlV9YOCZ53fFX4BoysWK2n0iCQp4yKHbFcM3bQSUfoNEAQLJONHXAaWf8VJHy9DrFanY4rEtPYQ5QB9g+ayeGOyuQQBA9yOGFx1751Or5ptwPSaX1ab97tsHm3ww6HY/7h0aYp8+aG9Hp9f3+/cS15d3f3pC5KRXz8qragpS1+X7aFf9+ZdJFW0DrSp4beJAQll8uZTGZrS0tjY2NjQ8OEG+rr6x68oNqamur79xFXVVXV1tYO9PdPxMYgmUyadEPgdBS03gJargHnLRAfOqYb4kw8ETLf30RoDWlTPre7Q81xhFKp1RQ6Izk777S7185jZ7YePPoMm15uG3snuwNHvjty6shlTGhiclsnUaVSv/oK0On0dMZwYlKNl28Z5lkYqcLTp+TQkSuWVp+vsPx8heVnKyw/X7t28177kz7+OT4Blc4Xr/7+97//zW9+u2yZldXK9atWb9iyxd7VPT4g+D7OM+3LDVsmNly56ksb292XXSKCQu+7e5S7Yu+dOZ/i4HTp9u3b0zQlf4lkal3aoz4r76pT6U8ZvDGJQlPbzd0YUGWJncxPVm6FK13zV7rkWV3JtfG5U9vJmo33waTZ1ttBqJlPJPzGCEVnc0JybrtdS3VLSgvPv5NeUZNWUZNWUZNaXh2clBKVkhl5IyM2PeeCT9A3R84EX0uJvJkZeSM98kZ65M3MmNSsqJSsiT/Db6R/f/z8KaxvTFpO5I2MyJRMz/BYpJz8RmnV+G5rsu7XcYSiiWNQePtJlq/W0xkGGIZAniI4TPLpctmRk3oGE5aOjR08NPr5BkgkMrymYBjW6SGdXv+D1kMQDMNiyUjkteQdB49s3uNot//IIWfXbQeOTuWn7Q7HHc9dtrV32rzbwW6vg2dgGLN/wERRv3RpNBoGg2FcS97T06NUKid+aLSwPnrwwZL2APRTr/mtXgueeFk9DawQklTQ69UVQRA0NDhYVlp6LTExIjw8NCRkkkOCgyc5OCgoOCgo8OrVqMjI6upq49gYrFCIzziDCz/lmc0XmM0X/nOeeMNmbTfZOJcHguBEdygCgUAikcRi8Ry+YucsQkEQLB4ZrW54hAuO2HPivO2+Qz8IT5NAynbfoe8On7rkczX/bhmLw9G/5CLQ6yE2W5B88wHG4667RxmSicN6VfoGFH/22Ze/+93vFi5ctHzFmsWfrkCh5v/rX//etGmHX0CGg+PZ//7v/+8vf/nb0qUrFy9ebm6O/vOf/7x69Xovn5TzzgF/+tMf/+///s/CYtWyZasWLVrywQcffLJ46fET2MCQGnfPCjdc6ZHjsYcOO3d0dMzwbEiV2qj7NEvPivOZT4fECo1O/6iHtzGg0hJTbIWZhp9WXsmxupS91jU3tYY0e++JSbOnt4BQgwCaP4OJhH9kIk+p1rTTGBF5d64kpNx99GRYKOYIRRyBiCMQhl5L8YtJ9I1K8I1O9AiLwYREeUfG+0Yn+kYl+MUkugVF7jrhfNk/1H98HZ+oeKSXgW9Uom9Ugm9M4kXfYAShBkAeR4DsVsQVitVGJSbqrFzJoqXqwtsGvd4AGyAuVxEWMbL6c7nzJU1l9eiXm8YOHoblr5HIe13BMMwe4sTfSPvW4djm3Qdt9jphg8ILS8q/O3xqojX5RCJv74nzt0oqvEKith44smnXQdu9jv4R0T3M3pd9HZn0i5BSqaTRaMYzovT29hrfEsv0ave+4sUd/vPbvRe0+8xv817bGf5olKl5nXbkMAwPczgF+flBgYHeXl4B/v6BV6/6+vh4e3n5eHu/zN5eXv5+fjeSkx82NoIg+EJZoU4n8/YTL1oqMpsvnrdA/G9z0RJLdUMjbHTkYrF4oqIcj8d3dXXx+fw5PChvbiKUHoI4IC/zVtEpd69tDsdeC54mgdSWA0ccz7vE3sxgvCSELpOpKqoIbtjbbriyiUpwD59K/6t5ixZ99Pe//+PkKey5C9fPnI87fcbX3Nz8X//6t7Oz6zff7Pyf//mfLVt3XXZNPnMu7ugxzB//+L9///u/rrgE7bU/8dvf/tbSaq2LW9KZcwmnzoR/9fW23/zm159+usI/8A7Gs9Ldo/yS651dezEeHp4azYwq9UaV2vBKyjJcmXVIbVAJMfdx35Wcp6s97llhiqwwdxB+Wun6nJ9WXs62upi1+nJWfNlMKc2kd6q3gFDc2eKnHyonV6rVbVT61cyCmjb8xEIYhtu7Kc34riZ8V1NHVzO+6zGB2IT8ie960kkqq3+49/SlgvKqli7SxPLHBGIzvqupo6sJ39WM7yx50IAk8jSvKCfvoY+u/0q6Y6euvQO5e4a4XGVkzMiaz0dttkuWWqmzcl+3r8HMhfBTUFT8t47HN+86uHm3wxXfIAKJ3EWmfn/49KR0nvUex30nnUnUnm4q3Scs2m7f4c27HbbtP+wRGErv7Z3Dd/ZzXnK53LipZkdHB5vNNoYVkVZ+kp77cbvf/HafBe0+6HZvm+6ELvmQ7nVmgNBqtVVVVSHBwd5eXtevX6+tqWluarp39254WJivj8+09vbyCgoMLLpzh0qljo6OTh5cBUGq5Jsjy1aKEYQC0CLUIlXRPVj5vM+nVColkUjGCMXlcudwj/I5iFAQBHF5/Bs5BQfPXbHbf/jN4MnYtvsO7T15PvzazX42e1JGD4ZhkDcSd63msluxu0fFeDF4hZdflRsm7q9/+fPChZ8EBObgvO97+d2PjC5btWrNn/70pz179q5du+6vf/2bi2twQHC9t1+lOzb+D3/4HzR6YXBIsrXNjj/84X/37j0WGtmA9arEeZcecLjw61//9z//+YGXbzbWqwoZrHf0RKKd3fd9fcyZnJNRpTasgvype4mlR+nnfhWbA6vWepWscC+ydL9t6XbLyrVwpWvBSpfn/LTyUpblxYxVlzJiS9vfzrtk0o/TbCMUB0DPQgnUzBDKYDAo1Oon3bQ2ao/xwklz5BmbBfI6KFTHi+4NT9vZPP7LVpvJiDxYpVJGx0k+WTa2e5/6bome2atnsdV3ikdWfSb+ACVzOqofYL29Pml6PVRSWbPjwDGElq74BBK6KWqNhkJnfHf41FSEsj9xnkpnajRaIoXm4hNks/fQ5t0HN+3cn1Fwa26PFZ/bGhsbYzAYxgjF4XCMOQPUjDrS0hd1+C1o91nQ7oNq895NTelR8l9rlDTI5SZdu+bt5RUbE9PZ2SkQCCQSCZfLLS0tDQoMnARPSAgqNja2vr6ew+GoVKppGB2G1bfvjKxc+2ygidl8EYBWZmbDRsOb5HK58aA8EonE4XDm8LU61xAKhmHxyGj+vbKD567Y7jv04/lpgqL2nDgfnnSzl/UCRUEQ1D8g8AssccGUTISgMJ4V3n7lx467/fa3v1295ougkDJ3jypv/+qrwbkLFiz485///P33O+fNmzdvnrm3T4qnb62Pf8Wp0x6/+c1v1q5dfzOl6NMly/72t79fvhwcENyI9brvH1S5c5fTr3/930uWrggJL0OiUO4e5WcvZG3Y+H19/YOZnBa5WpfT3Gcf33jw2sODiY0H4hsOJtQ7JNQ5xD84EFtjF1Bi5ZK30iV35ZWclZezVl7KXHkxw/JC2qpLaSaE+plq9hAKKSGftRTezBDKYDAoVOoRmdx4yRBf0DvEmdYskIen0Jwuujc+bWfz+C9bbUbTDMOwnsVWBIaMfmUzarN1zOHw2JET0h27Rtd+ITt2Stv02PA2v+4hCGpsbjl4+tLWA0fc/EPaOolIwOxVCNXDhCBIo9V2dJE8gyJ3OB7fd9L5fsND3dxNjsx5SaVSJpNpPKPcpFANRy3ZR0udQCjzNq+DPRm9KiH0OiPySCRSaEiIl6dnSUmJSCSSy+VyuVyhUNAolJjo6EnBp6sBAZmZmXg8XiKRvLSzDwxrSstH13z+HKH+ba68kQpLn08orlKpjOcbNiHUL0xyhaLiQcPRy5hZiT9NiUU5X8vMFUlGJp4OgqD+Ab7f1WIXTMlEFArrVekbcO+bb+1///v/2b7dPj6xwT+w0tc/d8eO/X/84x8tLa2OHz/xhz/8YfmK1QFBRVivKt+Akp07HX73u99v27Y7PCLt//78ZxRqfkBgWkh4XWBI2aXLYQsWfPSXv/712PHLweF1440PKs5eyPpyw3d1D2qmPQ8wbFBqdOCoiiNWcMQKtlDW1icsIwxWEIYqCYOVhMFKAruSwK7Es4qf9rlkNK24lGPMT1YX0iydU1ZdTI0teWqA1QYdz6ADDTqeQScywHP2w/BL0uwh1KyVkL8mQhmm9AccFoqGBMJpDUpGunoYjhfcHrUTQMnoy1Yj0OgzmiNPD0HDw5rK+4rwKPklN9mFy3Iff3V+oa6bDKveeg8b8chIVV1jev7tzm6KWv2siOQHEcpgMGg0WkoPI6+4pKaxSTwyModHOc15TUKojo4OEASNC4aG1CP2tDQjhPJ07Mnse02EIuDxwUFBXp6eD2prR0dH5XK5TCZTKBQD/f3xcXHG/BQVFVVVVdXX26uQy1+VIIZhTXnlyJr1LyBUcooxQqnVahNC/VKl0Wo7iN3ncb5T+WnzHoc3s/FO7PYfPnoZU/uweeJ2AYZhEJTExldcci3CeD5DKJx3pY9fwcqVa379618vXbpi567DNrZ7LC0/+8c//olCLXC+4OngeOx3v/u9tfW3oeE1brhynFfu6jXr/vd//7h//4kLF33+3//7r7/85a9btu7ctv3g+vV2H320+K9//auN7XdXg4uw3lUTXTePnUqytv6ul8mYdBIgCBbJ1BVdw0GlZJc8/IWstgtZTy9ktl7IbHXOaHFOf+Kc/vhC+uMLaU0XUh9dSH107mbDdyGlVpeR/N0zfrK6kGp5/uaqC6mx91oNGoqBH2Tg+Rl4fgYw0CBKNah6DK+Tkjdp9qXTK0rKWfN+LEJNdIGafYSy2fq6c+QVVdUUlN3PL63KL60qKK8qKK9CHueXVhWWVydm52/7/9l7r6i2znTh/+JcnIuzzlrn4vu+/8xEOBRPOVNSbCeZTKZmkjg90zyOk7jEvdGr6MUGg+m9995BoncQHYGQBOogCVXUe9t7v/8LgSxjbGMnLsH7t96V5Ygt7S1pa+un533e5zlzObmwrLGrz3F7Pa7XsVk9rjezrGavbYYRBDGZYIkUYrIhBhPe2EB0usdokPcYIAiiNxjkCqXzQe5FoQAANghSqtVGown1px80D1UogUX9Fb3MOQr1Fa2UZdx8JIViMhgpyckR4eGVFRUCgUC/zfT0tD0dKioyMioqKi83d3p6enNz8672fLuCIOb2TtWb7zgrlKm4DNGiCrXND1ehEAQRSaTphWWfnbpwlzwdP3X0xJmvrvleDAy7EBC6Y1wMDNv19gsBoWd8gj755twOi/r89IXIpPQ13oZjvzqdsRM36+Vb5UgnD4vEBwTlvvTSS//5n//p5nbwtdeO/OY3r//mlcN/+cvHl65Ep6a1njjx7f/+7ytnzwXFxQ9gI/DhkRVvvfX7V199IzDoxsmTl/7jP/7j//yf//fKK4deeeXwr3712pE33jn27wvBoWURMb2O2pt+gS3/OBYUEhK2ow82BCNrm/rkbtrf0kbfiel9M7LrSDjuSHjnkbCOI2EdR0LbjmBbj4S0HAlpfiO48Y2ghjcC694MrH3Df6c/HfYqPnS98A2vooz2aWCcANx/grXPAeczwP4MsP8JBOHASEEt6lkCQcb+Qd7BX3J//PJ3USjh91IFasdw8ZD/6IDm2Ann36YPBUGQlILS6NRs+yo8n+j4M77YsKSMyNTsyJSsyJTskFupl7HRQfHJUVu3ZEUkZ33rF+oZcSM6LScyJSsqNds7Kn5PbYbv3vHz0CHSWaE+OH7avjTvXoVC2R/odDoGg+GsUEKh0HkiT2rVfsuo+sX8lkK5z0d+Qc1fMYihR7nqqtXqyoqK6Kio+Js329vbl5eXGXT6zPR0cVFRbExMVGTk7aSkpqYmKoWi0WggaA8t7RHEWFWjPPSWQ6EULh7m2npEf2dG3mg0rqysOCYol5eXdzy1fcb+USiLxTK9sHjWN9g5BcoeSTrt5d/ZPzQ8PddPmHYeA5MzY7MLhHniwOTdtxOm+yamanA91yNv7Fyjd+LMl5e9KxpaHNdoCII5HFFKWvt1n5rt5Xg4L5+E//mf/8FgXM98G3zuQuK5i7cuX0sPCCqNiO6Ii+/xD8i/ePl2SGhNaGQ3NgIfEd126WrKVc+0mLjS3/3uD//1X//11/e+uHQl6dyFWxcu3fb0ycWGN4ZFdW/nWnUFh+HPXcz++pvLc3OzO14EtdGaPcD4S/zAofCuQ2G4Q2Gdh8I6DoW2H8K2HQppPRTSbM8fPxTUcDiw/nBA7WH/msN3z9/Z/emwZ+Gha/lveBZktE4BwxhY+ztgfwJYHwHmh4D+PmB8CsQZANLf8yagPC0QxMblKwKxG796nfeSG+/xUshdPDa/V3naurC6/Vzz3kfmxmZgfbTrJoG4NDQzNzQ9N7FIyq2s+8YrqJcwbb9l1zE8S/zWLywpv2ScSBqanhuamWvsHthrFOo5Y49RKJT9gb1BnkOh5ufn+Xy+80mrshk92Y2/WNhakecxH/Xucvq8lmt7lKIGEAQRFxbSUlMjIyIS4uNzc3IKCwoy0tNjY2IiwsNzsrPHx8bumzm+KzCsT81Q/Pr1rRV5L7kpD/7S0tWDOP2S1+l0FArFeUWeWCxGFeoHgFKtKa6p//Tk+R3zd//49nJ5fbNKo5Uq1WsiiWOsi6QbmzKN3qAzmgQyufOf1kQS6jp/cH4pt675Xxeu7QhEffz1Wa/wWA6X79i12WwlkTg3Epp9A5tCwrtCI9pOnfb67//+71dfffPmrVZsOD4kHIeNwIdGdIWEd4WE47ERuJBwXEi4I/0cj43Ah0fjA4LzfvSjH//f//v/XbwcGRnTs3WvyC5Hi73g8K7gMPylq4Vf/O18Y2OT0WkpKQDABiPLfNWnqSOHwvGHw/GHwzsPh20XH99Z/Kn+SEDtEf+aI/fxp8PXCw5dzXvzen5W+zQwjAHO37b96QNAew+s/hWwzwLjzjlElKcJYrHql5apJ04RX3JlYtzWt9uz7NGfNlw8vq8UKEcTmM0DB3kuBym/el2cmQNtPlqBbwAAf3upnUCu6BwcuRAUydwQrglF91t/x9+UeUbcqGi50yNvlryHdPLnEodCfXTi27jkzLiUrM++OY8q1H7FZDLR6XQSieQorbm2tuZcF8oIW6O4+F8St+pCHZyPenPx1rCSbnnE6uQajWZ0ZCQzIyMmOjoyIsI+bt64UVlZSSKRVCrVI/WERaxWbSBW8bNf2xVK/uOXlYd+a52acS4ColQqnetCLS8vy2QytC7U8w4Mw6w17vXQqKN3r8L79OT5uNQsnkBogyCd0SSUyddE0nWxdF0s5Uk3FVqt1Waz2GwqnZ4vla2Jt/7EEoimqfTe2cXWEQI2Kf3DE2ecLerol6dPXPFu6ep1Pi2MJsvsHP12akdAcH0Qtv70Ge9XXn3j08++iY3vCt6thfC9AxuB8wvIev313/7hj0cjosqwEd3Ofw0J7woJ7/b2r//y65iTp3xLisuU9ySa6M22ignOa2EP8qcjgXvyp8PX8g9dyX3bq7C8nwj0/YD1iZM/vQtW/gJWPwGy5qf7JqM4gSA6oXAu/lbzW79vfOnlLozrKMZtDuO2jHFbxbizMO4cjPv6fVrg2VPIJXtOgVLsNuQHDsoOHJQcOLhx4OCai8eqi8eCi8eYizse49bg/rOeY1+u4bqQR7xu8reX2m3I5Lih0QtBkQz+7ivv7MOuUJWtHQKZ3H7LLJn6g1ao9/71zWffnB+bmh0mTP/z7BVUofYrVquVxWKRyWTn6uTO7XghBCkQE15dvOlQqF/Ox1aKZ7S2R1vuAMOwUqkkLy/39vTU19fXVFc3NzePj42tr68bjcZHPa8gsVh17CuF68+2LgI/OqD+5G8Qg+U8FS6RSJyrk1MoFJVKtY9P4H2iUEaTqXd47Iszlz5wqqJ59MvTZ32DJ+cWLFabDYKsVptaZ+BJZGti6bpEKpIrjGazveWC2WKRqTV2f1oTS5fZ64PzpN7ZxZ4ZYkVnz4Wg8PeOfeNsZl+cuZSQlad2yqFDEMRgMFMo63UN4xFRNVevp1+4nOrjXxIauVeFCgnHhYQ3Xr6aft07NzL2rhIJ2Ige/+DWr04mfvb5lYiIhJ6ePvk9DWfSWNsAACAASURBVCgQACQak3/twivYzsNhzv7Ucjj43uKZNUf8quz+dNin7F5/Onwl99CVnI+wlQQqB6jKAPMDwHj/jj9R/gTIfwbc6GfVMxwFgSDR6Fjda0eKX3ItwbiWYVyrMK71GNdmjGsnxq0X4zaMcSNg3OYwbksYNwrGjYZxZ2Lc2Rj3NYw7F+MucvGQ3ceN7vWkzQMHJQcOig4cFBw4yHXxYLl4rLp4kFw8Zlw8xlzc+1zcOzFuLRi3OoxbJca1FONajHEtxrw8fPqcTftoDRbFSqV9Yd2mVtc9Mn4pJIorkd5v8d3GpkyqUntH3axux21qdfZblhisH7xCnbywRF0lkqnHzl1DFWq/AsMwl8ulUqkOhSKTyXq93jkgNKCi/ZaU5FAo97lILLtNYtY+auIeDMNms1kul29sbHC5XKFQqNForFbrY6xIMI6Myd/+41Zp8gMH5T96WecbCIslzvvi8XjObYZpNNqO57XP2CcKJVcqs0oqPvrqrPMU3menzueWV6u1Wkd3KrPVKlWp18VSvlSm1uutNpvjTwazWShXrIulDL5wjETtnSH2zi72zi52T89n1zT949xV50DUJ1+fDYhN4AmEzseAIMBqtUmlKgKBkpHZHoyt9gtqCAhpd65a/jCLwmPD7QGnruCwruDwrqBQnG9g4/nLWcf+7Xf6zPX8/GIWk2kyGe99BWAYoYs0/84cfRXbfqd58B1/ajgSWO+IPx32qzrsW3HYp/ywT9kh79JDXiWHvIoPeRYeul5w6Fr+oSu5hy7n/M67MKZqRCanAf51QP+rkz/9GZD/CEjvAPoZAKnvPRKUpwACQfJOfNcBjzKMazHGtcRplGJcyzGulRjXaoxrHca1EePagnHtwLh1Ydx6MG4DGLcRjNuki/usi8eCiwfRxWPpnrHo4rHg4jHv4jHj4j7p4j7u4j7i4j7g4t7j4o7DuLVi3BoxbnUYt2qMWwXGtRzjWuq092KMazHGteZHmKUPPoGdyn88/BkBMDwzNzg120+YHpsnppdUfnXdHz8yMTA548hQtI/tRMbpgcmZ0z4hN7LyR+eI/YTpgcnZmo6uvSsUgiAwjEAwDCPP/grvrFCLlBXiMgVVqP2NRCJZWVlxVNe0F2RyfqPXTLIvVvLtiVD2RXmfLmev6EWPlFFuB0EQGIahbR7vdEesVs2tZPnPf63AuG/lkrv/3FxeiTj9UrJYLAwGw5Ejv7i4yGazd6x52mfsB4VCEIS7IQiMu/Xhdi2D94+f+uirbwNjE+hsDuR06tggSGcyCeUKmVpjsVkhGHYMKwRp9Po1kWSWxuybW7L7U+/sYt/cUvvYdHhK1sdfn3VY1IcnzlwJjiBRV+89FxEEMRrNHI5waHipomrodkpHWGSDf2CdT0C9f1BzQEh7ILYzKNSeFd4VvK1K9n8EheIDsZ3+Ia0+/rXXPIsvX828ej05IDjlRnxWRUXNzMyMXC6/39lvheBZtuxoQt/r2PYd/nQkaLv4uH/tId+qw35VbwZUveVf+ZZfxVu+ZW/5lr7lU/qWd/FbXkVveha8eT3/ba+Cj0IrY6qGKUwiJMkAjA8B7a93+dPy78HSbwHlc2Bae/JvL8pu2CB9J37l5YOjGLd2jFstxrXMyWDuHXa1Ktu2qyqMaw3GrRbjVotxq8O41TuNOoxbHcatFuNWg3GrxrhWYlwrMa7lGNeybVW63y5KMa6VGNcmF7cBFzfST17ePPrwulDOIAiSXHhnRZ5vzK1zAWHhtzOiUrLsq+1CbqVeCIoIurm1Ii8qJSsiJet8YLhX5M3o1EdbkWex2TZVauaGcIHOml1lLDLZayKpUqt7hqaCKtSLhlqtdlao+fn5HQXKTbA1nNv5i+02ee7zkb+ciykTTuqgJ166bFcsNLr878fkL//UkUuu/uO7tplZ51K0zrnkCwsLS0tLfD7fOcdr/7EfFAqCIAqNccY7yJEI9f7xU/86f7WmrVOl0ym1OqVWp9RtDblGs7EpWxdLNjblO8a6SDK7Qu+cmG4dnWxzGq0jhNy65n9duO5QqKNfnj7tFTg6NXO/SxuCIAaDSSyWr6xwJwiU5paJ3Hz8jZt12LBK/6ByH/8yT++Sa57F17xKr3uVXvMsunI9/+r1nGteWZ7eGd6+KUHBKQm38ouL63D4/unpOSaT+dDpZIsNHl0V/ym2+/WQtvv4U80bATXHkvBRdbPZXeTc7uXcruXcLlIufikXv5SLW8zFEXM7iXk4Ynk/qWuGwlkftQqSAOsfYPVdsPouoNrn7/4ISO+ApbcB8S1Aeh9oiQ84JJQniA0ydOJ5L/+UhXGnYNznMG6jGLcujFsTxq0a41p2t9wU3d97HnUUOQ27mVViXBswbp0ubiMubvMu7rQDHrwDHpsvuar3UFrTGQSAAcI0fmQcNzyOGx7HjYzjRsZxw2P2/+0eJVS14f5+4XpBTWP3GMF+Y+fw2PZmW3cpb+18aBRKqdWOkSj1I4SCzt7k+tak2ua0xvaSnsGm0ckFBktvfDa/mFGFetEwm81MJtORNjQ3N7cjHQoBoEe58jbptmMuz3U2/Bi5gK6XwE+9oAxisWoLSmSvvuGYxVNg3HWevjCP50iEQhBEKpWSSCSHQlEoFKlUuo+X44H9oVBWq3WGuHTswvU77YT/feqzk+djUrNIDBZHJGYLRWzB1mAJRCtcHoG8OrpEHSOtOI9h4nLL0HhFZ4/zqMT1lrV1RabmfOa81u/L0yeueOP6hx7cYwFBEBsEmUxmuVzD44lXVtbm5laHh4k4/ERdXW9FOa68HFde3lle1l5a2lJZ2drS0tPbOzoxPrO4uMxkssRisU6n2+OktcUGj6yI/xCNf30refwufzrsX/N2UK130fAImbEuXtyUDchkPbLNbpm0SybFyyR4mRgnE3fKRB0yUYda3GwSFcB8H8D8bCv+ZPen5T8A0jtg6XeA+Fuw8AZYfBeoZ76/txHlUbi7Ovkaxp2Ncadh3Jcx7nMYtzGMWz/GDYdxa8G41WNcazCulRjXCqdgUundc3/3hqwcc4Kl2zOD5RjXKoxr9VbGlRvOxa3fxW3cxX3BxX3FxYNzwENwwENy4KDsUaqT74ArlrA2BLuOdZFkjkI96R00PD27fv/NppcpD1AoBEH4UlnT6GRSfWt4YUVQdpFfep5fep5/Rn5IbklkcVVmK35ggaQ17DJR/qRBFepFA4ZhPp/vnFG+tLSkVqudr/ZSq/YUo8JRYNN9LvIXM9Flwimt7WmLvo3HV5w6K3f/xVYIysVD+bNfmcqrEI3GsQ0EQVwu13lqkkaj7e9ccrA/FMpssUzMzP/j7JWjTrnkH/z75D/OXkkpKlugMeh8AY27sTV4G5Q17hhppXuG2DOz6DSInRMzVfi+0jZ8SSvOMQqb2qPTco9duP7B3aUNjl/ybOnqfSS/RhDEZrMZjSaNRieXK6VSmVQik0o2JRKpRCLd3JSp1WqDwWC1Wu3pGY/0IlgheJopfe9G1+vBzffGn94JqcdWjZM5qxZ1A6KKAnJvsHkdbF4FkstAfBGILgDhBSA4BzbOAt4ZsP4NYP8d0N+/E38ib/vTot2f3gJzRwDxr0C7+IjvFcr3xD0NXhyr7dYx7hyMOwPjvopxJ2PcFzFucxi3GYzbjIu7PbdpzMV9xMVtyMVt0MVtwMWtz8Wt9+7R7+I24OI25OI27OI25uI24eI+5eI+6+JOdHEnubhTXdzpLh5rBzx4BzyEBw5K765r8EgNXnbAv3/zu3WReIG61WaYK5bcb7MHrMhDEGRDKqvqH4kqrQnIKvRJzfFOznIMn5Rs37TcoJzihJrm3tlFndGkNRj4UpnW+JR0ClWoF5DNzc2VlRVH8vX8/PyOKpQQAueLJg4t3rIrlD0QdYJSTNEKbU8xEIXYbLrKatkbv7uzPvclN/XRT2yz886134xGI51OdzydpaUlJpO5v3PJwf5QKIvFMjF7j0IdP/XB8VMnrngX1DZS13mMDSGNt2Efq9yNORqrd27RkfBkH+1jU+Ud3aVteMcoau6Iycg7ftHz3pZ5xy95tnb1PT8hSghGqBvKv93uezWwcYc/vRVQfSqte4nDhXSNQHYZSL4EomNA+E+w8XfA/xvgfg7WPwNrnwLOx4D1IWAeBYz3t5Of7o4/Lb4NiL8FC2+C+TfA7CGw9Akw8R9+ZChPggf2yOPdXSNqHePOd/EQHzgo3l5Yt3HAg3/Ag3/Ag3fAg3vP4B3w4B3w4B/w2DjgITjgITxwUHTgoOTAQemBg5vbcaYdC/d2afDy6Aol2JSx+Bv3UyjiCu20b8jo7ML9FIrF35inrt5PocwWazthJrK0xj8j31medohUcF7prZrm/vnFnlli1cBY9+yCWvc0SsiiCvUCotPpWCyWczoUg8EwGo0O50AAWNYLPl/J/+l89MGtGpuRv56LTeUOKKz6pyYmZuKi7B/HZW4/d+7rYohLgCUS51k8uVxOJpOdZ/H2fSIU2B8KZbXZ5paWj1/0vFehjn55+pRnQGVrJ43Hp/MFDosisdcHFkg9M3cpVNPgmLM/lbTibhdVfHXNd0f8yT6R99VVn67BkeenYhiCAKFCf7V4/BX/emd/OuJf9ceQutSOOYOBBOTXgfg4EB0HwmNA8E/A/zvg/Q2sfwHWPgOcTwH7Y8D8EDA+APT3wOpfd/rT0t3+NPM6WDkPYMOzft4vKo/SZviJNBJ+8HgshVpcoS8zWSQa495BYXP6CdPHLnm39Q9R2Wu7brPMYHWPEe6nUMwNYUJNU0BmwZYwpWT7pGT7pGTvsKjA7KLQwopbtc3x1U2RpTUJNc19s0SZSqMzmLQG456HwWg2w/AjfMehCvUCYrFY1tfXl5eXHZEbe7lL57dbB5kT+H2/Id64U91gNuJPC8kdUpL+KeSVI4iNy5V7+Up/9us7tQx+/LLqT+9bJ6eBkx5BELS+vu7QQXtFKLlc/vx8RT4h9oNCQTC8ymRdCAjdUVfTXtrgg+OnzvoGN+B7Vtd5DouirvHGSNQeJ3/qnl6o7Rl0VqjUsurzAaFHvzx9r0Id/fL0tz7BE7Pz8PMUotQYLNk95Ff96g4HbBfP9Ks+4lf5blhDM4ECGduB5F9A9G8g/Ncdf+La/emT3fzpz07zd9v+NHcEzB4C06+B2d8Cfi4A6JX9GbFnhXpSjYS/b4VCEORmZoF/XKJf7K17h39c0pXQ6A++OnshKCIgLuk+2yReConadUUejCDthJmwwgrflGx7tAmbU5xS3ZhU1RCYme8sUoHZRSH5ZdjCCmxBeUh+WWhhRUJ1U+3gWOv49KOMqe5ZIksggvasPqhCvYDAMCwWi2k0msM8FhYWuFyu89mLAISsF56gl/50IXq72Uuk20z430i5A/JVA/RkYzyQVKpKSJK8ckTmlEWu/NXrppx85083giBqtdp5LR6JRGIymQaDYX/P4oH9oVAIgmyIxGGJqR9tFzXYYVEffnn6GjYSPzLO2BDaLWqVy59ZYfQ6FS/onJip6OxxxJ/SymsuBIZ99NWZ9+8NQR0/9dFX317DRlHpzOfq7LDaYMKq8PehTYf8t/3Jt/KIb8V74Q2dsxRIXwVEf/9u/vQGmD0Mpl8DU6+Bxc+BdulZP+MXmL0pFG+7iuYPQaEAfnCkqqXjexk7fvvqTabMZlxwbok9/hSSU9Q5PkVd41LY6xVd/f7p+TsUynkE5ZYEZheGZBftfQTnFIUXlOU2d8hV6j1+g1DpzL+f2VYoMpW4TDl29ur7/z51/KLnCp2JKtR+Ra/XM5lMR6eXhYWF5eXlHYEoC2zDKSh/Jqc5MqLc5yJ/Oh35DblkWsUxP2LLl70D63SavALp7/4ke/mnzhP3ei8/iMkCTh8xi8XC4XAcT4FIJJLJ5H2/Fs/OflAoAIBSrS6srt9VobaKYX5zNiD21tDMAlMgovE2Vnkbi0xO/zzJ7k89M8SW4QlH/CmrpvFKaPSOvi53P9q5oBuJApHk4Uf2FEEQIFLqfUtGD/lWH3YqPv7XsDrcDAXSVgDBF07+9PmWP7F29ac/guXf3/GneXv86TCYfh1MvQKmDgNmGLChdTWfHXtTKMEz8afHncjTG41anf57GTseWa7W3qxqDMwqtIegkmsaBVKZvaYuky8Iyy11BKLuVSj/rMKrCSlX4pMfaVxLSPVLyVoXivb4K5yzzjtxyfvdf3z1z7NXV5lsCo1x4pL3e8dOnrzmx1pbf66i3SjfIzAMCwSCHUnlbDbbuboBAEBtMybw+15bjD+4PZ3nMRf5i+mo89SKKRX7SVgUJN3U5BVKfv+XTSd/kv/ETfXn96z9A4jTMgsEQWQymaMv3ouTSG5nnyiU2WIZm5791/mr96ZDOWJRn548h01IHp5dsAeiljnrw0SyXaG6pubreodKWnFl7V35Da3+NxI/PXn+fv70wZen/372cmpBid7w3GUCma3QCIV/MrX7Lf+q173LX/Mqec2z+M8h1Z3Ty5CmHGx8ttOf2B8B5lFAfw/Q/gJW/gSofwSUP4DldwDpbbD4FiC+ARYOg/nDYPZ1MPMKmPoNmPo1mHoNkI4D5QR4lJ7hKN8ze1Ao/vfXSPjpKNSTQ6bSxFU2BGwrVGpd86Zy6wcAXywNzyv13V6gt2sUKiCzICCr0D+r0C8j3y89z3d7+Gfk24fzjb7peX7peQFZhQkVdWK5co/fIlqdvrS2KTg2Ma+iRqlSyxTK/Ira4LjEoup6hUr1InwVvbAYDAY2m+0oEDU/P7+4uCiRSJwjqQhAVg3iK+z6/12IdU6K+sV0ZCq3X2X7vr+JEMQ8N7/58RdSF487haB+4qo89JYxvxCWyZyb4plMJhaL5RyColAoEonkRQhBgX2jUPYC5UFxifemQzlb1OenLkSlZE4vrzA2hNQ13sTySs8MsWeG2DE+bZ/FK2hsC0pI/tuZi7ukkDslQn19za9vdPw5jK4jCNAYLGMUfkrb/MXsnuOJbcfiW8+l40eXabCmFPA+AbwvAPdzsPYp4HwCWB8B5lHA+ACwjgHOecA+B9hnAfNbwDgN6CfB6jdg9WtAPQEo/wbkY2D5H4D0T0A5DdixQD4EoEdrf4byPfMwheJj3CXPyp+eP4XSGozJ9W1BOcV2TwrPL+2dmhNuynliSePAaKAjx3w3hcIWVtyqaUpv6khpaIsoqbLnSIXkl4UWVd6ub6nqG44uqw0trHC+S2hhRWJtyyRl1bznVn0Igog3ZSt0plAstffiEIgkFBpDKJbs+4TcFxx7RpRzIGphYWF1dVWn0zmrsxWBprVrJxkVP52Pdp+PPDgf5TYXcZSc2S2nGuHvPyPKtiHQhkYqHO1cXnJTvfaGMTUD3tgATl98CIKIxWLnEJQ9C2rHwe9j9olCAQA0Wl1ta+cXZy7eT33s45/nrqaXVJJYazSeYHaV4ZjFK2vvKmxqD0/O/NuZS/eNPx0/9cHxU5+ePB8Ud0ss3fwuR2u/SlqtVovFYjGbzWazxWKxWa0QBD1GUShnEASYrZBIqV9el87ShdM0wQJTtKncRFTFYP2jrfoF7I+3/In+PqB/CASxQDMKNKNAMwLUI0A1DFTDQDkElENANQ7U00A9BVRTQDUFNIvAxAfws+kwgHKHhxU1ED+rKbznUqEgCK4eGAktrPBJzvJOzvJNzYktrspr6cxt6gjPK90lnbygPLykCltQHlpUmd2KJzJYjA3hKpffNj51o6oxpqI+pqI+qb51ikoTyuQ9Mwu3altiKuqjy+uiy+tiKurja5pGSRSd0fRIH2N7IzPEaZU49N0uBSg/FPR6PYfDca7rTSQS760IYIZtkxrOCXrpLxZi3OciX12ML5IQFDY9Ap7ASQLDEJ2hPfmt0v0XipfclL981RCfBHN5zilQCIJoNJrV1VXnEBSVShWJRD+4Pt+Pzf5RKKvNtkRduYqN/PDEfTOiPjh+6ujxU19d8cmtqltisEjstYEFUtfUfH3fcHFLZ1x2wfFLXg/2pw9PnDnlFdDZP/gYPw0RBLFarWqVSiwSrXPYtBUqmbS0MDc7OzU1MzU5PztDWiRSyMtsFlMoEKhUqsdrpn1ndwAgyNYAsBYoi8Dah1vFC1gfAcZRQLfXf3ofsC8BwW2wkQj4iYCXAHjxgHsTrMWB9RtAMWB/JKeB8hxwf4XiYdyFz9afnj+FAgAssthxlfV+6XlbJaBSc3xSc3xTc3bUNQjMLgotqrSvwktr7sxu71pgsCxWGwIAjCAytWacvNI3v9Q/T5qjs/QmE4IgSq1ukkrrm1/qnV/snVvsm1+apNI0+udulh/luQWCIKlUumNp3vLyskQi2eEiVgQaVNFPMsp/RYzzWWtmmzYf0HUYgiCTyWS4D0ajwWKxPOgrBoYt+G71Xz9UHX7bEH0DYrKA09wcgiB6vX7HFB6JROJwOC9IFpSd/aNQCILIlKqy+uYvTl96cCDqg+OnvrrqU1jbSGJxxkhUHGG2Ct+XWFj29TW/+6VSOcbfv72cnFck2ZQ96rGZTSaxUEhdXp6dnJwaHx8fGRoa7B8a6Bvo6+nv7enr7e7v7env6+nr6erv7env6x0eHJyfnREKNqzfS2kyWAsUhYBzFLA/BqwP7/jTVvGndwHlPbD8LiD9CSz+HhD/ABbeBnO/BXO/A/ys72HvKN87NsjQgeceOHivQm24eGw+W3+yK9QHHz9XCqXWG6r7R8KKKn3Scu9XWtM7OSsotySyrLZ3lijYlJPXeCtcvv7uPvMGk1mtN6j1BsckHQKA0Wy/UW8fRvM+LyeI8r1jNpt5PB6FQnGezqNQKDKZbMfPdSNsmdCwkgWD8zreAxLJLRaLWCzmcNgsFvN+g8td12g0D8hIQZQqc2W1uaIa4qyBu2XObDY7F4Ky14Ki0+lKpfKFmnrePwoFALDZIDqLE5GY+sk35x5sQkePnz7rG9zcOzCzymgfm0otrT7tHfRQ8fr467PXsFGzi8sQ9AhZUDabTSGXU0gkwtjoYF9vTxd+oL9neHhgeHhwcKi/v7+np7erqxuH7+rE4ztx+I5OXHtba3NjfW1DXU1ne+vUJEEsEn3X1DxYC2QFgPU+YG0vvqPdUzxz8bdg8R3AuAw2MgDDG8wcAtOvAW7qd9ovyhMCgox9A7yDv1z/iSv3JTfnENSzTIGyDxcP2Y9fVv/zOKLRPuuX6Q4wjNB5GxnNnaGFFX67WZRPSrZ/Rn5kSXXt4KhMrYERxGqDrC/SlwHKMwRBEHuxcufpvIWFBRqNdq/lmGGbxKo1w7b7hXpgGJZKN1dXVygU8gMGmbzMYrGc66HvclgKBaLRgLs/CBAEiUQi5xSohYWFF20Kz86+UigAgMlsnl5Y8ou++fHXZx/iQ1996xUeW4fvLWvDXwgMP7pdh/N+46Ovvj3pGdDQ2aXV77XhA4Igep1uncNZmJvtwne2NDd2drbjuzrbO1pqaqty87KTkm/dSopPTk3KzErPy8/JL8wrKMrLK8jNzcvOzsnMy88pLMwrLy/p7GijkJd12u/whQTrgKwIMN4FjA/ujj/90an401uA/ClQjQGrDGjmAelfYPJVwM95/J2iPDkQxMpZk/sFbhx+m+tykPsTV+5PXPkvuT2DKprb2iR38ZBj3OUYd8XPf6366DNTdS14zi6mZqt1kcmu6BuKLq0Jyin2zyzwS8/zTcv1S88LzCoMyilOqG5qGZvkSzdfnGkIlOcHGIZlMhmNRnOszrPPjrFYLLVa/Uirl2w2G4/HXV1dodFW6XTa/cbq6srKCvVROwHb41vOhTTtU3hra2sv1BSenf2mUAAAnV7fNzp+KTDsw/uXifpgu7zThcDQa2ExH3999qEpUCev+1c1t0k293p5RRDEYDDQV1enCBNNTQ1VVRXt7W0tbc25edlhEaFXr10OxgZlZKY3NtYPDvZPTIxPz0zNzM7MzExNEMZ7e3vqG2rzC3ITbyfcTr6VnZ1ZVVE+NDCgVj9uKSbYCNQ4wPgA0P+6S/xp6XeA+Fsw/wZY/gzoqQAgwCwApONg+k0g7XjMPaI8YRCLxbJK01bVbl7xEv7hXf7BX4p+4ib7savsJTc5xn3LaZ6KNsl+4ir7iav85Z8qXj2i/uJf+pu3LP2DsELxrF+hXTBbreti6SCRVIjrvVlZb69ZgC0ov13XWtU3PLPKECuUz+FKW5QXBKvVKhQKV1dXnSfIiETio06Q2Ww2Pp/HYNAfOuh0mkr1COe81WoVCATOvfDsq/AYDIZKpXqhpvDs7EOFQhBEoVK19w5cDAx7+Izel6c/+uq+dRAc8afTXgEVjS3iPfsTAMBiMbNZrNHhoZrqqsLCfBy+sxPXcTsl8dyFsxcvXcjJyR4bH6czmBLJpkqt1Wj0Wp1BqzNotXqNRieTK3g8PoVKHRgaKK8oTUm9nZJyOyc7a6C/3/CYxaggYOYAnh9YfRes/GUXf7I3b5l/B6zFAVkX4KaB6XcA5TwwrD3W7lCeCjAMa3WWVZqhq0edmq656qX+/F/Kt/+o+NXrioP/K3/5p3IXD5k9OORil6pttXrM4W5/KJmLh/xlD7nbzxU//7Xy9TdV736g+eqULjTSVFFpnZqBBULkOU4GgmFYazCsi6ULDNbgAqlnlji8uExe4wplctODs2tRUJ48RqORz+dTqVTnpCj7jJ5SqdxjRofNZhMINphMxh4siqHR7DXEZTabBQLBjvm7paUlBoOhUChekEJQO9iHCgUAgGFYoVL1jU6EJST/7cylByeJPyD+dPTL05+dunANG1XfjhdKpHu/vNpsto0N/sTYaGVlRXZ2VndP98Bgf+LthG/Pnr4Zf3NwaJDHF3D4MsbaJo0pWmGKqAwhhS6k0IQUmpBKE1LpIipDRGOJaUwhcWllcGi4prY6PTMtLzeHtLT4mKaPmIFuEvBCwOpngPx7QPodWPrdneYt80fA7CEw8xqY/S0gN/tQbAAAIABJREFUfgyIn4JVL6AYAU+g4gjK9wyCIFYrLJPbGAwrYcrc3GbKKzDEJ+qCQ7WXrmm+Pq3+4p/q9z9S/eFd5ZvvKF5/S/HrQ4pfvqb4xW8UP/u14uAvFR7/u3Mc/KXip79U/PzXiv99RfGr1xWvHlEeflv59h9Vf35f/dHn6n+d0Jw5r/Py1UXGGFLSTeVVlp4+G3ER4vERnQ78cBTECkEGk1lnNBnN5r03s0NBeaLYpy/uZ1FisdhkMj30mwiGYblcxmaz7HGm+w0Gg87lrj8oF8rpATUaDZfLvdef6HS6TCZ7Mf0J7FeFAvbsPL2BSKZmlVSc8vT/8MSZh662uyc69e2/L15PyMobn56TPUp4H0EQrUYzOz2F62xPTU3G4XHLZFJefs6XJ/6dkBDPYDAsFovBZJlb5nb0E0tr+yqaRqpbRhs7J5o6xps6xhs7xmtbx6qaRmtaJlrw0/1jS4QZMoW6Mjg8kJefW1NTpXnM6TwEwEZgIIPNWrAWCKh/B4vvbFUen30VTL8Cpn8DZo4A4odg9ToQlAItGcDGhz8qynMFBCFGI6JUwWIJtLZuo1Cts3PW0TFLT6+5rcNU32gqrzIWFBmzcg0pafqEJP2NBH10nD4y9s6IitXH3tTfvGVISjGkZRpzCkzFZaaqWnNTi7mzy9I/ZJ2YshEXIToD4m/Am5uIVgss1h+QOaGgPOfY6wVwudyVlRXnGT17pQMul6vT6R76fWQ2m2UyGZ/P53LX7zeEQqFGo3nob3KbzSaTyRgMxr0HQ6PRpFLpQ4oj7Gv2rULZsVitG0JRz/BY5O20Ly97fXbqwrZL7apTp49+efrol6c/+ebcsYvXfaNu1LZ1ste55keclbDZbBt8/sjQYFlpSV5eDo2+SpiauO559dLlS0zmVsdQg9EySeSUNw4nZDZmlvXnV3bnlbTkFDVmFzZmFTak5tYlZzdkl/bkV/XnlHYUVnRMzy1vbm6OjI4UFORRqZTHf0UQCNg0wEADykEgLgO8RMAOB6xgwA4H64lAUAoUw0BPAzY12r9lPwDDAIKA1QosFsRkQgwGRKtD1GpYoYA3N2GxBBaK4I0NmH/3EAhhoQiWSGGZHFaqEI0G0ekRoxExm4HFCmw2AEGoM6GgPDlgGNbpdDwej0ql7hCXxcVFBoOxublpNpsfIC4IgthsNqPRaDAYDAb9bsNgNpsfrGL2w9jY2NhRbcGR//SC+xPY9woFAEAQxGgyrbLYbb39mSUVATEJZ3yCjl24/unJ83Zhso+Pvz77j3NXT3kGeIXHJGbnN+K6iWSKUqV+jJPDZDItLy31dnclJ99ubGzg8rg1dVUnT33T0triOF8NJsskkVPWMJSU215YO55d3BqTkJNbVFdY1phf0pCeW3UztSKjGFfSMFFYPXArrSK3sE6r1YnFoqamxo6O9u/+qgAEAjYtsIiBaR0YOcDEBRYJgHQAoDMaKCgoKM8YeyxKKBRSqVTnNXp2KBTK+vq6QqEwmUxPYgEEBEF6vV4sFjOZzB17JxKJ9kbCMpnsO9Z/3gfsf4WyA8Ow3mAQiMSLlJXB8cmWrt6i6vqUvOKErLyEzLzk3KK88ur6Nlzf6MTsEmmNx9fodBD8mGEYg14/MTba0tgQFxfb1d3FYjPTMlIuX7nE4/HubGNXqMahtEJceRMhI7/uRmLOPJFMo7NXaew5IqW6eTi7vKe8cay+cy6joCkiNnNzU2Y0GsbHx8pKS76nVwUFBQUF5TkFQRCTySQSiWg02vLy8o440OLiIpVKXVtbk8lke0mQ2iMQBOl0OqFQyGQyd90pmUxms9l7z23f37woCuUAgiCz2aLT62VyxYZQtM7fWOdvbAhF0k25WqM1mc02m+07nosGvX58dKS2uio6OrKrC09n0JKSE/38fZVOxZrtClXeNJxd1l3TPp1V1JCaWaJQqGAYhiBYbzDNLHHKGscqm8fa+0lFlfjw6AyJRGY2m+fn52prq7/zy4CCgoKC8ryDIIjFYpHJZGw2m0wm75jUs8eEKBQKh8ORSqU6nc5qtT5Gl1V7z1az2axSqTY2Nuh0+o4Kn47k8dXVVT6fv5cMqheEF06hngJms5m0tFhZVhoZGV5dXUWn03Lysr28PdlstmMbh0IVVPU14ucyCxtuJRcw2HypXCdX6UVSzSSRU9Uy3tI92zNCzipoSkgqUqu1Br1+YmJ8bGz0GT47FBQUFJSnic1m02g0fD6fRqORSKQdkaH5+Xl7cjedTudyuWKxWKFQaLVao9FoNpttNhsEQYgTjib3ZrPZYDCo1erNzU2BQMDhcFZWVu6dNLTLE4VCYbFYUqnUYDCgtdMcoAr1/QNDkHBjo7q8LDoyIj7+5vz8bFtHi5ePZ3VNtcPcDSbL5AKnomm4pG6wtWchvaAxJrGwCTfZN74yNsscnWE042drW8fxAwuVDX3RN/IbmnrNZvPmphSP7+Tz+c/2CaKgoKCgPE1gGDYajXK5nMPhUKnUe6fYHBNty8vLKysrdDqdxWKtra3x+XyhUCiRSKRSqVQqlUgkIpFIIBBwuVwOh8NkMmk0GoVCWVpa2vUBl5aWyGQyjUYTCARqtRpNftoBqlBPBINePzYycjM2xtfHq6SkaGRkKDE5ITAoYH5+3m5RdoWqbB6pah7pHV2paxvPLmkvrO4taxiqaR2va5+obOwvq+vJK2u/mVyenVfPZvN1Ou3U9GR3d5fRiNYaQEFBQXmxQBDEnqgkEolYLJY9zXxX73Ge5ltcXFxaWiKRSMvbLC0tLS0tLS4uPvi+dhuj0WhcLlculz90+d6LCapQTwQYhqUSSVN9fXCAv5+vd1FRQXVt5c2EuOSU23Pzczqd1mCyTBE5Vc2jjR0ThHl278hSaW1vcXVPSW1vdfNwfftYZlFzYkZNQXkHvmdyZZUjEonGJ8ZqaqqZTAZ6HqOgoKC8mNizozQajUQi4XA4q6urDiW6nwzN38MDlMv+aGQymU6n83g8mUym1+vRzKf7gSrUk8Jms61z1ipKS3y9rvv6eCUlJeQX5KakJqVnpDU01pOWqWMz9KqW0dbu6ZlFTk1TX1R8bmZRW35lX2ndYGEl/mZaVWxyZUXDIJHMotFWGxrrs7Kz5ufnzWbzs35mKCgoKCjPEgRBrFarTqeTy+U8Ho/BYJDJ5OXlZRKJ9NDw0v3MyR6jolKpbDZbJBKpVCqDwYAuu3swqEI9QSwWC4fNqquuwgYFXL96OSQ4ICEhLiHxxo342PSMzOKqzvKGobaemekFdm5xU1DoreHxhbGplcrmiZxSXFpBc2ZRe3YpLr+8LTklNS0tdWZmxmQyPevnhIKCgoLyXGCf2jOZTGq1WiKRcLlcu0tRKBQKhWKfs1tcXLRLlQP7LfbZPfvGZDJ5ZWWFzWZvbGzI5XK9Xm+xWB5jZd8LCKpQTxabzSYSCgcH+tJTk/19va9dvRwY4BsSEhAcEnIrvbS4tq+te3pynpVVUO/lG97e3tHV3VtU0VpY3V9c3dPSNV1a1x8am+kbEDpBIKC/BlBQUFBQ7sVRi1ylUm1uborFYnvCOJvNZjKZjG3o2zAYDEeyuUgkkkgkcrlcq9WiCU+PCqpQTxwEQXRaLYNOG+jvz87KCPTzvXj+7JXLl+OS8otr+1q7pgmzzLS86q9PXwkMDAwODvL2DYy7XVbZNNLWPdM9RErOrgmNvr1AJKFnNgoKCgrKA7DHpaxWq8lkMhgMOp1Oo9Got1GpVI7/ajQavV5vNBotFovNZkNjTo8HqlBPCQiCDAY9j7s+SZhoqKvNzMhMy60prR9o6Zoan2Wk5VYdO3H+woULvr4+0dGxxRUtDZ0ztW2jQ4TVJtxkbGJ+cVmtSvV43YVRUFBQUF5EnGtBOWO/8Vkf3X4AVainDGKz2dRqNYu93jW4UNky0tY9PTHLyCqo8/aPbO/omJ6eWl1d5awL+sdX6jsmu4YWR6bohRWdUTcz+gbG0Lk8FBQUFBSUJ43Vat3LOkRUoZ4NRpN1ksgpq+8vLG+vbupPSi+9mZi9KVPYfxnYbBCHt9ncPV/ZNFDfNlxU2REZnx2flE1nsB/6yCgoKCgoKCiPjVarFQqFQqFQq9U+OIUGVahng95o7hshRsXn+YckBIQl+oUk3E4rVKk1jg10enP/6FLc7aKIG5nhcRlBkclB4Yl1jZ1ms+UZHjYKCgoKCsq+x2Aw2C1KLBY/oJYQqlDPBqvNxuEKR8ZnB4YJA8OE4dGpRdKKxWJ1bABBsFAsm5gijk7Mjk7MjhHmJqYWlik0qxWdy0NBQUFBQXmyWK1WsVjsCEftug2qUCgoKCgoKCgoO4FhWCaT2S1KoVDcO6mHKhQKCgoKCgoKyi44W5RMJtthUahCoaCgoKCgoKDszgMsClUoFBQUFBQUFJT7smNGz3E7qlAoKCgoKCgoKA8CgqB7s8v3g0LBNrNCyCItLVHpHI3xaSxYQ2BIp5KskMkrnE3rwzdHQXkG2CxGzgpxcXFpVbj7WpJ7QRDTxuriEo1rsj68ptwPAYuQtrS4yjGYH/R0bDohxakPK5WnhJ+jus0WMXOVtLwsVpu3qklDBt66xAih7Z4eA1glZJOXSSy+3PKsX0AE1qyvkFc4YqPlKX/WYI2Yu0ImMQVKi223FwExC1kry3c1Jr7ToXiVIdCbbc/R5wO2SsUyjdH8dD6zZrNZuI3FYgH7QaEQWK8QDDUUxMbEpuSUL64rnsInA7KZeKuE7KSkrPrpvX47oaA8TRBYzZvPTYiKio7NrJnR7/E+kKw3Jza2oFWquW8dlB8UqsG82KjseqHSuPvfrarF0cG22vybUXeIz67o7O7nbJqej+8J5XhZXnx84ihdCcEIZFEuDDRnl/QKjZbn4/B+WFhoA7XJCfGV3Ytqk/XZvoCQldWUkZxZPyZVG5/ukVhZ460ZtxMq+skqwy4RAARSDFZlJsRG7cqt27l1AwsyjfG5aA+DGJlzg1XVOMqGzPLdHAqCIKPRqNPpDAbDg4uSK5VKu0JJpVKwDxQKgSwi5kLGjaAr2PDogLDakVXTk3d6yGpgLHRhPT2xmf2qJ743FJRHBoZMVFzaVT+/iKuXfLCZdNVefjgikE1UG3buXHSh4H7O8QND1hx5/kxo5trmLg6JIDYusSs+MDAoLLy0sbtni5bs2OhAP5+MuiGJ5nkoY2tkz04ODAyxpQYYARb9WlGU54WQMrbOjIahHh0TsTHd+8rl29XjcsMzdlCbmZwb5B2c1SmQ65+ujpgpuMIgrytJjdMy7S5nOAxJmlKCr14Pza9pwjs+Fj09PT093S3FcdiA60Gx1YMru+rXUwaBFT2FN3xD0sYYAtPjKhQMw2q1WuiEWCw2Gu97AYRh2DGdp9PpfvAKZTOqySN1WGxEUh2+Mj44NrdtTfPE31pUoVCeaxDYpiAXhHsFppb05UVfuubXNsPbw4/uF0uhrAZBXVLw9YC0rslZqd7RdNXIIxFb80KveYU1z/Ftz9OUHgDArGPnBF88G1SCKtRjgSoU2KtCBaRNrUl2TI/BRslsX32k7zWv2EqyQP3M5/MQWN6ZFeEZkDxKf0yFck4S34F9nm5XdDqdIxD1g1covULQVRQZGJM3ssoZa0r1DYyvmxPcvYlNr16b7h9aYkv1WjWFgMPhcF3dfdNEht4GAACw1SRbX+7v659aoOudMqlgyCzdoA71Dy+sqXfsdO8KBVsMUhoBt0133wCRKbZuX/xgyCITrowOjFCEBq1MSBjE4XC4nv5hClcG7TgfILOOt2h/kL7BEZbUwKPO9PUPLqypAAAwbJWLVod7B+c4dw4Hshj41Nn+7W229mg1yRiTjuPp6umfpwutOy7GkEXPX7Jv0DswxJQaN1bm+voG5jhKp40Qi1G+NITD4XA4PL5vmLCh2B9fuvsBBLaJCAXXL17LaZ2S0DpCzl+KLupS7pYmiFiNtIVR+5s4scTUm7YVSmGEzHryVD++a5Srdz4XEQTenO/qGpyh6i2w/QY9dwGPd5xT+LFFhvOuzHruGB4/t6axmfXEsa3zbprC3UUBENlC19YDdfUOrMt3XMJgJW9loHt7P7Mc+N5vHsjCWhq3/310ftVglTVH3FehDMq5+Mvf+mcPae7JCJHR8OFXzgeUEcx3/cm6sTS2fYC4AbJ4lwMABsbkqGObabZ6+8IOba6TB7rw02y1072sAtJEd08fhaeCEQQAWLZOHugaYcr19PnhLjwO191L5gnpk6M9vX1MiUG/sdzVURV+/dyZa9EVLW1DM2Qpe6m3p3uCyNDf9RmGZTzqYHfXJFP5vCngs+YRFEov4xKGeu3v5CCRrTPd+/FB1BLmWP/2NgtsnemuX+8mCX10sNfxwRgYn93U3HGSvSiUjkcc6nOc8TgChae7k9WHaDfZEwN98xyVWrE5PzHYhcfhcD3zDIHhnuQqWLZ1JHh816pQRmzfq0LdOzumE63kxgdfuhLcRRI5fV2aN0iEgR77K4GfXNnQO2UfIoiCPD48MktT6kwi+txgXxcOhxshUBV6MwKAXsmdGh7owuFwfSMcody6M0fNIiBPDm4/8gJTYrBsbWCRr02OdtwO8754NTizrKZraEIg023f2yKkTA1t3Qs3QeZqd3n7AABAoVDYZUipVBqNRoPB4Igw2efpdsU5EPUDVyibUbQylIT1jS/tE6vVtJnOUB/fyJxe6V0XFKOUN5LuH5Re1thSVZ12E4vFhoSEBEfGpeNnGHoLjNiMwtXh9NCguLQK5qbBcTeLXjGHywuNSMatKHbsdk8KhUB6lWiqu7kgKTIIi93aa0hw9O3C9mGyygoDAGxWHX2+JSYwJL91qKG48EYUNiQkJASLTciuGFp2mA1iMahXJ7srM2N9AoKx2JDwqMiMkvqq7ITA4LDC4XUAAGTVMxfbogJCcwbWHbu36OVTTdlBwaEFQ+sAAIDARo10pq+t6HaU/XiwISHBwUGRiXktgyTl1nmJWI1axkxvddbWvsIiw9NLGmpyEwMDQ/IG17aevsUoos821hbdDN16pNDI6Lzy9iWewoL+NH72IDYNvzUl4JJncM+y2GIS1MdcuRyQMidQ3305RCx60XR7ZWJsWHBICBaLjU5Mr+ztLw0+u6VQJlVPWYLX9aC6ReWdOyKQcb0v6rp3UtWg2gRDVh11sq8iLS4Qu0VwsH9wVFJlx4x0a0IdUUvHb1y9mt400FldczsOi8ViQ4IDIm6ktU6yTds/FBAElnEWO5rzo7z9Q+znZnBgakEbSaC0PwpsMXBm8YWZSeFY+9+DfSNTm9oGeSqn7ySTdA5Xk3wjPCg4BIsNiYxPrugdrMSeu69CqUi3Pc9djaiiyRQ7UnptJtnccE/vwjq0/ehWnXxuuDnzZkTo1hMNDIzL7RlbUjjZokUrm+ytTAoLDbYfY6Bv6O2ygWm6zgoBYF0ZqQ3xvJbex7Pe+XlkmK1K9PYLqCes2yAEABttrA7rGVnW2px2KyoUiw2NSJrgsPCpN3z9grqWZfLF1tjI4Mvnzpw+e8U/OCS5tI3LImSG+IUklrGkOsfrgEDm2Y48f++whqVN686fYi84e1IoxGoSUkZqS7Oi7e92cFBQXGpFDW5VoHYoBWI1cea7KgtTIkKx2BAsNjgoKDa1omaALdfaEARBLBurMy1FaRERYVvnc0hAYEhEXk0fU6q1e+2DFQoyKZfGB6oz48PDQ+2PEBTgF3ozvaKNIFAZIAQAAAtXBxJDAzPrehqqKpNuRIWFYoMCAqNvZ7WM05SGraAzApl5JEJH6e3QUGxwCBaLDU4urq3JvOlz7dJjKpRwNSc++NLlABxJaFcok0o0NdyRcyvafqQh2KDIW7ldBIpMt/XZhCFmTUJkVHpRW01DWWZiVERYSKBvUGhiyyiRuTTWWlcYHx0Zig3xCwhKKWqhCpTW7Z2a1eLp0c7cW1Hh2JAQLBYb6BeTXIifoMp0ZhgAPWeyMOOG15Xz35676O0fEJucs8SWWiBgVktmxnB5SbHbn9XAiITszjGSRGOCEABBkCO8ZLVa7dN2zgEnZz16wHSeIxD1g1YoxKIRzDQm+QVENk0wLFbr5jq58Gawb3BSP03m9FVuFK8N3Dx33jc4KiWrsmuEQCCMDXTXp0QEYxMKJ9c0AMAGObsvK9QzKLabyNsOTkIaKb0uMQh7u4au3JlauxeFspm0KxNNsUHYuPSqPgKBQCCMj410NhaHel33Ck8bYqoAADaLdmW6LuD8haCoxOzihsExwsT4CK65JNzPNyylhrppBQDANrOQPpUVFxQQk1KPHyYQxoYGWnMT40K8r1zy9Mvu5wAAIKuePt8QdM0vtZvteHHMOtl4Tcp1L9/MPg4AALIYmDOtcUEhMamV9uOZGB/Ft5aFeV+/HnK7n64EAMCQRcyazbkR5B+dXIcbJhDGhwfb8pJuYH2uXrrmnd7DBgAgkFW+vlSZERcQk1ze0ksgECbGx3o6axLDwxNya2c5yv2xlOuHCwLbNqn9EV6XfW+WcpQ2BLIxhgv8LnmldiyZnC7VsEVN7CkN975yI7t6aHR8YmK0s6EkOjoKe+Vb+0QeAploQ1Xely9EFoyqtz0BscinKxIuXPaqH2ebIXiTOXgbGxgSV9A1MUEgEAgTE8P9TTcDPM9eDatftP+GQ1SSofDTZ3yxMUnpFT2jBAJhYmSgOSHA81poxhR/6wplVq4158Zd9gvPLWsdIRAIhImhlhKsr39MfgffhACbnjbenhrlE55S0j88RiAQCITBhqLMMG+//FbCptEKAAA2PXmgMtLrYnRGxcDIOIEwjm8pj42NCb1y5vR9FMpmkuHyYy6d871VWNwxQCASicSlZYFit9xei3weVxETGZpY2Dg2Pk4gEAiE3vL0xIjwmw2jNL39l69FMddZgQ3yic+o6B8dnyAQCL1NaTGB/pHZc3wlhFgpA+Xe584mdq07aY1+qiTm4uVrlWMcG4QAYKUOVvicvxoQHF3c1js+MTEyMCkxijtuRVy+7NmxuKmXsAgjbTFe5771jG8dHJmnsvQWFSE/9MLVkI5FvmX7YW1GUc0t/6thhRSZEQ1C3c0eFAo2cReHi5JCgqKT6zt6x8YnCCN9VYW3/a/5pVf18RV6GEEAbOYtjuTE+QRE3a7v6Bm1b5Mb73kNW4KfkektesliVWpsaGRaQ8/A2MQEgUAYH8Pn3gy9cjUwu5usNtrAgxUKgTfIA8nh2LCbBW39w+MEAoEwMYCrjQvyuegZ0TrD0VsgAOANSk+M7zX/kOjknMrugZGJiYkBfO2NYF+fiMxxutRsQwBA1AJqVWqkf9iNksaukbGJ8fHu0pzUmEDPi+fPJzY8skIhWtFMX32E/1W/G1UkgdqKAMQsn8VXxcXdSCqo7xsaJRAIE+M9ZRlJsTfT6ocpMoMFAQCG6GVRQZ4+QTdvptS29Y+MEcZ7GhNCfQIj4pJu3corb+wbHp2YGK8vTPD1CczCk2R6KwAAsSjme2qjo6JvZZTh+4fHCYSJnuasxOiwmPSmKYbaZLOqhWTicHa03+XrYcVNnRPzS5tqA2RSEnvr4m/eSMyv7R20X0t6K7NT4m6mluFmVtY2BNvZTjqdzq5BOp1uxyvgaDD8gEAUBEE/fIWCTDIGISvaFxuftbyhQxDEpBKO1qZ6evpm1g+r7miPUbw2EHv2kl9c/jRNaIQAALBRKxxpzPD2xGb2sQEAsFnFmSwPvOaf3jJlsAd/bHrRcmekn39267R250TX3hTKrF9bHu3s7CcypfbzFIFtCgG17GbIFa/AwhEe2FYo33OX/RKrVzeUVhggiE0pXCmPD73uHVo7vwkAsOiVs21Zfn5R1QSq0gABgNjMyhVCd4z/5fPXHkWhrEYeZayzvXeOLrG/NggCqSX0qsTQy9d8cwbXAQBWo2ahM9vPJ7xijKzQ2wBAbBY1farvRuDlc1e3FMpm0i515QWGxDWMk7fWbSGwUSOcaS3w9vRLrxlToX2QnymQWUtozrx66UI6nmWGAUBgjWg5JfjyZWzG0qYjUgGr1mbSsFev+SZNcDZtEAIQWK/gz9Ymnvl2S6HA/9/eeb6ljnUP+w/9vdc151hAkSJFxYa9V+yKvQN67L33chR7b/TeSyAk2fv9QBHbOc48zzxzZib3R0l2AibhZq211waEW3tQwaPTUyrOjCiEEAKAaI8q+fQETvmJyQcAMD9sj0rH1o+V4R9rmM84LSqkfPmaLr0KHCmgUF+Ta/dv9d7AvYWaZluLKF9iy+YUgW3U212cOFp2z5JC7wgoOGZXfmvKi4lJ+nbp9BsvmnLZ8fzqjWtNaBq236Z9WGhMo7ILVh+tAEK3+rguM4FKz1++0flxACFAHDqZpCLq64cKBQlcd/N9vLUgKjqKwU0VCARZOXmNnZKJiYm5xTNHxJcH8rBYkETPqRefKiyhNJxXf3vUksdlZrScWv0AQuRhqZBH4+Q37l/rgr++ffar7R4OhVE3e+HDfJ9WqCha3uCDFQEAYl4vDo3jIYXCCPC2Fsp0OpBEiRP0bbt8wRvP87ggYNAK+rdtv9Tk81+CnysU5lANNRYkxHPbZw4NDi8BIMRRk+pitC4rkVeweCb3YgTmUA83FdBp3LbpA70DIQCAOGp6XKtIZvMLRVdqm1N7ujAxvrR9YUJC4X3CfTTXlZJApdcvGew++DOF0t7sTY9NbBzJHWjwn4i6VSO1hXQqtWrk0Or2hxUqNqVm7VTuRnEAIepWj9YVM6gJLbNndgQDBH4008pnJdeOrT+ZPTgBAPBqzjcrc5JifqpQdH5D9+DoxMRkBOP9zbnpHEZqgXT1xoZgAEL3/VJ1bnpl56jswRDMegOv9nJHmJ/OzRbtyy0oEVQoKjW9d3FPY/fhAALEOtuRx4z7yqscOrg3+jACQqA8nSviMxm1M3KTB0LoflipzU1Oq+zaOlW4Ax+C1357sFAqSEsjoHsqAAAgAElEQVQqGjzX2bH3aqE8j2v1hZnlrdLvt7pQZxaf9mqvNDOJyi4e2zp9Ur2ueXq77B2E0GAwBF71+T6cmxxIAv6NFQpzm0+mRWwmq0w0EZiATPicj7vfMlkJ6SWNl9pwSg7RPS7kxzHzOxbsSDBEgvmc51tSHpObLT6CEELgt6hkjWlMfmnvnd0HIUAdmv2BAnZqweKp5m0s/DMKBQDAfIjb7bTbAlj06ttFsSg/mUVl8AJJsWAUKp5dMHQazmkgdu2sqIjO5DYsPkFIuMx3A0VcXlH3nd0bGhp3Gh56K9Kp9N+hUBAADEU8bqfdGjwfg/Z+eaitkJ9IoSUKZ+8hJDy2R3Exh5PXfmMNfXqAcJvlg1WZ1KBCER67XFLCYea2nMp1thBWi+HpeDaPRU8ran50kM/tvw4AEKuyrYAVQ8td1we+UwHqNo3UC2Jj42oXgkFWQPhvV/vYcdGp9SvOiAyQV72UGRMVLicn/NbVxrRYGnfsuxoHEBB++fYwlxabWr/qBBBCiKNej8flsAWvcatVszfVX52XEvPla3L/WWBQm34p48tXZtNauDoCAPR0po0e9SW4DcB329hf4zNnr43Plw7AtbeHc1PTh0qX5nCcR4tiVc9oLVbbM5aHrQ76l7imNSUBCMXeN17cV3blnO35dgWYYT2HEvWhQkEIcD+ivZiZmZ6SdglSk1iJiRwOh06LZybm9cxu6Oy+gApdfKugUOIbR/cNZsvzNW/WznaVUKKYkgsPDoBiXhhHiasa2HBEJLP9HuXGzMz6hRYj0M8rVEb/ife5BusnCuVz3jdlJMQmt1zaAjEn7OpbIY2TNXeiQcks3mt+rlBO1XFVFjs+pUEWWS4NcOPhQBozsWHq0Ib4narTqmxOfEr9ocr+PEuDsJ6vryyt7+ltHszvQxCP0x569tv0Z2uTnfWFDEoMVTivt3vhTxN5fh+CRNxZFvXewlBVZhIlJrZcum+JUChu45LGFm7A4dkT13MT4sqH9iwulMCsY7XpDL5w5+E5ngR8xklRGSOO+hOFolATuUmhLGRKIiOBFh+fwGBlV4rG109MAbmEyPlIdRKP3z+3q9Kbnm8N/b20oZhB4w7vK51oUKHi+fUHD4Zgkg4Qp9ONPAazdubC5Alm/C2Kg+osLjW3/1JrJyCQLzakcTkt49tGpy/88WBO7VBTCYOWNi5TubC3CuW9mqxPTUrpntxQaI3h87m7krWVZcX8RmmZ3H/SWcJ6FODdCyWcp4tsRP6KQLDqb6tQALdp78TCjLh4RkH90G6g79fB/tqMpJgXR0/OHtm5DwWPEN3jQiEtsXxwM1yJhqPu6/0JPoebNSgL/MXrMK4OlvOS8sRHekiglqf9lix2VkXXo/Wdi+xzCkUgDtPZ96XhznaRSCQSNTc1Covz81JZtFcKlUznVc8+hvfzOg2rPWUMFrd+/hFC1KLdqWAmZLfNOp67NQCvQ7/QXkL/PYk8CIDXZb04XB7u7BCJRCJRS1OTsLggP42dEBtUKL/duF/FpGU2T9qfKzyAz21c7i6n0wMK5XeYvlfRoins9PrGZtEzLY11ZSlxVF526ZnuV5gK/i8FELj6dDKd9jWaU710cBi6LbbFjQXU6Ch2cY/CjkEICRw5GG1MiIkpnVFE7o1jj+2ciBl5ADcfSfj0uIqBNaefwH3OpZ6SuBh2z1HwsYL7vY8Xm+O9XaHLoLa0sDiHnxj9RqHS+o6ICLe5We5hxn5J6juBEALgGC+I+pJSffu+6PjPZtvoX3+jpJaKXtJQl0f77bcs6RlOoGdzHYyo33LHHl5+G6l6eB+Wk78AsRwf7G5sbKzMjrU01lYUpNCYKe0z524cQGiZKUuLjo5JLahuaYk8fnNpTkrMly/CZQNO+A57cmKpCV1Lt/73k2efT+RFFU08oM/f3j9RKALzbogr6LHs9n0NigPovm8X0FNKu+RmD5nFe8NPFQoYbzYLUxJoFVNax4vGYKhho4SdkNO5anD4jDdbRXw6rXxC80FLJwAI3ePR4oi4s61VJBKJRPXlpWVFOfz4mKhPKpQfcdxf703197QHn6+1FeUlGRxmTHRs2UuFEvTsGZ3hMnbfyXhzEjO+TLprdqG4/74zh8cpFz/qXwRVD4caefT40h8rFDOzc2RqZX19Y2NjfX2xr7GcS6fEJ+X0LV/Yn9sZ6GershhxCTlFFY3NkfdGQ0Eqjxob07pwZUWIgEJxivtu1NZgEBcQt8sdySx++8adNXghA6viQJjNpaa2H6utGPQeDhTxeCmjm+cvCvkx+1JvHYdGbV+8tiLgjUIZF+vzE+NpWQVltXUNNTU1jY2NDQ0NZWXFqSxazJffGqdOTW4cQhjZxeDdKFRkRdRHU/MCpVR/V4UiMO/T2VohL+5rVAydkxpu/JWZnsqOj4qiMAtbptTBj/5TCoWjnvuDWUESL6913YxYTue7UhJ5QvGO+73Sns8oFO513e2MFWWl8lg5LWKxWCweHhmdX1vvLE6Pf6NQwrmPFMpn1qwWU+mF3UvOCIXyuYyrveUM5u+qhUKevk+V5KRyGdnNYrFYLB76NjK/sdVbLogLKhRqM2yUUGl5HfORuoZ6zJuDVQxGQKFQu3GzJDqGlVHS0z8ofolEIp2cX9HY//p+If9acMy+2poW89uXL/EcgSB4UwgEglQuM/rrF0oCf+pQg0FI4O5tSS0tKqZ2JTLZ/7apASDc6uEyVmJBx5Pdi9ieWnKYrNy+R0/gOQjstxvVRaksSlr9YOACkMztHk91lFF/qlArkQplFGdEfcmoV5rfLd5EZeNNtN9+45W2i99jWqYigE822ZLw5bfyOc3Lb6MfNTVQyWamFra1zhfflITPrVEpbmVLxcnx8fzmMxsGoGEklx8TQymu73p9xYvFYrF49dpGAPdWa1ZMHL1v47kC/SV/lkJBSGiPZ9MTqcnVC0afV73Tx6MlCMVbDh8Zg3rLTxWK0F0u5yfRaHVLJueLDA5q3CjhBBTKq7tczU9KoNUtGD/oQIvpz/uaipIY/PLWzn6xWCwWT64drk118RPi4j6jUIDQnK02VuVw4tNr27sHxGKJVLq8uyOuKqRTqeW/Q6EuRGmclOoRucEZcYjf0dQgGLsCfqP8XFKfx+Hxi0TD10ozFry4VKNFmayExIr61v6B1/eFRCLdudJ50KBC8Ssl99rQBNUfKVTbsdqKQed2ZyGHlzq1cxU5uQ9i9uWAQi1cW95RKM1URW4ijVlc3VTX0NTU1NTW1tbW1tbU1NTd3S2WSDbP1YH7hiCIcCzqo5rxzwSidDrd31WhULfl+2wbl8HKruuffMmwuLcoJY6VVj5374AQflKhAIGZnk4b81N4GdUrF7dDdbmJydnjJ9Z3H0OfUSiPVTPVmMrglwzPH+o9Ho/HgyBui+5hoCLj9yiU36Y/qOUxMpsmI+b+AMSumW4ppP0wCuV16OZaixLoQYXyOgzzLWkJSYWSmQNd8Hw8NqNiSJgdUijMYTqq5yWk1Y2aPVjE+ejn2otpwXJyzGk+rmPHJVeJlWa75w2I1/dXL5zwLwYQiG63MjGGkV4i+faiiGFifKyzjBcbTa3oX3X6AYF7j6daGbExBSM3Ec8ngPtumpgv+kIBArtfqmfQBTNXRuP1THoCs37hNpggJPxH/ZkxCfw2ybrKHbwAvF7n+kAl5fcplGemNPYLt/xM54y43YBNcTb5TTK9c3e80MWI/i2jV+Z6e8F5PF4UhxC7Wu5hxXzJHLx4Uf5DPLUlfjgj70wiSGDlL9wb3roGgViHa1K+RmUsalEC2BeF6THUhP61O6f7nRPwYQSE/hNxfiyV1jp7EakuOOrcmx8eXji2Y97TtwoFrHPCzFjq71Kox4bU132hUNN1Uy6Xxirce3garc2KZ3DHZXpyLt57/DwKZb7bKU6lxxcNK6zIi3ndN6MZLFrRwLbJiZrvd0vSGLTCoSeLJ2IbXHU4Nz45f6MxP8zXJXG4lS2j51qTM3iVorfbkjRG3GeiUAD3bQyUsnhZrYMrDyary+PxIAiKGKebyxi/T6EUfYXJiUW9t1rbcysN4A4k+34ShXpZTg4Iv+52vTU3hUbniEa2dMFEnnmpLpvNTZ/aOjfb396dCOrHAYB/SKHQ06HSJG7y0OqJI7JVhNc01lbBjI/v3Xiw+SAgLBP1AkZSWKEsay0FPA5/ZPXo5lFxf39/f3//+Pgol8uDt6ofD38MCIL8uGacIIhwpOqjfuUWi+VvqlC4XX/VX5bKza5duX3tMIhdv9xfwmBwysXfHX74SYWCEHht2rWBKlYit7x1tCyXn1U3onhdqh86/M8VirDrr1oz45MrxGp38DIFOKq736tMY1F+h0IBj0050ZDJFtRty4OHAgRmVp415XIpz+XkntvDb/wEVqHkxB86mF1311mcTE0IKBThMt93CuI4xb2K0K8rQPhNCllNZmIokQe8Ts1MUyYrXbj5aA0fy6q5FOXzKMFaKIA4NOO1yYzUqsVr/fPbBQTqMJyfnlzc3LvIPN5fBIE5T0eq6RRatWTT9bK9BCAw09mIID6KmdN0aUAAgelPZ9IZVE6JRBPq7gIAqj8fSYuKetFaEwCHcreQQ88b2NgazKfzSneVjuDhcNtIXlRUUtWFIXyfANSl6C3hf/09CgUBOP+WHRPL69h8bvUEcN/+aD0thiqcudecz2fQYxJyeh9soXJACCGEqPlRJpPdGzwAAMvNShaLSs/tVTx/nWDmm0lB9NePaqH0u10sCq2oZ/LJ9jpwhFof2gs5X5jCU7sfQOx+vp5BoZb2rtiQiKc5gRkU1zKZTGnDAYSmvQ4WhZLTPGl0P3832x5X8xOpGa0rVtR7udLLjo3KHjhFQnVOPut1i4ATRaF1r35WoVCPvj37TWtNzHU0XEWj0UX9w/kpDG5p34P1g3Tiv52f10Ih+qvGguR4dtHSpe7Zhv3205FqJpPXvXzm8GKI4aapMCWeXbR4oQ2X7Pvt95LSZG562c7tw0pzKp2dMSd7QEJrTQLcutZfzaLGUD6hULjfMlyZFJ/eeKK2YOGWr8ar1pJMauzvSOQB3L0+UJGYVDR+KA93DkOdyuHaAjqF8vtn5LmfNiZKUumJqeVDu/dOHwah/26+KZ3La/i2bnBE5DQxr+rp9uT4SGXx+Ik/plDQuN+bk8wp7Z1XW54/H4/2UlQuiOMUL1/oEBwC4J1vzWalhBXK/7jclpXEqxUvy/U2tTooQBajTiO/Pzk+UprckYt//rRmPJzvs9tf94YM4HQ6/54KhTlVspEMFquka8HoedNGDPU8HM4JOHROTv2+2vdphYLA71YeT2YzEhJYGUnp2V2byo/m539GoRzG294CZkJG9eSRGkIIMZ/jcb+ntZJFiYpN4NZNXmKfUiiIeV3nq4N8dmJJ1/iVzgsh4XXp1sQNXFp0eEYegfnkZ8tZLCqnsH3nyQYhRBHnwXRbGis2JqRQbuuTuIgRn1o2dqgMfAQuxUF/h5BNjY6OZ1WOnGMQ4qjnelPKZzGL2kcutF4Igc9j2Bhq5NGin2fkoZ7LtUE+i5FR07v9/cELIQSE127YnuwqKipukay8VzxG8ucDCL/luknAojKT58/Mb75BAe7VzdWmfI3jdm4qCAD8NrmkjE1JSG6bPXR5MQBw48Nhb0VqzJevr7qT+z3Gb3WC+KT8guT49JphfUi5CNy+UMX4Qk/rWr0BAEAICNPV6FBrKi32ty9fk1p3A7P4fq5QENruVvO58YyCpsX9p8DlYzxbKBckfk0SHutRv0M1XMGJprDreuYeQ09qj1I22lWdVSBcvbMCAAm3bqQqKZbKaZrYtXv8EBI21emgMIPy8Yw8n/W2tzKDxuDV9Ux/v9SEv1ER1fH4YCMvnlUk3nTgBITQqz9tyaDQkvP6h7Z0oRyG5Xqto74sq7TtxOgHAGKW675iTjwvu3fq0I7hEEJEfSJtyYmjp48fqjACV3wfS06Ioue0HMhtBACE33cw1ZJMj/0S+zsUyo/YewqoUfS6M6c30pF96qU8egKXx6fF0euXHpF3l48l+YRCET7rtrQ2MYGR1zR8pbFiBIA++/HGeEUGOzG9cu9ej+KA8Nm2pXWJdEZe09Cl2oIRAHNbdqbbUpkJuU2jSrNZ1l/IZLCrpRvmQJrYoVhfkhbzWTFfv8QWjyqsHvBDhSIw22RDJo2T1bl0HugJiZuuZ6SiFBbt69fo4r4No9MHPqFQEBBK2WxeCjejumPlVIWgOCDcJ0vivGRGdHT0H2lqgFhWJFUcWgKnqHH/wYLi0KM7bS9K5maV9EnXVXYPDiEEQHex0dFQmVfRcfBk8f1RhfJbrsU12VxBcff4nt7hJSAE1vv5IRE/kZPVuhCI/6Gob6E9i8nMnTl7CpT+eQ0XPeVpPEFR1+DK8YNKodFoNJqrneme5uq88tadO2Pk+m8/TdWFOxd8FIj6my7wQiDm+6XWHCYva2j77p1ejgCzqq86StISmMmd0+cI8VmFghB36i+lhawv0fFJBSKZ4cO2WkGFolESUkp7pC8ZGp5cXNdYvajb+n1KxOeyeYUNUqlUKu7vaSrPys4uzU2Np7EqOjdd4FMKBQjMqrkZrMtNSU4uauiVSiX9fa2lOemZSaz4UCIPELhVe9tTkcmiMzMr26TSIfGAuKkqKzeNF8cIJvL8iONorj2Vm8jJr5dKpVLxQG9zhSA7uyw/PT6eXixadQAICNyuu5c25CUn8Qrqe6VSyUB/W2lOuiCZHRfuC0UQDoN8rK04KYmXkVHRK5VKJZK+zta8TH5qQfPyiYJc/vQvAeCocm+El0DlZYkeXO/8DwDh1xwOsmNiOEXfVCgAuF9zsthYwE5ML+jqHZRKxK315WlFZXmM1woFCPRqsZtJjY6l0rsWLtDniXW4Yl+axaXTMislEqlUKpW0C9MzMytLC2mUKHb+iAnATyoU7nNujzTxk9lJGVX9UqlUKhWV8BNTctoXz1ACQkDoz1ebC9ksJr+yI3jD9QhzOUkppa3jCrsXQAgBob9YExWxWam5HT0DUqmko7EyrbisgPlhFAoCv+Zmo0GQxktKyS2u7ZcE7+CemoLklJSCyr5Tgz3U3Ra73x4py+awEjIbB8WBzVrL0jn8HNHotjkQrACY9nihPIfL4hV0DIqlUmlPbT43Kam4bVJr9wII3caLjqJMRgItX9gmlkglYml9XWkpnxFFoX0+kYf7XGP1fEpsUk3fwNTagQ0JxUkI01QZOzb6axSrfEfjJpN4HxBQqFhedmV3/+CrJ7d0+djhQQEg3OoLSX12UkpaVVP7oFgi7WvPzUrjcQU9M/tGlw8ACCFwqy+lDdnJKamVjW0DYslgV2uegM/Lqp4/knv8uPVutS4vhZFa0N7dJ5VKpd2NeTmZxaWVPGYcldtyanBgP66FIrDrjaHCNA5dUNnVOyiVSsXtwrzCYmFhWkIcJaduQmnzEJ9RKAi9dv2SuE6QxhOU1Pf2iyWS7srSggI+O44S+wcUCkJgutupzUuhUKjCvlW1DcFx/9XmaEVBKoeZWdfRMyiVSiWSxvKclPQC0cim2o4Q8A8qFATY0+G8sDiTk1LQ1NkrkUolreXpfH5uZcfKuVpnsup0Oo1aNdORnxATl1pc3iEeuVUZMBy73Z0SFqVzGBmVTW2NLS0tLS0lWckp6XlN0jWF5cWt8Zma8R8Hov6eCgX8Tv31TFdzR//otc7x3q8tgLotJ8sjTY0t32b27Bhq0x9Jm1pHNi7DQVcC86pv97va2/s3HiL3xF2G0+HC6Hh2ed+K1fdREAoSmE9zf9DdWF1dXS18RU1dW//IvcENCMxueFwd662rFQqFQmFtQ8vA5N7+97OdOVFzy9DUdycOcQxRXq93NrdPyMJJMeBH7GcrIy2i9umj4B9xv1d3I1sa6Q4cra6xWTI1P1iTx2ByW1ZUgb0w1CM/3Rvrrq+uFgqFtY3N/fM7Wxszw82itkmZDkIIAO40K9Yn+utra4RCobC2vql/fHdv/2J/qbW5WTy2a8eDb01/d7w82hN4Y3UNTZKpBUl9IYOR2LAUnL1F4H6r6nJtaaQt9PZr6xp6hme2T5Qf9tAg+ZMhMO/19mRTXa14/uoD9wce28O31vrauv5zR8A6cPXp8lBva41QKBTWiHqkS0dnqz01tQNz5sh0LAAuxVFnS21dS8ep5sXYfsRysDDcVF8TvPY7hze2d+/Ov3e21Ik65o0YhBC4bae9QmHP2uPz9wTANWerojph59pTeCiPSbG3NdUZuo3qGjqmN07MyPNp6C5XxyXdteEbrbppeGHrVmOLfALoLlZH+tsDZ9PcObBwfLHRWyPsmdTbX2QAI0Dksv3VpemOhohbuLp9fGXj/MHgj+xE6vfdHC2JRU01oa1q69sm12QG1/OMawJDb4+WJK3NNaEzlM6tXyktofoLr+L4YLy7rib4BnsXD4/2J3rrGppXznU4ASDEFSfLrbU1Q9/1EQuzOPaH+xoaW/Ye7DgBAO5/PFhoa64TCoVtQ/MGx/M5KmbKqDGxqc0LJu8nlkP8l4I+bI63NtYK3z63hUKhZN0cmltgeThYmpI019cFXmnoki6u7GtfluhbHg6Wp8Pb1HZKxpf37xyBjpaE53ZvqaetsSbwzxb1zS2unF9cjA52NDYOX5lcGIC4Xz7dKeqa3De/nNAQwOvQHy6NtDTWhe6soaXtw8ejpe625t5vazoHQkBgkh8OtjX3r95GTKDG5PuznaLGka2b8JImbt3d97Xx9sBdWlMzML26MTXU1tzwbfPa8e6iT4Rta7SrqWP8ymDD3swVJHyOg8URUUNdW//0o8GBA+j32C+P14baW+pCH2RDS9fkikznCAo+INRL/Z3dY5taqyecqNecLnWKuhcvtO7Q1eoy3U8MtDd0Lz6aXcHmcIjj+nRjuKOlPjRyl2Rq8/j+QRnO0anPtmdFdRX5ebnFVfUre2dGiw3zOm9ON4Y7RfVCYX5+fm5ublFJ9dD0ltrmxt+8nZ8GogLT7gLdON/O3fubKhThRxw6pVKjN/k+iFcDAkccZqVSoTWYUZzwow6dUqW3RqyBAAivx65RqbRWT+SOhNt0NVlFT86Z/P70g1g4AITP49Ao5O+i0uoDqxQBAvc5LcrAZgqVxuKBgPB77CqVSmcINNIkvG6rWqk2RMzsIHDMZdErVWqjA4UQoojram9uZfvEZNEFxleqVDqdcqQul5mYPHTsfD4rHHOZVMGDqS1eIjCO6nnaCCB8rvD5KNUWNwQEhthVKqVWb/ET0O/z3OzNLW0dGy364LGUSr1BM96Yz2ByxTJn5GeAYy5d6C0rlCqzAyGTB38hgMAdZp1CrjC6PpwRCXC/WaeUyxVW7/OfnObgv1FrsmO436KRy7WmVytVAb9bo1IqVZq3q7PjXqdaGboODA4IIPB7NCqlUmUIpJpwv1Mjl2teLKEIAveF+vW6il5jaKTw7pF7eeymiHtO7XxHFQiXRR/YRmOwYgRm1crlGgP6w8QWgfsMqsg7WP9BPwDMplWHN1Io9cg7rSsxmy78YIhYECSE26QMvUGzD+Aus1ahUFpCsQ3EaVHJ5Tq7L+JRj9n1WoVCZfcED0agHp1GKZfLlVqjL6Lrr365hspK+7b3hJITOj6E8FgNKqX8fXRWf8R1gnrsmuCzUq4y2t+s3QYhhCgS3kZhtHsiVyQkMK9Rpw7ur7WgGA5x1GzQKpVapw8DAAKAGNUqtdHu/+DixBGbJnRrKQwOP05A1KXVqDQ6s9ePAwhRxKFVKbUWDxbRCw2xm9Qqpd7qjjwZ4HfpQ0NZ3T637Z1tngGYzaBWqg1u9N3WrMBrN6uVCoVa60LQ0IXqt+u04c9VpTUhkfsCr1mr1hisvohCJJ/TrFZpzK5nK8VRj0GrVmjMyIupEH67/nnkR7VBEWwwrrHb7T6fz4e41IoHmexw/0B2c/+kUgfCRX67QauUy6+vr/f29g5kJ3KV5v287edqxi0Wy7thqr+nQv1pAOC3a05HKtPTS5uv9b/KormI3TArSk/Jadh8NAUemASO6u8O6nKTOOnlO7r/5g9Or9O82JqeJKhZvzcGjgVwv/HxqDE/OZFfvKUlf9ySkPyKYF71TFUqt6DlRuciC8lJ/pH4fL6A65hMJr//9Y+5yFZPkeXh/3nN+LuNowKQChUEYD67+uZgf2ta0pTNTe+Y3nf8MjXRfsR+NNPKY3ELGweW92QymWx/Z1PaVpkqyOsc2zX9V88T87rO5tuTmOz8+r7lXZlMJtvf3R7uqErNzGn/tmUks3QkJL8Ybv3t8ZFsfVqUkcBpndh9ro4iIflnEZaht/4UICxDkUm38IJ3f7hm/AeQChWEQGzy9d7MjIy0VEFt/9yN8RfKSQHcb9XcTIpFhUksXrpAIBAIMrOyc8rFiztv8iD/8bEIzK67m5a2RR4rK6t0YGFL9X7bQxISkr8S8/fBgrycFBa7pH3sSut8W+1BQvIPAEXRgOVYrdaPtnm3YeZ/XjP+A0iFCuFHbA/fx8YmZha2bo2/3HwWQGBum+5sfWZsbGxsbGxiYnpj78aO/ilFo4DA3Q79+fps4FjjE1Pr21c21E8+mUlIfkG8KtnU5PjY2MKFzkU2gyL5u4PjOIqib6NB4bpvl+uDbo0QwoiGmSaT6e2+HwWiAn5mMBh+PPhbSIUiISEhISEh+SvBcdzpdIbDRQGh8XieJ3t9UqHeLQ+PDER9lKr7qFLqp5AKRUJCQkJCQvLX4PF4IuUpknBmLaxQTqfzx6NZrdZXuTz4H6TqfgqpUCQkJCQkJCR/AZEz6QJ9ChAEsVgs4T8GYlHhWqjIDN27vBuv+k9qxn8MqVAkJCQkJCQkf5w/5iU/6FOAIIhOp4vM5YUd6KMZeQE+SvmFXS1yzP8cUqFISEhISEhI/ggoigZyZx/Nd/sBP+5T8KohU/bwnEAAABF+SURBVNiBfjApD0Yo1CtV8vv9drv9vxuCgqRCkZCQkJCQfBpg014vT0+OjozOr8vMLt/beZCA8D/I1qbGR0fHJ660bv+v0yPnT8DpdP6xMqPw2ikfKBHhdRjPT291dndgnZnIZNwPdC2sZf91W3oXUqFISEhISEg+Cf4kG89kxH/97Qs9rfL7gwF90wUHdyv6y/nU6C9RMZSRA8PbZZH+7kTayR8uMwo3IHh/kh1wHc2LS8s7dx91YUuNbJ75buAq3Ejzp1Xn/y1IhSIhISEhIfkkQYWKio+Pi08e2rpyvVmQ3nE9kceNj/ryW1QMZeRA/49RKIIgXC6XwWB41WDpj813+3GfAkCYRoUZdF7F+q0mrFCR7Ql0Ol3knDscx8OnYTKZfrAqy38XUqFISEhISEg+SVChYrLLchKZxb3Leof3RRiKcMvEJWncxPj4uOhYaqRCEX6vw26zhrA7XS9WLwZ+t8Pu8qA4QXjdDpvNarVaHU7P28WAfzJO8DR9Toc9sIHLi2F+1OWw21xe/MVoBOpxhkayuRCUeNFDGfM47A4XguEEirjsNpvZbL6+eQgs9Iv6PM7ASdgcHsSnVr8KREWObHV6fATxcmSnw2C2KVXqp/sb+dOj1Wq1O9z+0MkRmM9hfxwsT03gFM8cXmnNVpvD6XS5IIR+vz+yA4JOp7NYLCaTKfyXd1fQ+/MgFYqEhISEhOSTBBWKWjncX5PFy6nbvrdE5vL85tO2/KTy6oas9CRKXFxIoYDLrD7ZnBvo6+4I0Ts4vPb9xoqggZ1xTLM2LJ7ZODg5lM2P9nd3dXR0dPRLxnavVB40HOgCbovmdGt+sK8nYpyh1f1riwcNaxTqttzJ1qQDvZ0dHR0dHcNzm/uH3yeGBnoXz6zuYBURgXrk92fL4+LersAwndKp1Sul2YcFhyEI7eaodHhx8+xAtjY13Nvd2dHR0dY1tLR7cn2ys7kyIenr6ezo6OgZmN88vVXpVKGQEoEiiofzlQlJaOQOycTypcIYHhkQ+q3x4YmFjfnZeXFnU31NdUdHR+/gyNbZk9PrBxB6tefTI105vIQYKju/sqampWv76FpnCLYz8Pv9kc4UidPp/J/FnwKQCkVCQkJCQvJJggoVJ5zdnO5O43DKx8/sCBZ61few0p/BSZXMLFcVpseFFIrAjRtDHYVpOeWitq7evr6+vp5uYRqLxc+qHJcpA/KDoWeNKYn8rIKi3IqWjq7evr6e7ppMNje7ovtAYQ1YGoGbtka6itJzyltau3p7+/r6erpr0hNZfEHF2IHcheIQQkDgN9ujdYV8Xl61qKO7r6+pLCc/v6CATaNQqqZVZg+EEAJCfbYqqi1OySlvbe/q6+vr7anNScuqapLIlDZf4FjYZWsGLzEtuzQnt1HU1d3b31Obm8jiZZXV94qqhfUtHV09vb09RZmclMyS8e9Pdwq1RqPRabXqs7W2+pKUnDJRW2dfX19vb11uWlZlo/hAbgmOjF93ZCWnZuSkJWeXVFTX1NW1t1dlcXlZJW3bd0YvBry6q/mJvvxkemwct7SuublzYO/4WqHSRP4bfD6f0+m0WCwWi8VqtXo8nv9N/fgrSIUiISEhISH5JEGFiq9duD3drBRw6Dn9NyZ3MH2F6L7VF7DTmw7PTxrKBGGFcqnWG/NzioWSI7XRiSAIgrhdisnWMiaVktyxaXSiMKRQVEpiWcvImcri8iAel2K6rSwxnl0zc2lDcAihW73RXJRbXC2WqQyBcTwuxUx7RWIcJaltXW/3QQj91tvustTknNLhjWuz3Y0ghuPF0coMNiX6S0xlUKEw252kPi8tv6J7/shgcSII4nGr1oY6MnkpJd0rchtChBSKGs0obOjavdXbXYhbeSwqToqnxiaklEiXjnRWp8fjPpgRpbHiM7u3r550Go1Gcb3dX52dnlfeOXuoMzsQBPF41BvfurKS+MWdi48WDx5SqPhYZnZl19zOyfX9g1J5utRXm0RnV4zKDC4/IDAfoh6qSkvgli6ePd4plEqVWqfT/YX/9Y8gFYqEhISEhOSTPCuUTvM4XJ9Hp6WPH6sRDEAIHIrDyqzU/N5tvfq2pfxZodya8+3NzXN5OJnlNz9dzEvqOfEUqnBWZ/PCkEIlpNbuPZhDmUFCIZvMYtMSm1YDeuTRXuxsbp49GbzBTgmYWX65ONTIo1Fiq2Y0FgRCTL3ZlcFNahzbNrt8gVEA4d4dqefSYmODCoWpt7ozk1NE47tmpy+cg/RaHnqqchISC1eujV48qFAUZtHSpcYbOB8C35WUsWlxOV0bKrsPJwiCwI33m2VpiZSi4Su1Ra1RHE3U8ej05pEtY0SJmM/21F+TR0/MX7zQIXhQoejJlSvnarlKq9FoNBr149F0MZ/FqJ2Vmzwwopx89Vr1pFL/tB3UXwWpUCQkJCQkJJ/kWaGMdvvljIjHTKge3Da5UQDw+21pWkrh2InaY3oSRSgUhBBCn+pctrq0OD8/Pz8/2V1TnJmSGBv1lfJSoXhVI0qTK1TVDfTXa4UpjDjhrNYann2Gqi+O1sLj1JYI+GxK1NeQQllWG3PZvKzFo0fkuSEVoT6by0uiU4OJPMtaUx6Tnihs7Zucnp0PMzNak5sWT6H1bTw4fCCgUMy87iu1FQ+cECDOZ1t4DG7L6q3CYNXpdC6X0/y0XylgUwU9Fzq71nAzUsaPjYoprW+beDlybX46jRLfvXJr8xIBhUoqHbjV2BzOwLw89eX36fKMRGr56KPBBSMUaubwOqBQkfPvfh1IhSIhISEhIfkkEQrl8HoeV0pTWBmlXbcGJ4Z5VnqKUssHrg0O3CaPVCjC5zrfnWwqzElN5fNTU1NT+TkVzY3CQiY15lUUKqVmXG12hxXKcLtZzGfEhxQKoO6L/emW4tzwONkVzY01RYlxsSGFUn7LS+Ok5G9falAsHAYCpvvt0nRWXFChlCMF6QkxFBaHFxglBD+Zx+VwuX2rt3YEDyhUSuXQo95BhMJZVwttPGZK69rNtVyl0Wh0Oq3xYbdSwKamdZxpbS7kvjOd/fX//i+WGv/OyBxu99KV1YMHFIpfIbnT2gkATSaTRqO+3J/J48VFF0nCCvWtKj2Wnv9tU/akUr9qo/DrQCoUCQkJCQnJJ4lUKB9EdbP1AnZK/tqF2mU4a8pLrR/dtrhR8FKhbJeLFVmczNzK/onpxeXl5eXl/Vv91c63TGZ83O9RKPv1SlUOLyOnon9iemF5eXl5ee9Gd703mpWYQAkqlHaiJJ2dnLd5rgrPgIMQGG7Xi/nMkEJpJ8symAxuc8/Q/MLS8itWVi6VVh8WjEKlVL2jUJ3bj0+6wJw4teJiNaxQONQN5PJioijF1c3jk9NvRz6Xm71+4pVCEQRhMhkv92dyudT/J2j/fvFosVjMptv2XNbXuKxvmzKNwfg/nmf3eUiFIiEhISEh+SQvFQri2u1OPovbNn98vdKcJShcPFEgGAHtkQqFngzms7ip4rkDU7j1AMCvVrqT6NTfE4VCz6RFbC5/YGbf6PaFx7lZ70thxoWiUC5ZXwmHkz6xd+0Ot0IAxOP+t0w2jRKshXLvtOewE1PHd69cKPb6/YX4sULp7e6AQl0fzEUolHu9NYsam9A6uvKk+bD6+5VCQQgJAn88XQ4o1M7JrUajUatuekvY0bSs2aMbBPsLptp9ElKhSEhISEhIPskrhYJ+83FjFie1vqe7gJtX2X2rd+IAvlQo50ZLJp2dNrZz7fZhEEKI++yWh9H6PFpsVGzltNaGwE8plHOrLZvJTh3ZvHCFx7E+jjcWJFCiYyqmVBYPhMB2NpafzC3vm30wOnECQEj4nLr5zmJmXHRoRh7Q7Q/kJbEL2sev5UZfqKEl6jDIdtdm55bu9C4/AX3IaX0yi1XQdXSjcLk9BEFEKpQdJQwGg0ajPt+dKkljhBQKaL+LU+nUlPK21Z0TpydYUY46jcd767NzSzdaJ4q/o1AQAqvioDIz8Wt+v+xGabFYzCbjTEsGK6lk9UbtfbsM4S8DqVAkJCQkJCSf5LVCAdy5PliVmMzhxlIbpHtmjx/AVwqF3q90Z/HY+Q19a9t7sqOjo+3Fwf66goxMOiWaIhi4NbuIz0WhHtZ6c5LZefU9q1uBcZbEA/WFmQI6NSY2s+/a6MQhJDzqyY5yviC/bWhh9/vh0dH3xdGu4qyUgK4FmhoQHs1st5CXmlXXOLC8vXd4dHQkk62MdWdlCvKEHdvXOo3epFKslrPiErJbdo6vVWqNyWQicCxSoRAECShULpcaUigIEO1YWzmNyckrqhudmT88Ojo6kq1O9OUKBLlVbd8fLb6PFUqYzY0oJyc2+gvZiRkdEwsHFzfW95Zz/hUgFYqEhISEhOSTvFYoCAnV8WwOlxYbmzp9pkMCRdwvFAqidvmyRJSakpyWniEQCARFla0dXVNTE4WZnDh6xa7SioJP1UKhDsXqUFsaPyUtPV0gEAgKK0XtXZNTk8UCbhy9fEtuQQGEEBgej6a7q5L46WkZmQJBemF1S3tXazqbRg231oTArLiYG2/PY/P4qemZAoEgU5CZkS1sG1rYO79XKNUazSuF0mg0Vos5UqEghAaD/nx3KpsdG5MiCihUYGRxd3UKJZ7OYAbOMyMju7Z9ePdS5UYx8F4i761CQQAedkYL05O4/NS8qibZnT6iOv4XglQoEhISEhKSTwKsmsv5sZGRrbtgVg5CxKJemxsbGdlQOb3Bsh2vbX99fmRk5Fzt8uMQQuC1ajaXpoaHpBKJRLKwrzfbUZd5b31+ZHTxwezBACRw/e7MxMzWpd2DhmXBZZKvzoyPbN04kUBrBOC1areWZ4LjzO9pTTafy/J9Y2FkZOHO6MYA9CMOm9ViV1/OT49LpRKJRLJ2rr6WzRckM3gtq1qbN/g2AIGixuPFmZHARhLJ6PT64fltYAk8g8Hgdsm3p8YmVo5UenNoBTy1+nJ7anzmUGEJdIpyuVz3lwcjA93d0mW90xtewMVsflyU9re3tHR2dkokkom5TbnBHl7IDxDGg4XpmfVTs9MbXpQPsak3F6a+rV9YXMElaPwu0/eN+W/D0m+T8w9aqx8nFYqEhISEhITkT8N0vjgsHdq5UiIR5eQ3m/3pLGbFxIXZ835pNo7jgeV7dTqdx+N59arLFejepHnVXIAgiPCivyiKRo4WXrfuL1l35X8GqVAkJCQkJCT/EMyHfZkcVl5Nv0xlQwkAIbTc7w/WZXHSSmfPdJ4P0mF2uz1gPD6f7+2rH6kS/NiuwgPa7fb/3pv75SAVioSEhISE5B8CZruVNhQlJfJKWwdGxqempqa6KgWpGRkto1t6OwI+yIYFdMdkMr37qsfjCUeVXi20QhDEuwGnnwainE6n1Wr9ZRs+fRJSoUhISEhISP4pAEJ3dzAt6ayvqa6srKysrKyqbh1e2FQaHfjHs9rejSRBCAmCsFqtmpe8UqKPAk7hHV0u16thURT96KW/F6RCkZCQkJCQ/JMAiN2kVinkcrlcLlcoDFY3YrFaA8k4g8Hwttrp3QiTz+cL5+/sdvtHqvRRwCngSTqd7q0nEQRhsVgMBsPfvVKKVCgSEhISEpJ/LGH1ieSVBnk8nkibCShOeOOAcv0gN/eRXSEI8ndP1f0YUqFISEhISEj+mUT6k8lkirSodyvHIYR+vz8cfDIYDH6/P/xSeIRXquT3+wN/1+l0/2xnegWpUCQkJCQkJP9AwiVHTqczEDeKrG0yGAxvd4n0J6fT+cqHIkNTrwJRgZcsFkukcv3jIRWKhISEhITkbw9BEB6Px2q1Wq1WBEFgKAT1qhQpskNBYLNIDAbDRy/Blwr1qnDK7/e/6nfwb4BUKBISEhISkl+Rz0d0wv2ZItN2BoPh3cwagiDvBqJ8Pt+7ehQg7F5hA3tblv5vg1QoEhISEhKSX45ATu0zpUXvFowHeNunIMC7rTLDHvZur4HAqxaLJdwmym63/6sqn97y/wHYptX5iOtfpwAAAABJRU5ErkJgggA=" width="640" /><br /><div><div><br /><div><br />Patching a deployment database:<br /><ul style="text-align: left;"><li>Use UI Cloud Interface from Oracle cloud DB Service console or use the command line utility : dbaascli</li></ul></div><div style="text-align: left;">Backup and Recovery of deployment database:</div><div style="text-align: left;"><ul style="text-align: left;"><li>bkup_api Automated backup service level</li><li>dbaascli Automated recovery service level&nbsp;</li></ul></div><div style="text-align: left;">For more information about Features, Overview and pricing of Oracle Cloud Database services, visit : <a href="https://cloud.oracle.com/en_US/database">https://cloud.oracle.com/en_US/database</a><br /><br /></div><div style="text-align: left;">I will be blogging about each topic separately in the coming posts.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">Stay tuned.</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div></div></div></div> The Human Fly tag:blogger.com,1999:blog-19771507.post-6332790641559690721 Thu Jan 18 2018 04:05:00 GMT-0500 (EST) Custom Confirm Dialog Button Labels http://max-tremblay.blogspot.com/2018/01/custom-confirm-dialog-button-labels.html Some time ago, someone on the apex.world Slack channel asked a question about the APEX confirm dialog. The question was if it was possible to change the labels of the confirm dialog buttons from "Cancel/Ok" to "No/Yes".<br /><br />If we look at the <a href="https://docs.oracle.com/database/apex-5.1/AEAPI/JavaScript-APIs.htm#AEAPI266" target="_blank">JavaScript APIs</a> documentation&nbsp;we can see that there are three different ways that we can display a confirmation dialog:<br /><ul><li>apex.confirm</li><li>apex.page.confirm</li><li>apex.message.confirm</li></ul><blockquote class="tr_bq" style="background-color: rgba(0 , 0 , 0 , 0.2); border-radius: 30px; padding: 30px;"><u>Note</u><br />The confirm function from the page namespace is different from the one in the confirm namespace. They both render the same confirmation dialog though.<br /><br /><i>apex.confirm</i>: Alias for the apex.page.confirm function.<br /><br /><i>apex.page.confirm</i>: Displays a confirmation dialog showing a message (pMessage) and OK and Cancel buttons. Depending on the user's choice, submits the page setting the request value to pRequest, or does not submit the page.<br /><br /><i>apex.message.confirm</i>: Displays a confirmation dialog showing a message (pMessage), and OK and Cancel buttons. The callback function passed as the pCallback parameter is called when the dialog is closed, and passes true if OK is pressed and false otherwise.</blockquote><br />The following JavaScript code:<br /><blockquote class="tr_bq"><pre class="line-numbers"><code class="language-javascript">apex.message.confirm( "Are you sure?", function( okPressed ) {<br />&nbsp; &nbsp; console.log(okPressed ? 'Ok' : 'Cancel');<br />});</code></pre></blockquote><br />Would display this dialog:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-eBVyM7xfSJM/WlEszXvEomI/AAAAAAAABik/8iA_OODNABApVy_AyJYHEG27Vu2mSYbRwCLcBGAs/s1600/confirm.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="381" data-original-width="872" height="139" src="https://1.bp.blogspot.com/-eBVyM7xfSJM/WlEszXvEomI/AAAAAAAABik/8iA_OODNABApVy_AyJYHEG27Vu2mSYbRwCLcBGAs/s320/confirm.png" width="320" /></a></div><br />Now, back to the original question. What if we would like to change those button labels.<br /><br />If we have a look at the JavaScript code of the apex.message.confirm function, we can see that the labels are based on some apex.lang messages (APEX.DIALOG.OK and APEX.DIALOG.CANCEL) and that there is no built-in way to change the labels.<br /><br />But...<br /><br />What we can do is change the values (using the JavaScript API of the <a href="http://apex.lang/" target="_blank">apex.lang</a> namespace) of the two messages and then call the confirm function. We should also revert the changes to the messages after that so that everything remains as it was initially.<br /><br />Ok, so let's create a wrapper function on apex.message.confirm (the same also works for apex.page.confirm)&nbsp; and add two parameters for the button labels.<br /><br />The function could look like this:<br /><blockquote class="tr_bq"><pre class="line-numbers"><code class="language-javascript">function customConfirm( pMessage, pCallback, pOkLabel, pCancelLabel ){<br /> var l_original_messages = {"APEX.DIALOG.OK": apex.lang.getMessage("APEX.DIALOG.OK"),<br /> "APEX.DIALOG.CANCEL": apex.lang.getMessage("APEX.DIALOG.CANCEL")};<br /><br /> //change the button labels messages<br /> apex.lang.addMessages({"APEX.DIALOG.OK": pOkLabel});<br /> apex.lang.addMessages({"APEX.DIALOG.CANCEL": pCancelLabel});<br /><br /> //show the confirm dialog<br /> apex.message.confirm(pMessage, pCallback);<br /><br /> //changes the button labels messages back to their original values<br /> apex.lang.addMessages({"APEX.DIALOG.OK": l_original_messages["APEX.DIALOG.OK"]});<br /> apex.lang.addMessages({"APEX.DIALOG.CANCEL": l_original_messages["APEX.DIALOG.CANCEL"]});<br />}<br /></code></pre></blockquote><br />Then, calling our function:<br /><blockquote class="tr_bq"><pre class="line-numbers"><code class="language-javascript">customConfirm( "Are you sure?", function( okPressed ) {<br /> console.log(okPressed ? 'Ok' : 'Cancel');<br />}, "Yes", "No");</code></pre></blockquote><br />Would result in this:<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-73eOhk-0WTI/WlLk6qf2kkI/AAAAAAAABjE/krBSlYLa8-kdqSDkUnyMEG2JLoo1tZVmQCPcBGAYYCw/s1600/custom_confirm.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="386" data-original-width="862" height="143" src="https://1.bp.blogspot.com/-73eOhk-0WTI/WlLk6qf2kkI/AAAAAAAABjE/krBSlYLa8-kdqSDkUnyMEG2JLoo1tZVmQCPcBGAYYCw/s320/custom_confirm.png" width="320" /></a></div><br />or anything you want, like this:<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-HWbZ81cjSbY/WlO9NO8YG0I/AAAAAAAABjc/YnGgqJ09tFsvNlKuz0LNh6v9IMuLdCX-ACPcBGAYYCw/s1600/custom_confirm2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="400" data-original-width="876" height="146" src="https://1.bp.blogspot.com/-HWbZ81cjSbY/WlO9NO8YG0I/AAAAAAAABjc/YnGgqJ09tFsvNlKuz0LNh6v9IMuLdCX-ACPcBGAYYCw/s320/custom_confirm2.png" width="320" /></a></div><br />You can have a look at it in action in my&nbsp;<a href="http://max-playground.no-ip.org/ords/f?p=DEMO:1700" target="_blank">Demo Application</a><br /><br class="Apple-interchange-newline" />Enjoy! Maxime Tremblay tag:blogger.com,1999:blog-267713902572011003.post-5243305870660033746 Wed Jan 17 2018 18:33:00 GMT-0500 (EST) Apex 5.0-5.2 – Logo Text with Icon https://svenweller.wordpress.com/2018/01/17/apex-5-0-5-2-logo-text-with-icon/ <p>This post explains how to add an font icon or a logo to the application header text. For all apex 5 versions including 5.2. This is useful when you want to combine text, like the name of the application together with a simple enchanting logo (icon or image).<br /> <span id="more-7481"></span></p> <h2>Apex 5.0</h2> <p>It is easy to use a Font Awesome icon inside the header text (logo bar).</p> <p>A logo can be added in Apex 5.0 using a simple span tag and the font awesome icon.<br /> The resulting html code needs to be put into the logo text attribute (Application Properties/User Attributes/Logo)</p> <pre class="brush: xml; light: true; title: ; notranslate">&lt;span class=&quot;fa fa-cubes&quot;&gt;&lt;/span&gt;&amp;nbsp;Demo Icon Apex 5.0 </pre> <p>Result<br /> <img src="https://svenweller.files.wordpress.com/2018/01/apex5_logo_icons.png?w=809" alt="Apex5_logo_Icons" height="50px" /></p> <p><em>Decent!<br /> </em></p> <h2>Apex 5.1</h2> <p>Ok lets try the same thing in Apex 5.1 using the new Font-Apex.</p> <p>If you upgraded from Apex 5.0 and the new Font Apex, then first make sure that the page template is refreshed to the updated universal theme. For details check <a href="https://apex.oracle.com/pls/apex/f?p=42:2000" target="_blank">the Universal Theme migration guide</a>.</p> <pre class="brush: xml; light: true; title: ; notranslate"> &lt;span class=&quot;fa fa-cubes&quot;&gt;&lt;/span&gt;&amp;nbsp;Icon Apex 5.1 </pre> <p>Result</p> <p><img data-attachment-id="7707" data-permalink="https://svenweller.wordpress.com/2018/01/17/apex-5-0-5-2-logo-text-with-icon/logo_apex51/" data-orig-file="https://svenweller.files.wordpress.com/2018/01/logo_apex51.png?w=809" data-orig-size="312,50" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Logo_Apex51" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/01/logo_apex51.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/01/logo_apex51.png?w=809?w=312" src="https://svenweller.files.wordpress.com/2018/01/logo_apex51.png?w=809" alt="Logo_Apex51" height="50px" class="alignnone wp-image-7707" srcset="https://svenweller.files.wordpress.com/2018/01/logo_apex51.png 312w, https://svenweller.files.wordpress.com/2018/01/logo_apex51.png?w=150 150w, https://svenweller.files.wordpress.com/2018/01/logo_apex51.png?w=300 300w" sizes="(max-width: 312px) 100vw, 312px" /></p> <p><em>ooooooh ugly!</em></p> <p>There are several issues. One thing is that the icon itself changed considerably and not to the better. Fortunatly this is a rare exception. Most icons look fairly decent in Font Awesome and in Font-Apex.</p> <p>I had the following problem only for Font Apex, not for Font Awesome.<br /> The icon is positioned a little bit higher than it should be. This can be corrected by adding a style for the vertical alignment to the logo attributes or to the span tag.<br /> <code><br /> style="vertical-align:baseline"<br /> </code><br /> This will put the bottom line of the icon on par with the letter line in your text. <img data-attachment-id="7716" data-permalink="https://svenweller.wordpress.com/2018/01/17/apex-5-0-5-2-logo-text-with-icon/logo_apex51_alignbaseline/" data-orig-file="https://svenweller.files.wordpress.com/2018/01/logo_apex51_alignbaseline.png?w=809" data-orig-size="217,58" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Logo_Apex51_alignbaseline" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/01/logo_apex51_alignbaseline.png?w=809?w=217" data-large-file="https://svenweller.files.wordpress.com/2018/01/logo_apex51_alignbaseline.png?w=809?w=217" src="https://svenweller.files.wordpress.com/2018/01/logo_apex51_alignbaseline.png?w=809" alt="Logo_Apex51_alignbaseline" class="alignnone size-full wp-image-7716" srcset="https://svenweller.files.wordpress.com/2018/01/logo_apex51_alignbaseline.png 217w, https://svenweller.files.wordpress.com/2018/01/logo_apex51_alignbaseline.png?w=150 150w" sizes="(max-width: 217px) 100vw, 217px" /><br /> Other useful alignments to try out are &#8220;middle&#8221; or &#8220;text-bottom&#8221;. <a href="https://www.w3schools.com/cssref/pr_pos_vertical-align.asp" target="_blank">more info about vertical alignment on w3schools</a><br /> Here is what text-bottom looks like. <img data-attachment-id="7715" data-permalink="https://svenweller.wordpress.com/2018/01/17/apex-5-0-5-2-logo-text-with-icon/logo_apex51_aligntextbottom/" data-orig-file="https://svenweller.files.wordpress.com/2018/01/logo_apex51_aligntextbottom.png?w=809" data-orig-size="175,52" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Logo_Apex51_aligntextbottom" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/01/logo_apex51_aligntextbottom.png?w=809?w=175" data-large-file="https://svenweller.files.wordpress.com/2018/01/logo_apex51_aligntextbottom.png?w=809?w=175" src="https://svenweller.files.wordpress.com/2018/01/logo_apex51_aligntextbottom.png?w=809" alt="Logo_Apex51_aligntextbottom" class="alignnone size-full wp-image-7715" srcset="https://svenweller.files.wordpress.com/2018/01/logo_apex51_aligntextbottom.png 175w, https://svenweller.files.wordpress.com/2018/01/logo_apex51_aligntextbottom.png?w=150 150w" sizes="(max-width: 175px) 100vw, 175px" /></p> <p>It depends from the icon that you choose, which alignment is best suited.</p> <p>Furthermore lets remove the nasty hardcoded blank space (non-breaking space).<br /> To do so a tiny distance needs to be set between the icon and the text. Defining a class allows to reuse this setting easily.</p> <pre class="brush: css; light: true; title: ; notranslate">.fastyle-header-logo::before { margin-right:4px; } </pre> <p>The css class &#8220;fastyle-header-logo&#8221; then needs to be added to the logo attributes, so that this space is used.</p> <h2>Apex 5.2</h2> <p>The same works in Apex 5.2. The vertical-aline:baseline attribute is still needed there.</p> <p>However Apex 5.2 also gives us a nice new way to create an application logo. </p> <p>When creating a new application the blueprint functionality is used. Among many other nice new options, this gives us a way to create an application icon.</p> <p><strong>Step 1: Create new application and customize the appearance</strong><br /> <img data-attachment-id="7708" data-permalink="https://svenweller.wordpress.com/2018/01/17/apex-5-0-5-2-logo-text-with-icon/apex52_bluepring_dialog1/" data-orig-file="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog1.png?w=809" data-orig-size="1174,201" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Apex52_bluepring_dialog1" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog1.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog1.png?w=809?w=809" src="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog1.png?w=809" alt="Apex52_bluepring_dialog1" class="alignnone size-full wp-image-7708" srcset="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog1.png?w=809 809w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog1.png?w=150 150w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog1.png?w=300 300w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog1.png?w=768 768w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog1.png?w=1024 1024w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog1.png 1174w" sizes="(max-width: 809px) 100vw, 809px" /></p> <p><strong>Step 2: Change the icon</strong><br /> <img data-attachment-id="7709" data-permalink="https://svenweller.wordpress.com/2018/01/17/apex-5-0-5-2-logo-text-with-icon/apex52_bluepring_dialog2/" data-orig-file="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog2.png?w=809" data-orig-size="958,603" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Apex52_bluepring_dialog2" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog2.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog2.png?w=809?w=809" src="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog2.png?w=809" alt="Apex52_bluepring_dialog2" class="alignnone size-full wp-image-7709" srcset="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog2.png?w=809 809w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog2.png?w=150 150w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog2.png?w=300 300w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog2.png?w=768 768w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog2.png 958w" sizes="(max-width: 809px) 100vw, 809px" /></p> <p><strong>Step 3: Set a color and choose from a limited set of icons</strong><br /> <img data-attachment-id="7710" data-permalink="https://svenweller.wordpress.com/2018/01/17/apex-5-0-5-2-logo-text-with-icon/apex52_bluepring_dialog3/" data-orig-file="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=809" data-orig-size="964,602" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Apex52_bluepring_dialog3" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=809?w=809" src="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=809" alt="Apex52_bluepring_dialog3" class="alignnone size-full wp-image-7710" srcset="https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=809 809w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=150 150w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=300 300w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png?w=768 768w, https://svenweller.files.wordpress.com/2018/01/apex52_bluepring_dialog3.png 964w" sizes="(max-width: 809px) 100vw, 809px" /></p> <p><strong>Step 4: Save</strong></p> <p>After creating the application, we get an svg file that is used as the standard application icon. </p> <p><img data-attachment-id="7712" data-permalink="https://svenweller.wordpress.com/2018/01/17/apex-5-0-5-2-logo-text-with-icon/apex52_blueprint_result2/" data-orig-file="https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result2.png?w=809" data-orig-size="744,94" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Apex52_blueprint_result2" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result2.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result2.png?w=809?w=744" src="https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result2.png?w=809" alt="Apex52_blueprint_result2" class="alignnone size-full wp-image-7712" srcset="https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result2.png 744w, https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result2.png?w=150 150w, https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result2.png?w=300 300w" sizes="(max-width: 744px) 100vw, 744px" /></p> <p>Under shared components there are two new files. The svg image &#8220;app-icon.svg&#8221; and an app-icon.css file.</p> <p><img data-attachment-id="7711" data-permalink="https://svenweller.wordpress.com/2018/01/17/apex-5-0-5-2-logo-text-with-icon/apex52_blueprint_result1/" data-orig-file="https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result1.png?w=809" data-orig-size="1148,220" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Apex52_blueprint_result1" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result1.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result1.png?w=809?w=809" src="https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result1.png?w=809" alt="Apex52_blueprint_result1" class="alignnone size-full wp-image-7711" srcset="https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result1.png?w=809 809w, https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result1.png?w=150 150w, https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result1.png?w=300 300w, https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result1.png?w=768 768w, https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result1.png?w=1024 1024w, https://svenweller.files.wordpress.com/2018/01/apex52_blueprint_result1.png 1148w" sizes="(max-width: 809px) 100vw, 809px" /></p> <p>This is the css</p> <pre class="brush: css; light: true; title: ; notranslate"> .app-icon { background-image: url(app-icon.svg); background-repeat: no-repeat; background-size: cover; background-position: 50%; background-color: #2EBFBC; } </pre> <p>It allows us to use the application image in many areas where we can simply specify an icon class. </p> <p>Per default the application image is used for the login page.<br /> <img data-attachment-id="7713" data-permalink="https://svenweller.wordpress.com/2018/01/17/apex-5-0-5-2-logo-text-with-icon/apex52_login_logo/" data-orig-file="https://svenweller.files.wordpress.com/2018/01/apex52_login_logo.png?w=809" data-orig-size="513,449" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Apex52_login_logo" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/01/apex52_login_logo.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/01/apex52_login_logo.png?w=809?w=513" src="https://svenweller.files.wordpress.com/2018/01/apex52_login_logo.png?w=809" alt="Apex52_login_logo" class="alignnone size-full wp-image-7713" srcset="https://svenweller.files.wordpress.com/2018/01/apex52_login_logo.png 513w, https://svenweller.files.wordpress.com/2018/01/apex52_login_logo.png?w=150 150w, https://svenweller.files.wordpress.com/2018/01/apex52_login_logo.png?w=300 300w" sizes="(max-width: 513px) 100vw, 513px" /></p> <p>But I want this image usable in the logo text section. Using the previous solution with a span tag does not work anymore. because the icon is a background image that is then pasted behind the normal logo text. </p> <p>There are several ways to solve this. Here is what worked for me.<br /> To position the icon left of the text (::before), I created a new class logo-app-icon</p> <pre class="brush: css; light: true; title: ; notranslate"> .logo-app-icon::before { content: &quot;&quot;; background-image: url(#APP_IMAGES#app-icon.svg); background-repeat: no-repeat; background-size: cover; background-position: 50%; background-attachment: local; width: 1.7em; height: 1.7em; border-radius: 3px; float: left; margin: 0 4px 0 0; } </pre> <p>And then use this class in the logo attributes section (class=&#8221;logo-app-icon&#8221;)</p> <p>Result<br /> <img data-attachment-id="7714" data-permalink="https://svenweller.wordpress.com/2018/01/17/apex-5-0-5-2-logo-text-with-icon/apex52_logo_icon/" data-orig-file="https://svenweller.files.wordpress.com/2018/01/apex52_logo_icon.png?w=809" data-orig-size="390,54" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Apex52_logo_icon" data-image-description="" data-medium-file="https://svenweller.files.wordpress.com/2018/01/apex52_logo_icon.png?w=809?w=300" data-large-file="https://svenweller.files.wordpress.com/2018/01/apex52_logo_icon.png?w=809?w=390" src="https://svenweller.files.wordpress.com/2018/01/apex52_logo_icon.png?w=809" alt="Apex52_logo_icon" class="alignnone size-full wp-image-7714" srcset="https://svenweller.files.wordpress.com/2018/01/apex52_logo_icon.png 390w, https://svenweller.files.wordpress.com/2018/01/apex52_logo_icon.png?w=150 150w, https://svenweller.files.wordpress.com/2018/01/apex52_logo_icon.png?w=300 300w" sizes="(max-width: 390px) 100vw, 390px" /></p> <p>You might want to play around with different width/height settings. 20px also worked for me.</p> <h2>Summary</h2> <p>Regardless which version of apex 5 you are working with &#8211; there is an easy way to use an icon or an image together with some text as the logo line. </p> <p>Currently Apex 5.2 is still in its early adopter phase. So there is an unlikely chance that this feature will not make it into the final product. Or that there are some small changes.</p> svenweller http://svenweller.wordpress.com/?p=7481 Wed Jan 17 2018 07:18:39 GMT-0500 (EST) Introducing APEX TabLock http://www.explorer.uk.com/introducing-apex-tablock/ <p class="p1"><strong><span class="s1">A little side project of mine is developing new features for a chrome extension which provides extra functionality for the APEX developer.</span></strong></p> <p>The chrome extension is called TabLock and the name derived from its original purpose, which is to help prevent accidental movement of APEX page designer tabs.</p> <p>However, I am aware that this extension has never had a formal introduction to the APEX community &#8211; and with the launch of a new feature, I believe now is the correct time for an introduction.</p> <p>If you would like to try this extension, you can install from <a href="http://bit.ly/APEXTabLock" target="_blank" rel="noopener">http://bit.ly/APEXTabLock</a></p> <p class="p1"><strong><span class="s1">The new feature<br /> </span></strong><span class="s1">The new feature has been in regular use at Explorer over the last month and it is already a big hit. I also previewed it at the <a href="https://www.meetup.com/orclapex_uk/events/244284816/" target="_blank" rel="noopener">APEX UK Meetup</a> at the end of last year and now is the time to launch it &#8211; so make sure you&#8217;ve installed TabLock version 1.3.2.</span></p> <p class="p1"><span class="s1">The problem it solves is &#8211; after creating page items you often want to use those page items in an attribute or a piece of code, which could be either in the Code Editor or a Text Area. Depending on your tab arrangement, you may not be able to view the names of those page items without closing the Code Editor, finding the names, and then loading the page editor up again. Throughout my APEX 5 experience, I have lost count of the times I have had to close the editor only to open it back up again once I discover the name of the item I was looking for.</span></p> <p class="p1"><span class="s1">So I thought &#8211; Wouldn’t it be great if the developer had excess to the names of page items everywhere in Page Designer?</span></p> <p class="p1"><span class="s1">The solution &#8211; All users of Tab Lock now have access to “Right-Click” context menu. This is enabled for all input fields within Page Designer including the Code Editor. Once the user has right-clicked, navigate to “APEX Page Designer Tab Lock &#8211; Explorer UK” and from there you have access to:<br /> </span></p> <ul class="ul1"> <li class="li1"><span class="s1">Substitution Strings</span></li> <li class="li1"><span class="s1">Page Items &amp; Editable Interactive Grid Columns (by Region)</span></li> </ul> <p><span class="s1">Substitution Strings are displayed as per your APEX version, i.e. if you use APEX 5.0 you see one list of substitution strings, APEX 5.1 you see another (and once the documentation arrives for 5.2, I’ll add those too).</span></p> <p><span class="s1">In Page Items, you will see all page items on your page, this is refreshed in real-time, and so if you change the name of a page item, it will be immediately reflected in the Tab-Lock context menu. Hovering over a page item will expand a submenu, which will display three menu entries, so you can pick the format (i.e. just the page item name, prefixed with a colon or using the ampersand-dot notation) you wish to insert into your code. </span></p> <p><span class="s1">This feature works in all version of APEX 5 and supports Page Designer (various versions) in multiple browser tabs and as far as we can tell &#8211; no limit on page items and regions. You even have mouse wheel support for cycling through numerous page items. Outside of page designer, the menu disappears and is restored once you start developing again.<br /> </span></p> <p><span class="s1"><a href="http://www.explorer.uk.com/wp-content/uploads/2018/01/TabLockContext.gif" rel="lightbox[6430]"><img class="aligncenter size-full wp-image-6433" src="http://www.explorer.uk.com/wp-content/uploads/2018/01/TabLockContext.gif" alt="" width="1195" height="651" /></a></span></p> <p class="p3"><strong>The existing features</strong><br /> Tab-Lock has been around a while, so here are the existing features which may enhance your APEX experience.</p> <p class="p3"><em>Tab-Locking &#8211; </em>A great feature starting with APEX 5.1 is the ability to reposition your page designer tabs &#8211; I am a big fan of being able to customise my tabs. What I am not a big fan of is accidentally moving the tabs when I am trying to click on them; sometimes the little things can annoy you the most. Something had to be done; therefore, TabLock was created to prevent accidental tab movement. It is simple to use &#8211; customise your tabs then lock them in place. Unlock to move them again and once happy then click to lock them in place.</p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/01/TabLockLocking.gif" rel="lightbox[6430]"><img class="aligncenter size-full wp-image-6434" src="http://www.explorer.uk.com/wp-content/uploads/2018/01/TabLockLocking.gif" alt="" width="1195" height="651" /></a></p> <p><em>Repositionable Tabs for APEX 5.0 &#8211; </em>Such a great feature is the ability to reposition your page designer tabs in APEX 5.1; I thought why should the APEX 5.0 developers miss out? Therefore the same repositionable tab functionality (minus the ability to relocate tabs to different tab groups) is available &#8211; I even fixed the Gallery tab group not persisting bug (which is still present in APEX 5.2EA).</p> <p><em>Focus Dialog Bypass &#8211; </em>The Run Dialog is easily bypassed. However, the Focus Dialog needed a bit of creative thinking. You will need to activate this feature in the Tab-Lock options page; then say goodbye to the Focus Dialog page.</p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/01/BypassFocusPageDialog.jpg" rel="lightbox[6430]"><img class="aligncenter size-full wp-image-6432" src="http://www.explorer.uk.com/wp-content/uploads/2018/01/BypassFocusPageDialog.jpg" alt="" width="507" height="303" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/01/BypassFocusPageDialog.jpg 507w, http://www.explorer.uk.com/wp-content/uploads/2018/01/BypassFocusPageDialog-300x179.jpg 300w" sizes="(max-width: 507px) 100vw, 507px" /></a></p> <p>For those of you still on APEX 4.2? you may wish to try my other Chrome Extension <a href="http://bit.ly/Apexticky">APEXticky</a> which improves the navigation for APEX 4.2 only.</p> <p>The post <a rel="nofollow" href="http://www.explorer.uk.com/introducing-apex-tablock/">Introducing APEX TabLock</a> appeared first on <a rel="nofollow" href="http://www.explorer.uk.com">Explorer | Award Winning UK Oracle Partner</a>.</p> admin http://www.explorer.uk.com/?p=6430 Wed Jan 17 2018 05:33:39 GMT-0500 (EST) Why you should change the FONT of your code editor http://vmorneau.me/coding-with-ligatures/ <div class="kg-card-markdown"><img src="http://vmorneau.me/content/images/2018/01/1500x500.png" alt="Why you should change the FONT of your code editor"><p>I recently changed the default font of my code editor and I love it.</p> <p>I now use <strong>Fira Code</strong>, which is a monospaced font with programming ligatures.</p> <p>If you're not familiar with programming ligatures, it essentially groups multiple characters (like <code>&lt;=</code> or <code>===</code>) into one, and the result is pretty neat.</p> <p>Check out these two examples for Oracle APEX development.</p> <h5 id="plsql">PL/SQL</h5> <p><img src="http://vmorneau.me/content/images/2018/01/plsql-firacode.png" alt="Why you should change the FONT of your code editor"></p> <h5 id="javascript">JavaScript</h5> <p><img src="http://vmorneau.me/content/images/2018/01/javascript-firacode.png" alt="Why you should change the FONT of your code editor"></p> <h5 id="mysetup">My setup</h5> <ul> <li><strong>Code Editor:</strong> Atom</li> <li><strong>UI Theme:</strong> Atom Dark</li> <li><strong>Syntax Theme:</strong> Monokai<br> <img src="http://vmorneau.me/content/images/2018/01/atom-theme.png" alt="Why you should change the FONT of your code editor"></li> <li><strong>Language Addon:</strong> language-oracle<br> <img src="http://vmorneau.me/content/images/2018/01/language-oracle.png" alt="Why you should change the FONT of your code editor"></li> <li><strong>Font Family:</strong> Fira Code <ol> <li>On OS X, download the latest version of Fira Code <a href="https://github.com/tonsky/FiraCode/releases">https://github.com/tonsky/FiraCode/releases</a></li> <li>On OS X, unzip the .ttf files into <code>Library/Fonts</code></li> <li>Go to Atom Settings, under Editor</li> <li>Set Font Family to <code>FiraCode-Light</code>.<br> <img src="http://vmorneau.me/content/images/2018/01/atom-firacode.png" alt="Why you should change the FONT of your code editor"></li> </ol> </li> </ul> <p>Installation for Fira Code may be slightly different on Windows or on other code editors. For more info, read Fira Code instructions: <a href="https://github.com/tonsky/FiraCode">https://github.com/tonsky/FiraCode</a></p> <hr> <p>It's not a huge thing, but it makes me appreciate looking at code better.</p> <p>Try it, you'll see.</p> </div> Vincent Morneau 5a58b032f36007111533e3f7 Tue Jan 16 2018 08:33:31 GMT-0500 (EST) The top 5 reasons why you should submit an abstract for APEX at the Great Lakes Oracle Conference (GLOC) http://joelkallman.blogspot.com/2018/01/the-top-5-reasons-why-you-should-submit.html <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-H0wTHgXc3Iw/Wl1MMTL1T9I/AAAAAAAADmg/wYsWdit4-7Ep236c0mmyPZfgpeHn5cYxACLcBGAs/s1600/gloc17.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="511" data-original-width="1600" height="203" src="https://1.bp.blogspot.com/-H0wTHgXc3Iw/Wl1MMTL1T9I/AAAAAAAADmg/wYsWdit4-7Ep236c0mmyPZfgpeHn5cYxACLcBGAs/s640/gloc17.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">APEX Developer Day at Great Lakes Oracle Conference 2017</td></tr></tbody></table><br />The <a href="https://www.neooug.org/" target="_blank">Northeast Ohio Oracle User's Group (NEOOUG)</a> is easily one of my favorite user groups on the planet.&nbsp; They've been graciously hosting me at their user group events since 2004 (when I first gave a demonstration on Oracle HTML DB 1.5!).&nbsp; They are a large, active and passionate user group.&nbsp; In the past 14 years, I've seen them grow from simple user group events to "Training Days" at the Cleveland State University campus to a nicely sized regional conference named <a href="https://gloc.neooug.org/en/" target="_blank">Great Lakes Oracle Conference</a>.<br /><br />If you're into Oracle <a href="https://apex.oracle.com/" target="_blank">APEX</a>, either on-premises, or in the Oracle Cloud, I encourage you to submit an abstract to speak at the Great Lakes Oracle Conference.&nbsp; Here are my top 5 reasons why you should strongly consider this:<br /><ol><li>There is a real hunger for Oracle APEX content at this conference.&nbsp; There are countless customers in the immediate region who use Oracle APEX.&nbsp; Last year, they had the first ever Oracle APEX Developer Day in advance of the conference, and it was sold out (100 attendees)!</li><li>It's the largest Oracle user's conference in the Midwest US.&nbsp; It draws people from all over Ohio, Michigan, Indiana, Kentucky and Pennsylvania.&nbsp; There will be over 500 attendees at the conference in 2018.</li><li>The Great Lakes Oracle Conference routinely gets world-class speakers from all over the world, both Oracle employees and <a href="http://www.oracle.com/technetwork/community/oracle-ace/index.html" target="_blank">Oracle ACEs</a>.&nbsp; As a speaker, you would be able to attend any session in any track.</li><li>There are numerous tracks at the Great Lakes Oracle Conference, including APEX, Oracle Applications, Business Intelligence, DBA, Database Developer and Data Warehousing.</li><li>Cleveland, Ohio is on the North Coast of the US.&nbsp; There, you can visit <a href="https://www.greatlakesbrewing.com/" target="_blank">Great Lakes Brewing Company</a>, <a href="https://www.marketgardenbrewery.com/" target="_blank">Market Garden Brewery</a>, <a href="https://platformbeer.co/" target="_blank">Platform Beer Company</a>,&nbsp; and the <a href="https://www.rockhall.com/" target="_blank">Rock &amp; Roll Hall of Fame.</a></li></ol><br />I come across so many people who say "why would anyone want to hear me talk about that?"&nbsp; From case studies to lessons learned to best practices in your environment, it's all interesting and valuable.&nbsp; Not everyone who attends the APEX sessions at GLOC are experts, so entry-level sessions are also welcome!<br /><br />I encourage you to <a href="https://gloc.neooug.org/en/" target="_blank">submit an abstract today</a>.&nbsp; The deadline for abstract submission is February 2, 2018. Joel R. Kallman tag:blogger.com,1999:blog-12214002.post-1246013552654180969 Mon Jan 15 2018 19:50:00 GMT-0500 (EST) Oracle APEX 5.1.4 and ORDS 17.4 upgrade http://lschilde.blogspot.com/2018/01/oracle-apex-514-and-ords-174-upgrade.html <div dir="ltr" style="text-align: left;" trbidi="on"><h2 class="MsoNormal" style="line-height: normal; text-align: justify;"><b><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 18.0pt;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">Oracle APEX 5.1.4 and ORDS 17.4 upgrade</span><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"></span></span></span></b></h2><h2 class="MsoNormal" style="line-height: normal; text-align: justify;"><b><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 18.0pt;">&nbsp;</span></b></h2><h3 class="MsoNormal" style="line-height: normal; text-align: left;"><b><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 13.5pt;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">Weblogic 10.3.6 and ORDS 17.4</span></span></span></span></b></h3><h3 class="MsoNormal" style="line-height: normal; text-align: left;"></h3><h4 class="MsoNormal" style="line-height: normal; text-align: left;"><b><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 12.0pt;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;"><br /></span></span></span></span></b></h4><h4 class="MsoNormal" style="line-height: normal; text-align: left;"><span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">Web<span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">server and ORD<span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">S</span> JAVA <span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">compa<span style="font-family: &quot;arial&quot; , &quot;sans-serif&quot;;">ti</span>bility issue</span></span></span></h4><br /><div style="text-align: justify;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">This popped out <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">during our ORACLE APEX </span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">5.1.4 upgrade<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">.&nbsp;</span></span></span></span></span></span></span></span></span></span></div><div style="text-align: justify;"></div><div style="text-align: justify;"><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">We were running WebLogic 10.3.6 and <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Oracle APEX 5.1.2 </span></span>doing <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">upgr<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ade to latest version of ORDS and APE<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">X</span> (<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ORDS 17.<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">4 and APE<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">X</span> 5.1.4)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></div><div style="text-align: justify;"></div><div style="text-align: justify;"><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">APEX upgrade as such was smooth but on ORDS restart we got an error:</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div><br /><div class="separator" style="clear: both; text-align: center;"></div><img alt="" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4REERXhpZgAATU0AKgAAAAgABAE7AAIAAAATAAAISodpAAQAAAABAAAIXpydAAEAAAAmAAAQ1uocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNjaGlsZGVuZmVsZCwgTGlubwAAAAWQAwACAAAAFAAAEKyQBAACAAAAFAAAEMCSkQACAAAAAzc5AACSkgACAAAAAzc5AADqHAAHAAAIDAAACKAAAAAAHOoAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMDE4OjAxOjE1IDExOjI0OjIxADIwMTg6MDE6MTUgMTE6MjQ6MjEAAABTAGMAaABpAGwAZABlAG4AZgBlAGwAZAAsACAATABpAG4AbwAAAP/hCyVodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0n77u/JyBpZD0nVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkJz8+DQo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIj48cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPjx4bXA6Q3JlYXRlRGF0ZT4yMDE4LTAxLTE1VDExOjI0OjIxLjc5MTwveG1wOkNyZWF0ZURhdGU+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjxkYzpjcmVhdG9yPjxyZGY6U2VxIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpsaT5TY2hpbGRlbmZlbGQsIExpbm88L3JkZjpsaT48L3JkZjpTZXE+DQoJCQk8L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PC9yZGY6UkRGPjwveDp4bXBtZXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg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" /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><br /></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Problem was in JAVA version <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">that was runni<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ng on our W<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ebLogi<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">c</span> Server</span></span></span> -&gt; <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">JAVA version </span>7(</span><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves/> <w:TrackFormatting/> <w:PunctuationKerning/> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-AU</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:EnableOpenTypeKerning/> <w:DontFlipMirrorIndents/> <w:OverrideTableStyleHps/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="&#45;-"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument></xml><![endif]--></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true" DefSemiHidden="true" DefQFormat="false" DefPriority="99" LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" Priority="39" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" Name="toc 9"/> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/> <w:LsdException Locked="false" Priority="10" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Title"/> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/> <w:LsdException Locked="false" Priority="11" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" Priority="22" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" Priority="59" SemiHidden="false" UnhideWhenUsed="false" Name="Table Grid"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/> <w:LsdException Locked="false" Priority="34" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/> </w:LatentStyles></xml><![endif]--><!--[if gte mso 10]><style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman","serif";} </style><![endif]--><span style="color: #00b050; font-family: &quot;arial&quot; , &quot;sans-serif&quot;; font-size: 12.0pt;">jdk1.7.0_25</span>) was not supported by ORDS.<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><br /></span></span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">M</span>ore info <a href="https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=174621208059778&amp;id=2342501.1&amp;_afrWindowMode=0&amp;_adf.ctrl-state=o6ijfj1m3_4">here</a><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">.&nbsp; </span></span></span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Solutions a<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">vailable:</span></span></span></span></span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">- <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">D</span>owngrade to use ORDS 17.3</span></span></span></span></span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">- <a href="https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=174621647408751&amp;id=1309855.1&amp;_afrWindowMode=0&amp;_adf.ctrl-state=o6ijfj1m3_45">U<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">pgrade you<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">r <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">W</span>eb<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">L</span>ogic with </span>JDK 1.8</span></a></span></span></span></span></span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">- Upgrade your WebLogic to 12c</span></span></span></span></span></span></span><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">We d<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ecid<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">ed (for now) to go with ORDS 17.3 and APE<span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">X was up and <span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">running</span> again.</span></span></span></span><br /><div style="text-align: justify;"><br /><br /><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Happy APEXing,</span></span><br /><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;"><span style="font-family: &quot;arial&quot; , &quot;helvetica&quot; , sans-serif;">Lino </span></span></div></div> SLino tag:blogger.com,1999:blog-8185384792158425670.post-7344095729461753195 Mon Jan 15 2018 00:52:00 GMT-0500 (EST) Data driven APEX icons http://www.grassroots-oracle.com/2018/01/data-driven-apex-icons.html We have an application written with a heavily customised Theme 25 built for 10" tablets, and we feel the Universal Theme justifies the move, in part because of the surrounding ecosystem. Check out&nbsp;<a href="https://community.oracle.com/message/14658989" target="_blank">this forum discussion</a>&nbsp;on the topic.<br /><br />We've been looking through the packaged applications for applied ideas, and using the <a href="https://apex.oracle.com/pls/apex/f?p=42" target="_blank">Universal Theme sample application</a>&nbsp;as a component reference.<br /><br />I came across a requirement where we had a list of items that indicated completion level out of 100.<br />Then I thought about a group of pie icons I saw in Dick Dral's <a href="https://www.speech2form.com/ords/f?p=opfg:fonts51:0" target="_blank">Font APEX icon reference</a>, and knew what I wanted to do.<br /><br />All I needed to do was round a bunch of numbers to the nearest 5.<br /><br />To solve such as problem, I usually start by giving myself a bunch of numbers to play with<br /><code>select rownum rn from dual connect by level &lt;= 100</code><br /><br />Then defining that as a&nbsp;<code>WITH</code>&nbsp;statement, so I can refer to the derived column as often as I like.<br /><pre class="brush:sql">with nbrs as (<br /> select rownum rn from dual connect by level &lt;= 100<br />)<br />select rn<br /> , floor(rn/100 * 20) / 20*100 rnd<br /> ,'fa fa-pie-chart-'||floor(rn/100 * 20) / 20*100 icon<br />from nbrs<br />where mod(rn,5)=0</pre>And I used a divide/multiply by 20 math trick to do the rounding.<br /><br />We can then feed the result as the relevant icon into whatever region template we need.<br /><div><br /></div><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-TDGnzwhX-68/WlbtNUFiSsI/AAAAAAAATi0/Vp0j3J1IDUEtfLjL7lTGeCNIKMnaHWYwQCLcBGAs/s1600/pie_mod_5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="836" data-original-width="469" src="https://4.bp.blogspot.com/-TDGnzwhX-68/WlbtNUFiSsI/AAAAAAAATi0/Vp0j3J1IDUEtfLjL7lTGeCNIKMnaHWYwQCLcBGAs/s1600/pie_mod_5.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">I like pie.</td></tr></tbody></table><br />Simple, yet effective. Scott Wesley tag:blogger.com,1999:blog-4818542164384221282.post-2281574452056076049 Thu Jan 11 2018 19:00:00 GMT-0500 (EST) ORDS, OAuth2 & Web Services in APEX – Part 3 http://www.explorer.uk.com/ordsoauth2-web-services-in-apex-part-3/ <h2>Calling Web Services from APEX</h2> <p style="text-align: justify;">The following blog will show you how to call GET method Web Service from an APEX 5.1 application and extract the response data. It will also show you how to authenticate calls to protected Web Services and how to process paginated JSON response data. Typically the Web Services would be external, however to keep things simple and consistent we will build upon the ones we created in the first two parts of this blog.</p> <p style="text-align: justify;"><strong>Enhancements to the previously created Web Services<br /> </strong>We previously created five Web Services over the EMP and DEPT tables and added OAuth2 Authentication. Before we begin we are going to add a further two GET method handlers that use no pagination. We will also update the items returned per page of the original Employees GET method to five and set the department number parameter to be passed in using the HTTP header rather than in the URI.</p> <p style="text-align: justify;">Login to your ORDSDEMO schema (created in part 1) and run the following PL/SQL.</p> <pre style="padding-left: 60px;"><span style="font-family: courier new, courier, monospace;">DECLARE</span> <span style="font-family: courier new, courier, monospace;"> la_priv_patterns owa.vc_arr;</span> <span style="font-family: courier new, courier, monospace;">BEGIN </span> <span style="font-family: courier new, courier, monospace;"> ords.define_template(p_module_name =&gt; 'hr.v1',</span> <span style="font-family: courier new, courier, monospace;"> p_pattern =&gt; 'all_departments',</span> <span style="font-family: courier new, courier, monospace;"> p_comments =&gt; 'All Departments');</span> <span style="font-family: courier new, courier, monospace;"> ords.define_template(p_module_name =&gt; 'hr.v1',</span> <span style="font-family: courier new, courier, monospace;"> p_pattern =&gt; 'all_employees',</span> <span style="font-family: courier new, courier, monospace;"> p_comments =&gt; 'All Employees');</span> <span style="font-family: courier new, courier, monospace;"> ords.define_handler(p_module_name =&gt; 'hr.v1',</span> <span style="font-family: courier new, courier, monospace;"> p_pattern =&gt; 'all_departments',</span> <span style="font-family: courier new, courier, monospace;"> p_method =&gt; 'GET',</span> <span style="font-family: courier new, courier, monospace;"> p_source_type =&gt; ords.source_type_query,</span> <span style="font-family: courier new, courier, monospace;"> p_source =&gt; 'SELECT deptno, dname, loc FROM dept ORDER BY deptno',</span> <span style="font-family: courier new, courier, monospace;"> p_items_per_page =&gt; 0,</span> <span style="font-family: courier new, courier, monospace;"> p_comments =&gt; 'List all departments');</span> <span style="font-family: courier new, courier, monospace;"> ords.define_handler(p_module_name =&gt; 'hr.v1',</span> <span style="font-family: courier new, courier, monospace;">p_pattern =&gt; 'all_employees',</span> <span style="font-family: courier new, courier, monospace;"> p_method =&gt; 'GET',</span> <span style="font-family: courier new, courier, monospace;"> p_source_type =&gt; ords.source_type_query,</span> <span style="font-family: courier new, courier, monospace;"> p_source =&gt; 'SELECT d.dname, e.ename, e.job, e.empno, e.hiredate, d.loc</span> <span style="font-family: courier new, courier, monospace;"> FROM emp e, dept d</span> <span style="font-family: courier new, courier, monospace;"> WHERE e.deptno = d.deptno</span> <span style="font-family: courier new, courier, monospace;"> AND (:pn_deptno IS NULL OR d.deptno = :pn_deptno)</span> <span style="font-family: courier new, courier, monospace;"> ORDER BY d.dname, e.ename',</span> <span style="font-family: courier new, courier, monospace;"> p_items_per_page =&gt; 0,</span> <span style="font-family: courier new, courier, monospace;"> p_comments =&gt; 'List all employees');</span> <span style="font-family: courier new, courier, monospace;"> ords.define_handler(p_module_name =&gt; 'hr.v1',</span> <span style="font-family: courier new, courier, monospace;"> p_pattern =&gt; 'employees',</span> <span style="font-family: courier new, courier, monospace;"> p_method =&gt; 'GET',</span> <span style="font-family: courier new, courier, monospace;"> p_source_type =&gt; ords.source_type_query,</span> <span style="font-family: courier new, courier, monospace;"> p_source =&gt; 'SELECT d.dname, e.ename, e.job, e.empno, e.hiredate, d.loc</span> <span style="font-family: courier new, courier, monospace;"> FROM emp e, dept d</span> <span style="font-family: courier new, courier, monospace;"> WHERE e.deptno = d.deptno</span> <span style="font-family: courier new, courier, monospace;"> AND (:pn_deptno IS NULL OR d.deptno = :pn_deptno)</span> <span style="font-family: courier new, courier, monospace;"> ORDER BY d.dname, e.ename',</span> <span style="font-family: courier new, courier, monospace;"> p_items_per_page =&gt; 5, </span> <span style="font-family: courier new, courier, monospace;"> p_comments =&gt; 'List employees');</span> <span style="font-family: courier new, courier, monospace;"> ords.define_parameter(p_module_name =&gt; 'hr.v1',</span> <span style="font-family: courier new, courier, monospace;"> p_pattern =&gt; 'all_employees',</span> <span style="font-family: courier new, courier, monospace;"> p_method =&gt; 'GET',</span> <span style="font-family: courier new, courier, monospace;"> p_name =&gt; 'department_number',</span> <span style="font-family: courier new, courier, monospace;"> p_bind_variable_name =&gt; 'pn_deptno',</span> <span style="font-family: courier new, courier, monospace;"> p_source_type =&gt; 'HEADER',</span> <span style="font-family: courier new, courier, monospace;"> p_param_type =&gt; 'INT',</span> <span style="font-family: courier new, courier, monospace;"> p_access_method =&gt; 'IN',</span> <span style="font-family: courier new, courier, monospace;"> p_comments =&gt; 'Restrict employees to a single department'); </span> <span style="font-family: courier new, courier, monospace;"> ords.define_parameter(p_module_name =&gt; 'hr.v1',</span> <span style="font-family: courier new, courier, monospace;"> p_pattern =&gt; 'employees',</span> <span style="font-family: courier new, courier, monospace;"> p_method =&gt; 'GET',</span> <span style="font-family: courier new, courier, monospace;"> p_name =&gt; 'department_number',</span> <span style="font-family: courier new, courier, monospace;"> p_bind_variable_name =&gt; 'pn_deptno',</span> <span style="font-family: courier new, courier, monospace;"> p_source_type =&gt; 'HEADER',</span> <span style="font-family: courier new, courier, monospace;"> p_param_type =&gt; 'INT',</span> <span style="font-family: courier new, courier, monospace;"> p_access_method =&gt; 'IN',</span> <span style="font-family: courier new, courier, monospace;"> p_comments =&gt; 'Restrict employees to a single department'); </span> <span style="font-family: courier new, courier, monospace;"> la_priv_patterns(1) := '/hr/v1/all_employees';</span> <span style="font-family: courier new, courier, monospace;"> ords.create_privilege_mapping(p_privilege_name =&gt; 'employee.privilege',</span> <span style="font-family: courier new, courier, monospace;"> p_patterns =&gt; la_priv_patterns);</span> <span style="font-family: courier new, courier, monospace;">COMMIT;</span> <span style="font-family: courier new, courier, monospace;">END</span></pre> <p>You will now have two additional GET method Web Services.</p> <ul> <li>all_departments, non-paginated GET method Web Services returning all departments in JSON format.</li> <li>all_employees, non-paginated GET method Web Services returning all employees (optionally for a named department) in JSON format. Protected using OAuth2.</li> </ul> <p><strong>Access Web Services from APEX<br /> </strong>There are currently two methods of accessing a Web Service within APEX.</p> <ol> <li>Define using Web Services References within the Data References section of Shared Components and access via a Web Service page process.</li> <li>Access directly using the apex_web_service PL/SQL API.</li> </ol> <p>The following examples are calling Web Services running on a local XE installation via port 8081; therefore, all of the URLs will start with http://localhost:8081/ords/. Update this part of the URL to reflect your configuration.</p> <p><strong>Accessing a GET method Web Service using Web Services References<br /> </strong>To get started we need to create a new APEX application. Log into the application builder and create a new desktop application called ‘Web Service Demo’. Accept all the defaults and add a blank home page.</p> <p>Navigate to shared components and click on Web Service Reference within the Data References section, then follow these steps to define the request for the all_departments Web Service.</p> <p style="padding-left: 30px;">1. Click <strong><em>Create</em></strong>.<br /> 2. Keep the default type of REST selected and press <em><strong>Next</strong></em>.<br /> 3. Enter the following values for the REST details and press <em><strong>Next</strong></em>.</p> <table class=" alignleft" style="width: 100%; height: 160px;"> <thead> <tr style="height: 20px;"> <td style="width: 50%; height: 24px; text-align: left;">Name</td> <td style="width: 1071.78px; height: 24px; text-align: left;">All Departments<strong><br /> </strong></td> </tr> </thead> <tbody> <tr style="height: 24px;"> <td style="width: 50%; height: 24px;">URL</td> <td style="width: 1071.78px; height: 24px;">http://localhost:8081/ords/api/hr/v1/all_departments</td> </tr> <tr style="height: 24px;"> <td style="width: 50%; height: 24px;">HTTP Method</td> <td style="width: 1071.78px; height: 24px;">GET</td> </tr> <tr style="height: 24.0667px;"> <td style="width: 50%; height: 24.0667px;">Basic Authentication</td> <td style="width: 1071.78px; height: 24.0667px;">No</td> </tr> </tbody> </table> <p style="padding-left: 30px;">4. We do not need any REST Inputs so press Next.<br /> 5. Set the REST output type to JSON and press Create.</p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/01/1_Test-department-web-service.jpg" rel="lightbox[6391]"><img class="aligncenter wp-image-6398 size-full" src="http://www.explorer.uk.com/wp-content/uploads/2018/01/1_Test-department-web-service.jpg" alt="" width="1345" height="767" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/01/1_Test-department-web-service.jpg 1345w, http://www.explorer.uk.com/wp-content/uploads/2018/01/1_Test-department-web-service-300x171.jpg 300w, http://www.explorer.uk.com/wp-content/uploads/2018/01/1_Test-department-web-service-768x438.jpg 768w, http://www.explorer.uk.com/wp-content/uploads/2018/01/1_Test-department-web-service-1024x584.jpg 1024w" sizes="(max-width: 1345px) 100vw, 1345px" /></a></p> <p>Now the Web Service Reference has been defined we can use it as the source for an interactive report. Create a new blank page (2) called ‘Departments – WSR’, selecting the options within the wizard to include breadcrumb and navigation links.</p> <p>Navigate to page 2 and follow these steps to add two process, one to call the Web Service and another to add the returned data into a collection for the interactive report.</p> <p style="padding-left: 30px;">1. Right-click on Before Header within Rendering &gt; Pre-Rendering.<br /> 2. Select ‘Create Process’ and enter the following properties.</p> <table class=" alignleft" style="height: 280px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 476.5px; text-align: left;">Name</td> <td style="width: 476.5px; text-align: left;">Call Department Web Service</td> </tr> </thead> <tbody> <tr> <td style="width: 476.5px;"> Type</td> <td style="width: 476.5px;"> Web Service</td> </tr> <tr> <td style="width: 476.5px;">Web Service Operation</td> <td style="width: 476.5px;"> All Departments &#8211; doREST</td> </tr> <tr> <td style="width: 476.5px;"> Store Result in</td> <td style="width: 476.5px;"> Collection</td> </tr> <tr> <td style="width: 476.5px;"> Collection Name</td> <td style="width: 476.5px;"> DEPT_JSON</td> </tr> <tr> <td style="width: 476.5px;"> Store Result in</td> <td style="width: 476.5px;"> Collection</td> </tr> <tr> <td style="width: 476.5px;"> Sequence</td> <td style="width: 476.5px;"> Collection</td> </tr> </tbody> </table> <p style="text-align: justify; padding-left: 30px;">3. Create a second process using the following properties.</p> <table class=" alignleft" style="height: 160px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 676px; text-align: left;">Name</td> <td style="width: 676px; text-align: left;">Create DEPARTMENTS collection</td> </tr> </thead> <tbody> <tr> <td style="width: 676px;">Type</td> <td style="width: 676px;">PL/SQL Code</td> </tr> <tr> <td style="width: 676px;">PL/SQL Code</td> <td style="width: 676px;">See step 4</td> </tr> <tr> <td style="width: 676px;">Sequence</td> <td style="width: 676px;">20</td> </tr> </tbody> </table> <p style="text-align: justify; padding-left: 30px;">4. Use the following PL/SQL code for the second process to get the Web Service response data and use it to create a new DEPARTMENTS collection for the interactive report to query.</p> <pre style="padding-left: 60px;"><span style="font-family: courier new, courier, monospace;">DECLARE</span> <span style="font-family: courier new, courier, monospace;"> lc_data CLOB;</span> <span style="font-family: courier new, courier, monospace;"> lj_depts apex_json.t_values;</span> <span style="font-family: courier new, courier, monospace;">BEGIN</span> <span style="font-family: courier new, courier, monospace;"> -- Extract JSON data from DEPT_JSON collection populated by Web Service call</span> <span style="font-family: courier new, courier, monospace;"> SELECT clob001</span> <span style="font-family: courier new, courier, monospace;"> INTO lc_data</span> <span style="font-family: courier new, courier, monospace;"> FROM apex_collections</span> <span style="font-family: courier new, courier, monospace;"> WHERE collection_name = 'DEPT_JSON';</span> <span style="font-family: courier new, courier, monospace;">-- Parse the JSON data </span> <span style="font-family: courier new, courier, monospace;"> apex_json.parse(lj_depts, lc_data);</span> <span style="font-family: courier new, courier, monospace;"> -- Loop through each department in the JSON data and add to a new collection</span> <span style="font-family: courier new, courier, monospace;"> apex_collection.create_or_truncate_collection('DEPARTMENTS');</span> <span style="font-family: courier new, courier, monospace;"> FOR dept_loop IN 1 .. apex_json.get_count(p_path =&gt; 'items', p_values =&gt; lj_depts) LOOP </span> <span style="font-family: courier new, courier, monospace;"> apex_collection.add_member(p_collection_name =&gt; 'DEPARTMENTS',</span> <span style="font-family: courier new, courier, monospace;"> p_c001 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].deptno',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; dept_loop,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_depts),</span> <span style="font-family: courier new, courier, monospace;"> p_c002 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].dname',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; dept_loop,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_depts),</span> <span style="font-family: courier new, courier, monospace;"> p_c003 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].loc',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; dept_loop,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_depts)); </span> <span style="font-family: courier new, courier, monospace;"> END LOOP;</span> <span style="font-family: courier new, courier, monospace;">END;</span></pre> <p>The final step is to add an interactive report region to the page using the DEPARTMENTS collection as the source.</p> <p style="padding-left: 30px;">1. Add an Interactive Report region to the CONTENT BODY of the page.<br /> 2. Set the title to ‘Departments’.<br /> 3. Enter the following for the SQL Query.</p> <pre style="padding-left: 60px;"><span style="font-family: courier new, courier, monospace;">SELECT c001 dept_number, </span> <span style="font-family: courier new, courier, monospace;"> c002 dept_name, </span> <span style="font-family: courier new, courier, monospace;"> c003 location</span> <span style="font-family: courier new, courier, monospace;">FROM apex_collections</span> <span style="font-family: courier new, courier, monospace;">WHERE collection_name = 'DEPARTMENTS'</span></pre> <p style="padding-left: 30px;">4. Press <em><strong>Save</strong></em>.</p> <p>You now have a page with two before header processes, a breadcrumb region and an interactive report region.</p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/01/2_Page-2-editor-view.jpg" rel="lightbox[6391]"><img class="aligncenter size-full wp-image-6405" src="http://www.explorer.uk.com/wp-content/uploads/2018/01/2_Page-2-editor-view.jpg" alt="" width="1550" height="758" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/01/2_Page-2-editor-view.jpg 1550w, http://www.explorer.uk.com/wp-content/uploads/2018/01/2_Page-2-editor-view-300x147.jpg 300w, http://www.explorer.uk.com/wp-content/uploads/2018/01/2_Page-2-editor-view-768x376.jpg 768w, http://www.explorer.uk.com/wp-content/uploads/2018/01/2_Page-2-editor-view-1024x501.jpg 1024w" sizes="(max-width: 1550px) 100vw, 1550px" /></a></p> <p>Now run the page, the first process calls the Web Service and stores the JSON formatted response containing the department data into the CLOB column of the DEPT_JSON collection. The second process extracts the data held in the CLOB, parses it using apex_json.parse and the loops through each row in turn to build the DEPARTMENTS collection.</p> <p>The interactive report region then executes a simple query on the apex_collections table.</p> <p><strong>Accessing a GET method Web Service using apex_web_service<br /> </strong>An alternative to defining the Web Services within shared components is to use the apex_web_service PL/SQL API.</p> <p>Create a new blank page (3) called ‘Departments – API’ selecting the options to include the breadcrumb and navigation links. Add a Before Header process using the following properties.</p> <p style="padding-left: 30px;">1. Right-click on Before Header within Rendering &gt; Pre-Rendering.<br /> 2. Select ‘Create Process’ and enter the following properties.</p> <table class=" alignleft" style="height: 160px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 662.5px; text-align: left;">Name</td> <td style="width: 662.5px; text-align: left;">Create DEPARTMENTS collection from Web Service</td> </tr> </thead> <tbody> <tr> <td style="width: 662.5px;">Type</td> <td style="width: 662.5px;">PL/SQL Code</td> </tr> <tr> <td style="width: 662.5px;">PL/SQL Code</td> <td style="width: 662.5px;">See step 3</td> </tr> <tr> <td style="width: 662.5px;">Sequence</td> <td style="width: 662.5px;">10</td> </tr> </tbody> </table> <p>&nbsp;</p> <p style="padding-left: 30px;">3.  Use the following PL/SQL Code for the process to call the Web Service and add the data to a new collection called DEPARTMENTS2.</p> <pre style="padding-left: 60px;"><span style="font-family: courier new, courier, monospace;">DECLARE</span> <span style="font-family: courier new, courier, monospace;"> lc_data CLOB;</span> <span style="font-family: courier new, courier, monospace;"> lj_depts apex_json.t_values;</span> <span style="font-family: courier new, courier, monospace;">BEGIN</span> <span style="font-family: courier new, courier, monospace;"> -- Call the Web Service and store the JSON formatted response into a CLOB </span> <span style="font-family: courier new, courier, monospace;"> lc_data := apex_web_service.make_rest_request( </span> <span style="font-family: courier new, courier, monospace;"> ' http://localhost:8081/ords/api/hr/v1/all_departments','GET');</span> <span style="font-family: courier new, courier, monospace;">-- Parse the JSON data </span> <span style="font-family: courier new, courier, monospace;"> apex_json.parse(lj_depts, lc_data);</span> <span style="font-family: courier new, courier, monospace;"> -- Loop through each department in the JSON data and add to a new collection</span> <span style="font-family: courier new, courier, monospace;"> apex_collection.create_or_truncate_collection('DEPARTMENTS2');</span> <span style="font-family: courier new, courier, monospace;"> FOR dept_loop IN 1 .. apex_json.get_count(p_path =&gt; 'items', p_values =&gt; lj_depts) LOOP </span> <span style="font-family: courier new, courier, monospace;"> apex_collection.add_member(p_collection_name =&gt; 'DEPARTMENTS2',</span> <span style="font-family: courier new, courier, monospace;"> p_c001 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].deptno',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; dept_loop,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_depts),</span> <span style="font-family: courier new, courier, monospace;"> p_c002 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].dname',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; dept_loop,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_depts),</span> <span style="font-family: courier new, courier, monospace;"> p_c003 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].loc',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; dept_loop,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_depts)); </span> <span style="font-family: courier new, courier, monospace;"> END LOOP;</span> <span style="font-family: courier new, courier, monospace;">END;</span> </pre> <p style="padding-left: 30px;">4. Add an Interactive Report region named ‘Departments’ to the CONTENT BODY area using the following query.</p> <pre style="padding-left: 60px;"><span style="font-family: courier new, courier, monospace;">SELECT c001 dept_number, c002 dept_name, c003 location FROM apex_collections WHERE collection_name = 'DEPARTMENTS2'</span></pre> <p style="padding-left: 30px;">5. Save and run the page.</p> <p>When the page runs, the process calls the Web Service using the apex_web_service API and stores the response into a CLOB. The process then parses the CLOB and loops through each row to populate the DEPARTMENTS2 collection. The interactive report then executes a query on the apex_collections table.</p> <p><strong>Accessing a GET method Web Service protected with OAuth2 via Web Services References</strong><br /> To access an OAuth 2.0 protected Web Service we need a valid access token to pass in the HTTP header, which is generated using a client id and secret. Use the following PL/SQL to create a function within the ORDSDEMO schema to return the client credentials. If your APEX application is in a different schema you will need to grant EXECUTE privileges on the procedure.</p> <pre style="padding-left: 60px;"><span style="font-family: courier new, courier, monospace;">CREATE OR REPLACE PROCEDURE get_client_credentials(pv_name IN user_ords_clients.name%TYPE,</span> <span style="font-family: courier new, courier, monospace;"> pv_id_o OUT user_ords_clients.client_id%TYPE,</span> <span style="font-family: courier new, courier, monospace;"> pv_secret_o OUT user_ords_clients.client_secret%TYPE) </span> <span style="font-family: courier new, courier, monospace;">IS</span> <span style="font-family: courier new, courier, monospace;"> CURSOR c_client IS</span> <span style="font-family: courier new, courier, monospace;"> SELECT client_id, client_secret</span> <span style="font-family: courier new, courier, monospace;"> FROM user_ords_clients</span> <span style="font-family: courier new, courier, monospace;"> WHERE NAME = pv_name;</span> <span style="font-family: courier new, courier, monospace;">vr_client c_client%ROWTYPE;</span> <span style="font-family: courier new, courier, monospace;">BEGIN</span> <span style="font-family: courier new, courier, monospace;"> OPEN c_client;</span> <span style="font-family: courier new, courier, monospace;"> FETCH c_client</span> <span style="font-family: courier new, courier, monospace;"> INTO vr_client;</span> <span style="font-family: courier new, courier, monospace;"> CLOSE c_client;</span> <span style="font-family: courier new, courier, monospace;"> pv_id_o := vr_client.client_id;</span> <span style="font-family: courier new, courier, monospace;"> pv_secret_o := vr_client.client_secret;</span> <span style="font-family: courier new, courier, monospace;">END get_client_credentials;</span></pre> <p>Navigate to shared components, click on Web Service Reference and create a second entry using the following steps.</p> <p style="padding-left: 30px;">1. Click on <em><strong>Create</strong></em>.<br /> 2. Keep the default type of REST selected and press <em><strong>Next</strong></em>.<br /> 3. Enter the following values for the REST details and press <em><strong>Next</strong></em>.</p> <table class=" alignleft" style="height: 240px; width: 99.4199%;"> <thead> <tr style="height: 40px;"> <td style="width: 49.4553%; text-align: left;">Name</td> <td style="width: 49.0922%; text-align: left;">All Employees</td> </tr> </thead> <tbody> <tr> <td style="width: 49.4553%;">URL</td> <td style="width: 49.0922%;">http://localhost:8081/ords/api/hr/v1/all_employees</td> </tr> <tr> <td style="width: 49.4553%;">HTTP Method</td> <td style="width: 49.0922%;">GET</td> </tr> <tr> <td style="width: 49.4553%;">Basic Authentication</td> <td style="width: 49.0922%;">No</td> </tr> <tr> <td style="width: 49.4553%;">HTTP Request Header &gt; Name (1)</td> <td style="width: 49.0922%;">Authorization</td> </tr> <tr> <td style="width: 49.4553%;">HTTP Request Header &gt; Name (2)</td> <td style="width: 49.0922%;">department_number</td> </tr> </tbody> </table> <p style="padding-left: 30px;">4. We do not need any REST Inputs, so press <em><strong>Next</strong></em>.<br /> 5. Set the REST output type to JSON and press <em><strong>Create</strong></em>.</p> <p>At this stage, we cannot test the Web Service without a valid access token as it is protected.</p> <p>Now we have created a procedure to return the client credentials and added a Web Service Reference to return all employees we need to add a page to use them. Create a new blank page (4) called ‘Employees – WSR’ and follow these steps to add the various regions, items and processes.</p> <p style="padding-left: 30px;">1. Add a Standard region called ‘Department’ and add the following two hidden items.</p> <p style="padding-left: 60px;">a. P4_CLIENT_ID<br /> b. P4_CLIENT_SECRET</p> <p style="padding-left: 30px;">2. Add a select list item called P4_DEPT_NO to the region using the following properties.</p> <table class=" alignleft" style="height: 360px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 502.5px; text-align: left;">Name</td> <td style="width: 502.5px; text-align: left;">P4_DEPT_NO</td> </tr> </thead> <tbody> <tr> <td style="width: 502.5px;">Type</td> <td style="width: 502.5px;">Select List</td> </tr> <tr> <td style="width: 502.5px;">Label</td> <td style="width: 502.5px;">Department</td> </tr> <tr> <td style="width: 502.5px;">List of Values</td> <td style="width: 502.5px;">&#8211;</td> </tr> <tr> <td style="width: 502.5px;">Type</td> <td style="width: 502.5px;">SQL Query</td> </tr> <tr> <td style="width: 502.5px;">SQL Query</td> <td style="width: 502.5px;">SELECT dname, deptno FROM ordsdemo.dept ORDER BY dname</td> </tr> <tr> <td style="width: 502.5px;">Display NULL value</td> <td style="width: 502.5px;">Yes</td> </tr> <tr> <td style="width: 502.5px;">Null Display Value</td> <td style="width: 502.5px;">All</td> </tr> <tr> <td style="width: 502.5px;">Null Return Value</td> <td style="width: 502.5px;">Leave blank (NULL)</td> </tr> </tbody> </table> <p style="padding-left: 30px;">3. Add a dynamic action to P4_DEPT_NO using the following properties.</p> <table class=" alignleft" style="height: 320px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 553.5px; text-align: left;">Name</td> <td style="width: 553.5px; text-align: left;">Call Web Service and refresh Employees</td> </tr> </thead> <tbody> <tr> <td style="width: 553.5px;">Type</td> <td style="width: 553.5px;">Select List</td> </tr> <tr> <td style="width: 553.5px;">Label</td> <td style="width: 553.5px;">Department</td> </tr> <tr> <td style="width: 553.5px;">When</td> <td style="width: 553.5px;">&#8211;</td> </tr> <tr> <td style="width: 553.5px;">Event</td> <td style="width: 553.5px;">Change</td> </tr> <tr> <td style="width: 553.5px;">Selection Type</td> <td style="width: 553.5px;">Items(s)</td> </tr> <tr> <td style="width: 553.5px;">Item(s)</td> <td style="width: 553.5px;">P4_DEPT_NO</td> </tr> <tr> <td style="width: 553.5px;">TRUE action</td> <td style="width: 553.5px;">Submit Page</td> </tr> </tbody> </table> <p style="padding-left: 30px;">4. Add and interactive report region called ‘Employees’ below the department region using the following SQL.</p> <pre style="padding-left: 60px;"><span style="font-family: courier new, courier, monospace;">SELECT c001 dept_name, </span> <span style="font-family: courier new, courier, monospace;"> c002 emp_name, </span> <span style="font-family: courier new, courier, monospace;"> c003 job_title, </span> <span style="font-family: courier new, courier, monospace;"> c004 location,</span> <span style="font-family: courier new, courier, monospace;"> n001 empno,</span> <span style="font-family: courier new, courier, monospace;"> d001 hiredate</span> <span style="font-family: courier new, courier, monospace;">FROM apex_collections</span> <span style="font-family: courier new, courier, monospace;">WHERE collection_name = 'EMPLOYEES'</span></pre> <p style="padding-left: 30px;">5. Right-click on Before Header within Rendering &gt; Pre-Rendering and select ‘Create Process’ entering the following properties.</p> <table class=" alignleft" style="height: 160px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 417.5px; text-align: left;">Name</td> <td style="width: 417.5px; text-align: left;">Get Client Credentials</td> </tr> </thead> <tbody> <tr> <td style="width: 417.5px;">Type</td> <td style="width: 417.5px;">PL/SQL Code</td> </tr> <tr> <td style="width: 417.5px;">PL/SQL Code</td> <td style="width: 417.5px;">See step 3</td> </tr> <tr> <td style="width: 417.5px;">Sequence</td> <td style="width: 417.5px;">10</td> </tr> </tbody> </table> <p style="padding-left: 30px;">6. Use the following PL/SQL Code for the process (Client 1 has access to the3 Employee Web Services)</p> <pre style="padding-left: 60px;"><span style="font-family: courier new, courier, monospace;">ordsdemo.get_client_credentials(pv_name =&gt; 'Client 1',</span> <span style="font-family: courier new, courier, monospace;"> pv_id_o =&gt; :P4_CLIENT_ID,</span> <span style="font-family: courier new, courier, monospace;"> pv_secret_o =&gt; :P4_CLIENT_SECRET);</span></pre> <p style="padding-left: 30px;">7. Click on the processing tab and create a new process to call the Web Service each time the page is submitted using the following properties.</p> <table class=" alignleft" style="height: 280px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 565.5px; text-align: left;">Name</td> <td style="width: 565.5px; text-align: left;">Execution Options &gt; Point</td> </tr> </thead> <tbody> <tr> <td style="width: 565.5px;">Type</td> <td style="width: 565.5px;">Web Service</td> </tr> <tr> <td style="width: 565.5px;">Web Service Operation</td> <td style="width: 565.5px;">All Employees &#8211; doREST</td> </tr> <tr> <td style="width: 565.5px;">Store Result in</td> <td style="width: 565.5px;">Collection</td> </tr> <tr> <td style="width: 565.5px;">Collection Name</td> <td style="width: 565.5px;">EMPS_JSON</td> </tr> <tr> <td style="width: 565.5px;">Execution Options &gt; Sequence</td> <td style="width: 565.5px;">10</td> </tr> <tr> <td style="width: 565.5px;">Execution Options &gt; Point</td> <td style="width: 565.5px;">Processing</td> </tr> </tbody> </table> <p style="padding-left: 30px;">8. In the processing tree, expand the options beneath the process to display the two IN parameters.<br /> 9. Click on the ‘Authorization’ parameter, set the source to ‘PL/SQL Function Body’ and then enter the following PL/SQL to return the access token.</p> <pre style="padding-left: 60px;"><span style="font-family: courier new, courier, monospace;">BEGIN</span> <span style="font-family: courier new, courier, monospace;"> apex_web_service.oauth_authenticate(p_token_url =&gt; 'http://localhost:8081/ords/api/oauth/token',</span> <span style="font-family: courier new, courier, monospace;"> p_client_id =&gt; :P4_CLIENT_ID,</span> <span style="font-family: courier new, courier, monospace;"> p_client_secret =&gt; :P4_CLIENT_SECRET); </span> <span style="font-family: courier new, courier, monospace;"> RETURN 'Bearer '||apex_web_service.oauth_get_last_token;</span> <span style="font-family: courier new, courier, monospace;">END;</span></pre> <p style="padding-left: 30px;">10. Click on the ‘department_number’ parameter and set the source to ‘Item’ and the item to ‘P4_DEPT_NO’.<br /> 11. Add a second process using the following parameters.</p> <table class=" alignleft" style="height: 200px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 440.5px; text-align: left;">Name</td> <td style="width: 440.5px; text-align: left;">Populate Collection</td> </tr> </thead> <tbody> <tr> <td style="width: 440.5px;">Type</td> <td style="width: 440.5px;">PL/SQL Code</td> </tr> <tr> <td style="width: 440.5px;">PL/SQL Code</td> <td style="width: 440.5px;">See next step</td> </tr> <tr> <td style="width: 440.5px;">Execution Options &gt; Sequence</td> <td style="width: 440.5px;">20</td> </tr> <tr> <td style="width: 440.5px;">Execution Options &gt; Point</td> <td style="width: 440.5px;">Processing</td> </tr> </tbody> </table> <p style="padding-left: 30px;">12. Use the following PL/SQL for the process to get the response data and build a new collection of employees.</p> <pre style="padding-left: 60px;"><span style="font-family: courier new, courier, monospace;">DECLARE</span> <span style="font-family: courier new, courier, monospace;"> lc_data CLOB;</span> <span style="font-family: courier new, courier, monospace;"> lj_emps apex_json.t_values;</span> <span style="font-family: courier new, courier, monospace;">BEGIN</span> <span style="font-family: courier new, courier, monospace;"> select clob001 </span> <span style="font-family: courier new, courier, monospace;"> INTO lc_data</span> <span style="font-family: courier new, courier, monospace;"> from apex_collections </span> <span style="font-family: courier new, courier, monospace;"> where collection_name = 'EMPS_JSON';</span> <span style="font-family: courier new, courier, monospace;"> :P4_CLOB := lc_data;</span> <span style="font-family: courier new, courier, monospace;">apex_json.parse(lj_emps, lc_data); </span> <span style="font-family: courier new, courier, monospace;"> apex_collection.create_or_truncate_collection('EMPLOYEES'); </span> <span style="font-family: courier new, courier, monospace;"> FOR x IN 1 .. apex_json.get_count(p_path =&gt; 'items', p_values =&gt; lj_emps) LOOP </span> <span style="font-family: courier new, courier, monospace;"> apex_collection.add_member(p_collection_name =&gt; 'EMPLOYEES',</span> <span style="font-family: courier new, courier, monospace;"> p_c001 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].dname',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps),</span> <span style="font-family: courier new, courier, monospace;"> p_c002 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].ename',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps),</span> <span style="font-family: courier new, courier, monospace;"> p_c003 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].job',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps),</span> <span style="font-family: courier new, courier, monospace;"> p_c004 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].loc',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps),</span> <span style="font-family: courier new, courier, monospace;"> p_n001 =&gt; apex_json.get_number(p_path =&gt; 'items[%d].empno',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps),</span> <span style="font-family: courier new, courier, monospace;"> p_d001 =&gt; apex_json.get_date(p_path =&gt; 'items[%d].hiredate',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps)); </span> <span style="font-family: courier new, courier, monospace;"> END LOOP; </span> <span style="font-family: courier new, courier, monospace;">END;</span></pre> <p style="padding-left: 30px;">13. Save and run the page, selecting Accounting for the department.</p> <p>When the page runs, the pre-rendering process obtains the client id and secret for Client 1 and stores them in the two hidden items.</p> <p>Each time the department select list is changed the dynamic action submits the page and runs the processes to call the Web Service and process the results.</p> <p>The parameters for the Web Services are populated automatically before it runs. The Authorization parameter is populated with a new access token using the oauth_authenticate procedure in conjunction with the client id and secret.</p> <p>The department_number is set to the value of P4_DEPT_NO item.</p> <p>The populate collection process then obtains the JSON results from the collection, parses it and then loops through each employee adding the details to a new collection for the Interactive report region to query.</p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/01/3_Employees-and-OAuth.jpg" rel="lightbox[6391]"><img class="aligncenter size-full wp-image-6410" src="http://www.explorer.uk.com/wp-content/uploads/2018/01/3_Employees-and-OAuth.jpg" alt="" width="1182" height="615" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/01/3_Employees-and-OAuth.jpg 1182w, http://www.explorer.uk.com/wp-content/uploads/2018/01/3_Employees-and-OAuth-300x156.jpg 300w, http://www.explorer.uk.com/wp-content/uploads/2018/01/3_Employees-and-OAuth-768x400.jpg 768w, http://www.explorer.uk.com/wp-content/uploads/2018/01/3_Employees-and-OAuth-1024x533.jpg 1024w" sizes="(max-width: 1182px) 100vw, 1182px" /></a></p> <p><strong>Accessing an OAuth2 protected GET method Web Service via apex_web_service</strong><br /> As we did for page 3, we can use the apex_web_service PL/SQL API to call the Web Service directly. To do this we can copy page 4 and amend it.</p> <p style="padding-left: 30px;">1. Open page 4.<br /> 2. Click on the ‘Create’ icon and then select ‘Page as Copy’.<br /> 3. Leave ‘Page in this application’ selected and press <em><strong>Next</strong></em>.<br /> 4. Enter 5 for the new page number and ‘Employees – API’ for the name. Press <em><strong>Next</strong></em>.<br /> 5. Select ‘Create a new navigation menu entry’. Press <em><strong>Next</strong></em>.<br /> 6. Press <em><strong>Copy</strong></em>.</p> <p>We no longer need the process to call the web service so this can be deleted. To do this simply highlight the process in the tree and press delete. Now we need to update the process that populates to the collection so that it also calls the Web Service. We also need to generate an access token to pass as a parameter along with the department number. To do this update the PL/SQL code with the following.</p> <pre style="padding-left: 60px;"><span style="font-family: courier new, courier, monospace;">DECLARE</span> <span style="font-family: courier new, courier, monospace;"> lc_data CLOB;</span> <span style="font-family: courier new, courier, monospace;"> lj_emps apex_json.t_values;</span> <span style="font-family: courier new, courier, monospace;">BEGIN</span> <span style="font-family: courier new, courier, monospace;"> -- Generate access tokem</span> <span style="font-family: courier new, courier, monospace;"> apex_web_service.oauth_authenticate(p_token_url =&gt; 'http://localhost:8081/ords/api/oauth/token',</span> <span style="font-family: courier new, courier, monospace;"> p_client_id =&gt; :P5_CLIENT_ID,</span> <span style="font-family: courier new, courier, monospace;"> p_client_secret =&gt; :P5_CLIENT_SECRET);</span> <span style="font-family: courier new, courier, monospace;"> -- Set parameter values</span> <span style="font-family: courier new, courier, monospace;"> apex_web_service.g_request_headers(1).name := 'Authorization';</span> <span style="font-family: courier new, courier, monospace;"> apex_web_service.g_request_headers(1).value := 'Bearer ' || apex_web_service.g_oauth_token.token;</span> <span style="font-family: courier new, courier, monospace;"> apex_web_service.g_request_headers(2).name := 'department_number';</span> <span style="font-family: courier new, courier, monospace;"> apex_web_service.g_request_headers(2).value := :P5_DEPT_NO;</span> <span style="font-family: courier new, courier, monospace;"> -- Call Web Servive</span> <span style="font-family: courier new, courier, monospace;"> lc_data := apex_web_service.make_rest_request(p_url =&gt; 'http://localhost:8081/ords/api/hr/v1/all_employees',</span> <span style="font-family: courier new, courier, monospace;"> p_http_method =&gt; 'GET'); </span> <span style="font-family: courier new, courier, monospace;"> :P5_CLOB := lc_data; </span> <span style="font-family: courier new, courier, monospace;"> apex_json.parse(lj_emps, lc_data); </span> <span style="font-family: courier new, courier, monospace;"> -- Loop through all returned employees and build new collection</span> <span style="font-family: courier new, courier, monospace;"> apex_collection.create_or_truncate_collection('EMPLOYEES2'); </span> <span style="font-family: courier new, courier, monospace;"> FOR x IN 1 .. apex_json.get_count(p_path =&gt; 'items', p_values =&gt; lj_emps) LOOP </span> <span style="font-family: courier new, courier, monospace;"> apex_collection.add_member(p_collection_name =&gt; 'EMPLOYEES2',</span> <span style="font-family: courier new, courier, monospace;"> p_c001 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].dname',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps),</span> <span style="font-family: courier new, courier, monospace;"> p_c002 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].ename',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps),</span> <span style="font-family: courier new, courier, monospace;"> p_c003 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].job',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps),</span> <span style="font-family: courier new, courier, monospace;"> p_c004 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].loc',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps),</span> <span style="font-family: courier new, courier, monospace;"> p_n001 =&gt; apex_json.get_number(p_path =&gt; 'items[%d].empno',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps),</span> <span style="font-family: courier new, courier, monospace;"> p_d001 =&gt; apex_json.get_date(p_path =&gt; 'items[%d].hiredate',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps)); </span> <span style="font-family: courier new, courier, monospace;"> END LOOP; </span> <span style="font-family: courier new, courier, monospace;">END;</span></pre> <p>Finally, update the SQL query for the Employees interactive report to use the collection name ‘EMPLOYEES2’. Now save and run the page, selecting Accounting for the department.</p> <p>As before, when the page runs the pre-render process obtains the client id and secret. When department is changed the page is submitted and the process to call the Web Service runs. This time the process generates the access token and then uses the apex_web_service API to set the values of the two HTTP header parameters before calling the Web Service and processing the JSON response to build the employee collection.</p> <p><strong>Dealing with paginated JSON data</strong><br /> The previous examples have all called Web Services that return non-paginated JSON data; however, when they return large volumes of data the responses are typically paginated. This example uses the original Employees GET method Web Services that paginates the employees into sets of five. As we did for page 5 we will start by copying page 4.</p> <p style="padding-left: 30px;">1. Open page 4.<br /> 2. Click on the ‘Create’ icon and then select ‘Page as Copy’.<br /> 3. Leave ‘Page in this application’ selected and press <em><strong>Next</strong></em>.<br /> 4. Enter 6 for the new page number and ‘Pagination’ for the name. Press <em><strong>Next</strong></em>.<br /> 5. Select ‘Create a new navigation menu entry’. Press <em><strong>Next</strong></em>.<br /> 6. Press <em><strong>Copy</strong></em>.</p> <p>We no longer need either of the two processes to call the web service or populate the collection so delete them both. Keep the pre-rendering process to get the client credentials, as this is still required.</p> <p>When a Web Service returns paginated data it will also contain navigation links (e.g. next, previous and first) which we can extract. The links will consist of the URL to call the web service with the addition of a URI parameter to instruct the Web Service which page of data to return. In this example, we will extract the links and store them in three text items. We will then add navigation buttons to the report region to use the links.</p> <p style="padding-left: 30px;">1. Add the following four items to the Department region below P6_CLOB.</p> <p style="padding-left: 60px;">a. P6_URL (hidden)<br /> b. P6_PREV (display only)<br /> c. P6_NEXT (display only)<br /> d. P6_FIRST (display only)</p> <p style="padding-left: 30px;">2. Change the report type of the Employees region from Interactive Report to Classic Report and change the collection name used in the SQL query to ‘EMPLOYEES3’. Change the pagination type within the reports attributes to ‘No Pagination (Show All Rows)’.<br /> 3. Create a new custom dynamic action with the following properties to call the Web Service and populate the EMPLOYEES3 collection.</p> <table class=" alignleft" style="width: 100%; height: 200px;"> <thead> <tr style="height: 40px;"> <td style="width: 47.2137%; text-align: center;">Name</td> <td style="width: 51.5436%; text-align: center;">Call API and populate collection</td> </tr> </thead> <tbody> <tr> <td style="width: 47.2137%;">Event</td> <td style="width: 51.5436%;">Custom</td> </tr> <tr> <td style="width: 47.2137%;">Custom Event</td> <td style="width: 51.5436%;">CallEmployeeAPI</td> </tr> <tr> <td style="width: 47.2137%;">Selection Type</td> <td style="width: 51.5436%;">JavaScript Expression</td> </tr> <tr> <td style="width: 47.2137%;">JavaScript Expression</td> <td style="width: 51.5436%;">document</td> </tr> </tbody> </table> <p style="padding-left: 30px;">4. Update the Show TRUE action using the following properties.</p> <table class=" alignleft" style="width: 100%; height: 200px;"> <thead> <tr style="height: 40px;"> <td style="width: 47.1199%;">Action</td> <td style="width: 51.6374%;">Execute PL/SQL Code</td> </tr> </thead> <tbody> <tr> <td style="width: 47.1199%;">PL/SQL Code</td> <td style="width: 51.6374%;">See step 5</td> </tr> <tr> <td style="width: 47.1199%;">Items to Return</td> <td style="width: 51.6374%;">P6_CLOB,P6_NEXT,P6_PREV,P6_FIRST</td> </tr> <tr> <td style="width: 47.1199%;">Event</td> <td style="width: 51.6374%;">Call API and populate collection</td> </tr> <tr> <td style="width: 47.1199%;">Sequence</td> <td style="width: 51.6374%;">10</td> </tr> </tbody> </table> <p style="padding-left: 30px;">5. Use the following for the PL/SQL code for the TRU action.</p> <pre style="padding-left: 60px;"><span style="font-family: courier new, courier, monospace;">DECLARE</span> <span style="font-family: courier new, courier, monospace;"> lc_data CLOB;</span> <span style="font-family: courier new, courier, monospace;"> lj_emps apex_json.t_values;</span> <span style="font-family: courier new, courier, monospace;"> lv_token VARCHAR2(100);</span> <span style="font-family: courier new, courier, monospace;">BEGIN</span> <span style="font-family: courier new, courier, monospace;"> -- Generate a new access token using the client credentials</span> <span style="font-family: courier new, courier, monospace;"> apex_web_service.oauth_authenticate(p_token_url =&gt; 'http://localhost:8081/ords/api/oauth/token',</span> <span style="font-family: courier new, courier, monospace;"> p_client_id =&gt; :P6_CLIENT_ID,</span> <span style="font-family: courier new, courier, monospace;"> p_client_secret =&gt; :P6_CLIENT_SECRET);</span> <span style="font-family: courier new, courier, monospace;"> lv_token := apex_web_service.oauth_get_last_token; </span> <span style="font-family: courier new, courier, monospace;"> IF lv_token IS NOT NULL THEN</span> <span style="font-family: courier new, courier, monospace;"> -- Set Paramaters </span> <span style="font-family: courier new, courier, monospace;"> apex_web_service.g_request_headers(1).name := 'Authorization';</span> <span style="font-family: courier new, courier, monospace;"> apex_web_service.g_request_headers(1).value := 'Bearer ' || lv_token;</span> <span style="font-family: courier new, courier, monospace;"> apex_web_service.g_request_headers(2).name := 'department_number';</span> <span style="font-family: courier new, courier, monospace;"> apex_web_service.g_request_headers(2).value := :P6_DEPT_NO;</span> <span style="font-family: courier new, courier, monospace;"> -- Call the Web Service and store the JSON formatted response into a CLOB </span> <span style="font-family: courier new, courier, monospace;"> lc_data := apex_web_service.make_rest_request(p_url =&gt; NVL(:P6_URL,'http://localhost:8081/ords/api/hr/v1/employees'),</span> <span style="font-family: courier new, courier, monospace;"> p_http_method =&gt; 'GET'); </span> <span style="font-family: courier new, courier, monospace;"> -- Parse JSON data and extract data into collection </span> <span style="font-family: courier new, courier, monospace;"> apex_json.parse(lj_emps, lc_data); </span> <span style="font-family: courier new, courier, monospace;"> apex_collection.create_or_truncate_collection('EMPLOYEES3'); </span> <span style="font-family: courier new, courier, monospace;"> FOR x IN 1 .. apex_json.get_count(p_path =&gt; 'items', p_values =&gt; lj_emps) LOOP</span> <span style="font-family: courier new, courier, monospace;"> apex_collection.add_member(p_collection_name =&gt; 'EMPLOYEES3',</span> <span style="font-family: courier new, courier, monospace;"> p_c001 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].dname',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps),</span> <span style="font-family: courier new, courier, monospace;"> p_c002 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].ename',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps),</span> <span style="font-family: courier new, courier, monospace;"> p_c003 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].job',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps),</span> <span style="font-family: courier new, courier, monospace;"> p_c004 =&gt; apex_json.get_varchar2(p_path =&gt; 'items[%d].loc',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps),</span> <span style="font-family: courier new, courier, monospace;"> p_n001 =&gt; apex_json.get_number(p_path =&gt; 'items[%d].empno',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps),</span> <span style="font-family: courier new, courier, monospace;"> p_d001 =&gt; apex_json.get_date(p_path =&gt; 'items[%d].hiredate',</span> <span style="font-family: courier new, courier, monospace;"> p0 =&gt; x,</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps)); </span> <span style="font-family: courier new, courier, monospace;"> END LOOP;</span> <span style="font-family: courier new, courier, monospace;"> END IF;</span> <span style="font-family: courier new, courier, monospace;"> :P6_CLOB := lc_data; </span> <span style="font-family: courier new, courier, monospace;"> :P6_NEXT := apex_json.get_varchar2(p_path =&gt; 'next."$ref"',</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps);</span> <span style="font-family: courier new, courier, monospace;"> :P6_FIRST := apex_json.get_varchar2(p_path =&gt; 'first."$ref"',</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps);</span> <span style="font-family: courier new, courier, monospace;"> :P6_PREV := apex_json.get_varchar2(p_path =&gt; 'prev."$ref"',</span> <span style="font-family: courier new, courier, monospace;"> p_values =&gt; lj_emps);</span> <span style="font-family: courier new, courier, monospace;">END;</span></pre> <p style="padding-left: 30px;">6. Add a second TRUE action to refresh the Employees classic report region.</p> <table class=" alignleft" style="height: 200px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 388px; text-align: left;">Action</td> <td style="width: 388px; text-align: left;">Refresh</td> </tr> </thead> <tbody> <tr> <td style="width: 388px;">Selection Type</td> <td style="width: 388px;">Region</td> </tr> <tr> <td style="width: 388px;">Region</td> <td style="width: 388px;">Employees</td> </tr> <tr> <td style="width: 388px;">Event</td> <td style="width: 388px;">Call API and populate collection</td> </tr> <tr> <td style="width: 388px;">Sequence</td> <td style="width: 388px;">20</td> </tr> </tbody> </table> <p>We now have a custom dynamic action to call the web service, process the response into a collection and extract the next, previous and first URL links. We can now add some navigation buttons to the page to call it and return the relevant pages of employee data. We can also call it when the page loads so the page is not blank when first opened.</p> <p style="padding-left: 30px;">1. Create a page load Dynamic Action using the following properties.</p> <table class=" alignleft" style="height: 80px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 497px; text-align: left;">Name</td> <td style="width: 497px; text-align: left;">Call Web Service on page load</td> </tr> </thead> <tbody> <tr> <td style="width: 497px;">Event</td> <td style="width: 497px;">Page Load</td> </tr> </tbody> </table> <p style="padding-left: 30px;">2. Update the show TRUE action using the following properties to call the custom dynamic action when the page loads..</p> <table class=" alignleft" style="height: 160px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 516.5px; text-align: left;">Action</td> <td style="width: 516.5px; text-align: left;">Execute JavaScript Code</td> </tr> </thead> <tbody> <tr> <td style="width: 516.5px;">Code</td> <td style="width: 516.5px;">apex.event.trigger(document,&#8221;CallEmployeeAPI&#8221;);</td> </tr> <tr> <td style="width: 516.5px;">Event</td> <td style="width: 516.5px;">Call Web Service on page load</td> </tr> <tr> <td style="width: 516.5px;">Sequence</td> <td style="width: 516.5px;">10</td> </tr> </tbody> </table> <p style="padding-left: 30px;">3. Next, we need to change the existing dynamic action ‘Refresh Employees’ that runs when the department select list is changed (P6_DEPT_NO). Change the Submit Page action to Execute PL/SQL Code using the following properties.</p> <table class=" alignleft" style="height: 200px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 534.5px; text-align: left;">Action</td> <td style="width: 534.5px; text-align: left;">Execute PL/SQL Code</td> </tr> </thead> <tbody> <tr> <td style="width: 534.5px;">PL/SQL Code</td> <td style="width: 534.5px;">:P6_URL := &#8216;http://localhost:8081/ords/api/hr/v1/employees&#8217;;</td> </tr> <tr> <td style="width: 534.5px;">Items to Submit</td> <td style="width: 534.5px;">P6_DEPT_NO</td> </tr> <tr> <td style="width: 534.5px;">Items to Return</td> <td style="width: 534.5px;">P6_URL</td> </tr> <tr> <td style="width: 534.5px;">Sequence</td> <td style="width: 534.5px;">10</td> </tr> </tbody> </table> <p style="padding-left: 30px;">4. Now add the following second action.</p> <table class=" alignleft" style="height: 120px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 473px; text-align: left;">Action</td> <td style="width: 473px; text-align: left;">Execute JavaScript Code</td> </tr> </thead> <tbody> <tr> <td style="width: 473px;">Code</td> <td style="width: 473px;">apex.event.trigger(document,&#8221;CallEmployeeAPI&#8221;);</td> </tr> <tr> <td style="width: 473px;">Sequence</td> <td style="width: 473px;">20</td> </tr> </tbody> </table> <p style="padding-left: 30px;">5. Save and run the page.</p> <p>When the page first loads the pre-rendering process obtains the client credentials. Next, the Page Load dynamic action calls the custom dynamic action, which in turn calls the Web Service, populates the employee collection, extracts the navigation links and refreshes the employee classic report region. Each time the department is changed the custom dynamic action is called to refresh the links and employee region.</p> <p>Now we need to add some buttons that use the navigation links to page through the employees.</p> <p style="padding-left: 30px;">1. Add three buttons to the employee region as follows.</p> <table class=" alignleft" style="height: 120px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 426px; text-align: left;">FIRST</td> <td style="width: 426px; text-align: left;">Button Position: Previous</td> </tr> </thead> <tbody> <tr> <td style="width: 426px;">PREVIOUS</td> <td style="width: 426px;">Button Position: Previous</td> </tr> <tr> <td style="width: 426px;">NEXT</td> <td style="width: 426px;">Button Position: Next</td> </tr> </tbody> </table> <p style="padding-left: 30px;">2. Add a click event dynamic action to the FIRST button with the name ‘Go to first page’ and then add the following two TRUE actions.</p> <table class=" alignleft" style="height: 200px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 480.5px; text-align: left;">Action 1</td> <td style="width: 480.5px; text-align: left;"></td> </tr> </thead> <tbody> <tr> <td style="width: 480.5px;">Action</td> <td style="width: 480.5px;">Execute PL/SQL Code</td> </tr> <tr> <td style="width: 480.5px;">PL/SQL Code</td> <td style="width: 480.5px;">:P6_URL := :P6_FIRST;</td> </tr> <tr> <td style="width: 480.5px;">Items to Return</td> <td style="width: 480.5px;">P6_URL</td> </tr> <tr> <td style="width: 480.5px;">Sequence</td> <td style="width: 480.5px;">10</td> </tr> </tbody> </table> <table class=" alignleft" style="height: 160px;" width="100%"> <thead> <tr style="height: 40px;"> <td style="width: 50%; text-align: left;">Action 2</td> <td style="width: 602.5px; text-align: left;"></td> </tr> </thead> <tbody> <tr> <td style="width: 50%;">Action</td> <td style="width: 602.5px;">Execute JavaScript Code</td> </tr> <tr> <td style="width: 50%;">Code</td> <td style="width: 602.5px;">apex.event.trigger(document,&#8221;CallEmployeeAPI&#8221;);</td> </tr> <tr> <td style="width: 50%;">Sequence</td> <td style="width: 602.5px;">20</td> </tr> </tbody> </table> <p style="padding-left: 30px;">3. Add a click event dynamic action to the PREVIOUS button with the name ‘Go to previous page’ and then add the following two TRUE actions.</p> <table class=" alignleft" style="height: 200px;" width="100%"> <thead> <tr> <td style="width: 50%;">Action 1</td> <td></td> </tr> </thead> <tbody> <tr> <td style="width: 50%;">Action</td> <td>Execute PL/SQL Code</td> </tr> <tr> <td style="width: 50%;">PL/SQL Code</td> <td>:P6_URL := :P6_PREV;</td> </tr> <tr> <td style="width: 50%;">Items to Return</td> <td>P6_URL</td> </tr> <tr> <td style="width: 50%;">Sequence</td> <td>10</td> </tr> </tbody> </table> <table class=" alignleft" style="height: 160px;" width="100%"> <thead> <tr> <td style="width: 50%;">Action 2</td> <td></td> </tr> </thead> <tbody> <tr> <td style="width: 50%;">Action</td> <td>Execute JavaScript Code</td> </tr> <tr> <td style="width: 50%;">Code</td> <td>apex.event.trigger(document,&#8221;CallEmployeeAPI&#8221;);</td> </tr> <tr> <td style="width: 50%;">Sequence</td> <td>20</td> </tr> </tbody> </table> <p style="padding-left: 30px;">4. Add a click event dynamic action to the NEXT button with the name ‘Go to next page’ and then add the following two TRUE actions.</p> <table class=" alignleft" style="height: 200px;" width="100%"> <thead> <tr> <td style="width: 50%;">Action 1</td> <td></td> </tr> </thead> <tbody> <tr> <td style="width: 50%;">Action</td> <td>Execute PL/SQL Code</td> </tr> <tr> <td style="width: 50%;">PL/SQL Code</td> <td>:P6_URL := :P6_NEXT;</td> </tr> <tr> <td style="width: 50%;">Items to Return</td> <td>P6_URL</td> </tr> <tr> <td style="width: 50%;">Sequence</td> <td>10</td> </tr> </tbody> </table> <table class=" alignleft" style="height: 160px;" width="100%"> <thead> <tr> <td style="width: 50%;">Action 2</td> <td></td> </tr> </thead> <tbody> <tr> <td style="width: 50%;">Action</td> <td>Execute JavaScript Code</td> </tr> <tr> <td style="width: 50%;">Code</td> <td>apex.event.trigger(document,&#8221;CallEmployeeAPI&#8221;);</td> </tr> <tr> <td style="width: 50%;">Sequence</td> <td>20</td> </tr> </tbody> </table> <p style="padding-left: 30px;">5. Save and run the page selecting ALL departments.</p> <p><a href="http://www.explorer.uk.com/wp-content/uploads/2018/01/4_Pagination.jpg" rel="lightbox[6391]"><img class="aligncenter size-full wp-image-6419" src="http://www.explorer.uk.com/wp-content/uploads/2018/01/4_Pagination.jpg" alt="" width="1246" height="674" srcset="http://www.explorer.uk.com/wp-content/uploads/2018/01/4_Pagination.jpg 1246w, http://www.explorer.uk.com/wp-content/uploads/2018/01/4_Pagination-300x162.jpg 300w, http://www.explorer.uk.com/wp-content/uploads/2018/01/4_Pagination-768x415.jpg 768w, http://www.explorer.uk.com/wp-content/uploads/2018/01/4_Pagination-1024x554.jpg 1024w" sizes="(max-width: 1246px) 100vw, 1246px" /></a>You will see that the returned JSON data contains five employee records and the navigation links. The links have been extracted and displayed in the relevant display only items. The employee classic report shows the first five employees.</p> <p>If you press the ‘Next’ button, the Web Service will be called again, but this time using the link from P6_NEXT, which is suffixed with the page number to display. The returned JSON response now contains the next five employees and the new navigation links. You will notice that this time there is also a previous link as we are displaying the second page of employees. You can now use the three buttons to page back and forward through all of the employees.</p> <p>To complete the page we need to make sure the next button is hidden when we are on the last page of employees and the previous button hidden when on the first. One way to do this is to add dynamic actions to P6_PREV and P6_NEXT as follows.</p> <p style="padding-left: 30px;">1. Create a change event dynamic action for P6_PREV with the following properties.</p> <table class=" alignleft" style="height: 240px;" width="100%"> <thead> <tr> <td style="width: 50%;">Name</td> <td style="width: 579px;">Show/Hide Previous Button</td> </tr> </thead> <tbody> <tr> <td style="width: 50%;">Event</td> <td style="width: 579px;">Change</td> </tr> <tr> <td style="width: 50%;">Selection Type</td> <td style="width: 579px;">Item(s)</td> </tr> <tr> <td style="width: 50%;">Item(s)</td> <td style="width: 579px;">P6_PREV</td> </tr> <tr> <td style="width: 50%;">Client-side Condition: Type</td> <td style="width: 579px;">Item is not null</td> </tr> <tr> <td style="width: 50%;">Client-side Condition: Item</td> <td style="width: 579px;">P6_PREV</td> </tr> </tbody> </table> <p style="padding-left: 30px;">2. Add the following TRUE and FALSE actions to the dynamic action.</p> <table class=" alignleft" style="height: 200px;" width="100%"> <thead> <tr> <td style="width: 50%;">TRUE Action</td> <td></td> </tr> </thead> <tbody> <tr> <td style="width: 50%;">Action</td> <td>Show</td> </tr> <tr> <td style="width: 50%;">Affected Elements: Selection Type</td> <td>Button</td> </tr> <tr> <td style="width: 50%;">Button</td> <td>PREVIOUS</td> </tr> </tbody> </table> <table class=" alignleft" style="height: 200px;" width="100%"> <thead> <tr> <td style="width: 50%;">FALSE Action</td> <td></td> </tr> </thead> <tbody> <tr> <td style="width: 50%;">Action</td> <td>Hide</td> </tr> <tr> <td style="width: 50%;">Code</td> <td>Button</td> </tr> <tr> <td style="width: 50%;">Sequence</td> <td>PREVIOUS</td> </tr> </tbody> </table> <p style="padding-left: 30px;">3. Create a change event dynamic action for P6_NEXT with the following properties.</p> <table class=" alignleft" style="height: 240px;" width="100%"> <thead> <tr> <td style="width: 50%;">Name</td> <td>Show/Hide Previous Button</td> </tr> </thead> <tbody> <tr> <td style="width: 50%;">Event</td> <td>Change</td> </tr> <tr> <td style="width: 50%;">Selection Type</td> <td>Item(s)</td> </tr> <tr> <td style="width: 50%;">Item(s)</td> <td>P6_NEXT</td> </tr> <tr> <td style="width: 50%;">Client-side Condition: Type</td> <td>Item is not null</td> </tr> <tr> <td style="width: 50%;">Client-side Condition: Item</td> <td>P6_NEXT</td> </tr> </tbody> </table> <p style="padding-left: 30px;">4. Add the following TRUE and FALSE actions to the dynamic action.</p> <table class=" alignleft" style="height: 200px;" width="100%"> <thead> <tr> <td style="width: 50%;">TRUE Action</td> <td></td> </tr> </thead> <tbody> <tr> <td style="width: 50%;">Action</td> <td>Show</td> </tr> <tr> <td style="width: 50%;">Affected Elements: Selection Type</td> <td>Button</td> </tr> <tr> <td style="width: 50%;">Button</td> <td>NEXT</td> </tr> </tbody> </table> <table class=" alignleft" style="height: 200px;" width="100%"> <thead> <tr> <td style="width: 50%;">FALSE Action</td> <td style="width: 50%;"></td> </tr> </thead> <tbody> <tr> <td style="width: 50%;">Action</td> <td style="width: 50%;">Hide</td> </tr> <tr> <td style="width: 50%;">Code</td> <td style="width: 50%;">Button</td> </tr> <tr> <td style="width: 50%;">Sequence</td> <td style="width: 50%;">NEXT</td> </tr> </tbody> </table> <p style="padding-left: 30px;">5. Save and run the page.</p> <p>Now when the page runs the next and previous buttons are only displayed if there is an applicable link.</p> <p><strong>POST, PUT and DELETE requests</strong><br /> You can also use the apex_web_service API to call POST, PUT and DELETE method Web Services. For Example, you could add a departments maintenance page to call the Web Services we created in part one to add, update and delete departments.</p> <p>To do this simply set the HTTP method parameter to POST, PUT or DELETE as applicable when calling the make_rest_request function and then use apex_json.get_varchar2 to extract the results from the response.</p> <p>You can also use apex_web_service.g_status_code to get the response status code to check of the Web Service call returned a successful 200 OK status.</p> <p>The post <a rel="nofollow" href="http://www.explorer.uk.com/ordsoauth2-web-services-in-apex-part-3/">ORDS, OAuth2 &#038; Web Services in APEX &#8211; Part 3</a> appeared first on <a rel="nofollow" href="http://www.explorer.uk.com">Explorer | Award Winning UK Oracle Partner</a>.</p> admin http://www.explorer.uk.com/?p=6391 Thu Jan 11 2018 05:34:01 GMT-0500 (EST) Can you use Oracle Database Unified Auditing with Oracle APEX? http://joelkallman.blogspot.com/2018/01/can-you-use-database-auditing-with.html A customer asked me this morning:<br /><br /><div style="text-align: center;"><i><span style="font-size: large;">"Can we monitor the table access from an APEX application?"</span></i></div><br />This is a security-minded customer, who was also interested in the use of <a href="https://www.oracle.com/database/database-vault/index.html" target="_blank">Oracle Database Vault</a> to help protect unauthorized access to&nbsp;<a href="https://en.wikipedia.org/wiki/Personally_identifiable_information" target="_blank">personally identifiable information</a> which would be maintained in their database tables.&nbsp; The only access to these tables would be through their APEX applications (for now), and they wanted to be able to monitor access to these tables.&nbsp; While Oracle offers a very robust, enterprise solution in this problem domain named <a href="https://www.oracle.com/database/security/audit-vault-database-firewall/index.html" target="_blank">Oracle Audit Vault and Database Firewall</a>, auditing via the native database functionality would be sufficient for now.<br /><br />This blog post is not intended to be a complete treatise on the subject of database auditing in the Oracle Database, there is <a href="https://docs.oracle.com/en/database/oracle/oracle-database/12.2/dbseg/introduction-to-auditing.html" target="_blank">already a lot of documentation</a> on this topic.&nbsp; This blog post is a simple proof that auditing can be enabled to track accesses from an APEX application and how to see the audit log entries.<br /><br /><ol><li>&nbsp; I created a simple APEX application based upon an updated version of the TASKS CSV file, used in <a href="http://www.oracle.com/technetwork/issue-archive/2015/15-sep/o55browser-apex-2692805.html" target="_blank">this 2015 Oracle Magazine article</a>.&nbsp; This was done in the JOEL_DB schema.&nbsp; The Interactive Report on page 1 is based upon the query:<br /><br /><pre class="brush:sql;toolbar:false;">select id, project, task_name, start_date, end_date, status, assigned_to, cost, budget<br /> from tasks<br /></pre><br />The application&nbsp;looked like:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-UQg9RY566sc/WlUpoZ00tkI/AAAAAAAADmM/cil1BZ-Uy3g8LK9Oxs72jEPokUw_nZlcACLcBGAs/s1600/APEX_app.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="788" data-original-width="1181" height="266" src="https://4.bp.blogspot.com/-UQg9RY566sc/WlUpoZ00tkI/AAAAAAAADmM/cil1BZ-Uy3g8LK9Oxs72jEPokUw_nZlcACLcBGAs/s400/APEX_app.png" width="400" /></a></div><br /><br /><br /></li><li>I created an audit policy named JOEL_TASKS_POLICY and enabled it using the following SQL:<br /><br /><pre class="brush:sql;toolbar:false;">create audit policy joel_tasks_policy actions <br /> select on joel_db.tasks, <br /> update on joel_db.tasks, <br /> delete on joel_db.tasks, <br /> insert on joel_db.tasks;<br /></pre><br />Note:&nbsp; This is Oracle Database 12cR2.&nbsp; Before beginning this step, I ensured that the <a href="https://docs.oracle.com/en/database/oracle/oracle-database/12.2/tdpsg/auditing-database-activity.html#GUID-9F687165-559C-4C7E-9B3F-41BAEFB2DE32" target="_blank">database was configured for Unified Auditing</a>.<br /><div><br /></div></li><li>I ran the following SQL statement to validate existence of the audit policy: <br /><pre class="brush:sql;toolbar:false;">SQL&gt; <br /><br />select audit_option, object_schema, object_name <br /> from audit_unified_policies <br /> where policy_name = 'JOEL_TASKS_POLICY';<br /><br />AUDIT_OPTION OBJECT_SCHEMA OBJECT_NAME<br />DELETE JOEL_DB TASKS<br />INSERT JOEL_DB TASKS<br />SELECT JOEL_DB TASKS<br />UPDATE JOEL_DB TASKS<br /></pre><br /></li><li>I stopped and restarted <a href="http://www.oracle.com/technetwork/developer-tools/rest-data-services/overview/index.html" target="_blank">Oracle REST Data Services (ORDS)</a>.&nbsp; This is important, because the policy will only take effect for database sessions established <b>after</b> the audit policy was enabled.&nbsp; Since ORDS maintains a pool of database sessions, I needed to nuke the existing sessions and establish new ones.<br /><br /></li><li>I ran the page a few times in my APEX application using the Interactive Report.<br /><br /></li><li>As a DBA, I queried the database view UNIFIED_AUDIT_TRAIL using the following query:<br /><pre class="brush:sql;toolbar:false;">select dbusername, action_name, event_timestamp, scn, <br /> object_schema, object_name, sql_text, sql_binds, client_identifier <br /> from unified_audit_trail <br /> where unified_audit_policies = 'JOEL_TASKS_POLICY' <br /> and object_schema = 'JOEL_DB' <br /> order by event_timestamp desc<br /></pre><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/--SJZaMRrJpI/WlUpyBXXpmI/AAAAAAAADmQ/IuQk7I4x3yUmdzbLbyG0QjnyXAVVDdc3QCLcBGAs/s1600/sqldev_audit_out.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="181" data-original-width="1512" height="76" src="https://4.bp.blogspot.com/--SJZaMRrJpI/WlUpyBXXpmI/AAAAAAAADmQ/IuQk7I4x3yUmdzbLbyG0QjnyXAVVDdc3QCLcBGAs/s640/sqldev_audit_out.png" width="640" /></a></div><br /><br />and voila!&nbsp; You can easily see that the SELECT statements against the TASKS table are properly being audited, complete with any bind values used in the query.&nbsp; The username of the database session is APEX_PUBLIC_USER <a href="http://joelkallman.blogspot.com/2010/08/application-express-and-parsing-of-sql.html" target="_blank">as expected</a>, because this is what the database sessions in the ORDS pool are connected as.&nbsp; In the CLIENT_IDENTIFIER column, you can see that the name of the authenticated user to the APEX application along with the APEX session identifier are also recorded.<br /><br /></li></ol>Does this give you everything you wish?&nbsp; Probably not.&nbsp; I'd like to know the APEX application ID, the page number, the actual parsing schema, and more.&nbsp; But using the APEX session ID and correlating it with entries in the APEX_ACTIVITY_LOG database view, I can find so much more about this activity.&nbsp; There are also many other columns in the <a href="https://docs.oracle.com/en/database/oracle/oracle-database/12.2/refrn/UNIFIED_AUDIT_TRAIL.html" target="_blank">UNIFIED_AUDIT_TRAIL</a> database view which are used in conjunction with <a href="https://www.oracle.com/database/database-vault/index.html" target="_blank">Oracle Database Vault</a> and <a href="https://docs.oracle.com/en/database/oracle/oracle-database/12.2/dbfsg/index.html" target="_blank">Real Application Security</a>, and which would capture still more information about access of this underlying database object.<br /><br />A great benefit of using database auditing instead of simply implementing "poor-man's" logging in the APEX application is that&nbsp;<b>any</b> access will be recorded from any application, not just the APEX app.<br /><br /><br /><br /> Joel R. Kallman tag:blogger.com,1999:blog-12214002.post-8909581583789689082 Tue Jan 09 2018 17:24:00 GMT-0500 (EST) Martin D'Souza's Farewell http://www.odtug.com/p/bl/et/blogaid=758&source=1 Martin D'Souza has served the ODTUG community as a board director for six consecutive years, from 2012 to 2017. During this time, Martin has served on the Executive Committee, the Marketing Committee, and as an APEX Community Liaison. ODTUG http://www.odtug.com/p/bl/et/blogaid=758&source=1 Tue Jan 09 2018 16:04:43 GMT-0500 (EST) Martin D'Souza's Farewell https://www.odtug.com/p/bl/et/blogaid=758&source=1 Martin D'Souza has served the ODTUG community as a board director for six consecutive years, from 2012 to 2017. During this time, Martin has served on the Executive Committee, the Marketing Committee, and as an APEX Community Liaison. ODTUG https://www.odtug.com/p/bl/et/blogaid=758&source=1 Tue Jan 09 2018 16:04:43 GMT-0500 (EST) Reset Password By Values in 12c https://ruepprich.wordpress.com/2018/01/09/reset-password-by-values-in-12c/ <p>In prior Oracle version you used to be able to hack a users password by using the identified by values syntax. This no longer works in 12c, but there is a hack for the hack as blogged by <a href="http://www.peasland.net/2016/02/18/oracle-12c-identified-by-values/" target="_blank" rel="noopener">Brian Peasland</a>.</p> <p>Here is a quick query that will generate the alter user command:</p> <pre>select u.username ,'alter user '||u.username||' identified by values '''||s.spare4||''';' cmd from dba_users u join sys.user$ s on u.user_id = s.user# where u.username = upper('&amp;username');</pre> <p>&nbsp;</p> <p>&nbsp;</p> Christoph Ruepprich http://ruepprich.wordpress.com/?p=2860 Tue Jan 09 2018 14:21:28 GMT-0500 (EST) Modify OracleJET Property at Runtime in APEX http://www.grassroots-oracle.com/2018/01/modify-OracleJET-property-at-runtime-in-APEX.html OracleJET has attributes galore, but some are are (not yet) available to change at design time, so JavaScript code can be added to the chart attributes to set relevant attributes.<br /><pre class="brush:javascript">function(options) {<br />options.styleDefaults.threeDEffect = "on";<br /><br />return options;<br />}</pre>See my <a href="http://www.grassroots-oracle.com/2018/01/oraclejet-javascript-customisation.html" target="_blank">previous post</a> about modifying these attributes on render.<br />We can also do this at runtime, perhaps as response to a button click, such as the 2D/3D button in the <a href="http://www.oracle.com/webfolder/technetwork/jet/jetCookbook.html?component=funnelChart&amp;demo=default" target="_blank">cookbook</a>.<br /><br />First, set a static ID on the chart, possibly one of the most common "advanced" properties I use.<br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://4.bp.blogspot.com/-0Uf8ET8tnto/Wk8Su36t8OI/AAAAAAAATh8/qJ2gLlaYyQAWzZhHccfmUw7FWLG-OYyFwCLcBGAs/s1600/jet_runtime_static_id.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="76" data-original-width="322" src="https://4.bp.blogspot.com/-0Uf8ET8tnto/Wk8Su36t8OI/AAAAAAAATh8/qJ2gLlaYyQAWzZhHccfmUw7FWLG-OYyFwCLcBGAs/s1600/jet_runtime_static_id.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Static ID property available on many components</td></tr></tbody></table><br />Use this ID in the browser console at runtime to see what JSON was generated for the chart definition.<br />Any missing properties will use the default specified in the documentation.<br /><code>apex.widget.jet.getChartJSON('p95_skew')</code><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-qN350hPcuLo/Wk8Su9d9A2I/AAAAAAAATh4/7YzW2o7XcikP0BPDd7jPvvSey8NhTgSYACLcBGAs/s1600/jet_runtime_json.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="393" data-original-width="678" src="https://1.bp.blogspot.com/-qN350hPcuLo/Wk8Su9d9A2I/AAAAAAAATh4/7YzW2o7XcikP0BPDd7jPvvSey8NhTgSYACLcBGAs/s1600/jet_runtime_json.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Browser Console results</td></tr></tbody></table><br />The documentation on these attributes is thorough, but I'd love some examples to help keep me moving.<br /><a href="http://www.oracle.com/webfolder/technetwork/jet/jsdocs/oj.ojChart.html#styleDefaults.threeDEffect">http://www.oracle.com/webfolder/technetwork/jet/jsdocs/oj.ojChart.html#styleDefaults.threeDEffect</a><br /><br />We can modify the orientation property by supplying a name/value pair as a JSON string.<br /><pre class="brush:javascript">$("#p95_skew_jet").ojChart({'orientation': 'horizontal'});</pre>Note the selector has is the static ID with a suffix: <code>$("the_static_id"+"_jet")</code><br /><br />It took a little while to find the correct punctuation for the nested properties, so this is really one of those blog posts I created so I don't forget. You've seen Alex's <a href="http://nuijten.blogspot.com.au/" target="_blank">blog by-line</a>, right?<br /><pre class="brush:javascript">$("#p95_skew_jet").ojChart({'styleDefaults':{'threeDEffect': 'off'}});</pre>Not all runtime tweaks behaved as expected, however. The following property behaves as expected when setting on render, but at runtime it squishes the width of the entire chart.<br /><code>$("#jet1").ojChart({'styleDefaults':{'barGapRatio': 0.2}});</code><br /><br />Refreshing the chart region afterwards did not help in this case.<br />While looking for answers, I came across <a href="http://oracle-apex-book.blogspot.com.au/2017/06/creating-charts-in-oracle-apex-using.html" target="_blank">this post</a>&nbsp;from Riaz describing similar customisations. Scott Wesley tag:blogger.com,1999:blog-4818542164384221282.post-8398936528927755093 Mon Jan 08 2018 20:17:00 GMT-0500 (EST) OracleJET JavaScript Customisation in APEX http://www.grassroots-oracle.com/2018/01/oraclejet-javascript-customisation.html I've finally got some regular hands on a 5.1 instance, and the shiniest tool in the box for me is OracleJET.<br /><br />Some months ago I spent a few days learning about OracleJET and the knockout framework with Chris Muir. I doubt I'd ever get to that nitty gritty, but it sure is handy to know some of the finer details now that I'm using them in APEX.<br /><br />I wanted to have a play with the funnel chart. I took an existing query, and quickly busted out a working chart.<br /><br />Upon playing with the sample chart in the <a href="http://www.oracle.com/webfolder/technetwork/jet/jetCookbook.html?component=funnelChart&amp;demo=default" target="_blank">OracleJET Cookbook</a>, I decided I wanted the 3D option.<br />In the case of this chart style, I think the subtle effect made a big difference.<br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-3vN9R9-RXFU/Wk3fGDxwc8I/AAAAAAAAThQ/IutjJ7MIR9Uuy2Z07GprC2bPMoukeQlqgCLcBGAs/s1600/funnel.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="896" data-original-width="783" height="400" src="https://3.bp.blogspot.com/-3vN9R9-RXFU/Wk3fGDxwc8I/AAAAAAAAThQ/IutjJ7MIR9Uuy2Z07GprC2bPMoukeQlqgCLcBGAs/s400/funnel.png" width="349" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">The Cookbook is a great guide to what you can play with</td></tr></tbody></table>I couldn't find the relevant attribute defined declaratively in APEX, but that's fine - I know all of them aren't mapped, and we have a special JavaScript section in the chart attributes to help us customise the content. This expands upon attribute selections, not <i>replacing </i>them like the custom XML did for AnyCharts.<br /><br />The attribute help in the Page Designer is a good start, and <a href="http://www.grassroots-oracle.com/2016/04/on-asking-questions-on-apex-forums.html">always worth checking</a> when playing with a new field.<br /><br /><div class="separator" style="clear: both; text-align: center;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://2.bp.blogspot.com/-AsixsY9hnuM/Wk3fSlwnUtI/AAAAAAAAThY/_gsQkZk837MYhGNV0EZcAhI8sLx2ugPQACLcBGAs/s1600/chart-help.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="601" data-original-width="902" height="426" src="https://2.bp.blogspot.com/-AsixsY9hnuM/Wk3fSlwnUtI/AAAAAAAAThY/_gsQkZk837MYhGNV0EZcAhI8sLx2ugPQACLcBGAs/s640/chart-help.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Page Designer Attribute Help</td></tr></tbody></table><br />I noticed the Sample Charts application did the same thing, but I figured I could take this sample from the help, combined with information from the <a href="http://www.oracle.com/webfolder/technetwork/jet/jsdocs/oj.ojChart.html#styleDefaults.threeDEffect" target="_blank">impressive JET documentation</a>, and try work out the JavaScript myself.<br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-qexm6udZLRg/Wk7XZDuY1jI/AAAAAAAATho/Ru_lVC28-9ozWPQTyoXTiNw9lUCpu4HewCLcBGAs/s1600/funnel-three-d-effect.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="328" data-original-width="601" src="https://3.bp.blogspot.com/-qexm6udZLRg/Wk7XZDuY1jI/AAAAAAAATho/Ru_lVC28-9ozWPQTyoXTiNw9lUCpu4HewCLcBGAs/s1600/funnel-three-d-effect.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Not all properties are mapped to APEX attributes</td></tr></tbody></table><br />This is what I came up with.<br /><pre class="brush:javascript">function(options) {<br /> options.styleDefaults.threeDEffect = "on";<br /> <br /> return options;<br />}</pre><br />Only to find the customisation from the sample application looked same same, but different.<br /><pre class="brush:javascript">function( options ){<br /> options.styleDefaults = {<br /> threeDEffect: "on" <br /> };<br /> return options;<br />}</pre>Turns out both are effective, once again demonstrating there's always a few different ways of doing the same thing in JavaScript.<br />I suspect the first option honours the object notation mentioned in the documentation, while the second assigns the value as a JSON name/value pair. I've seen similar behaviour in jQuery:<br /><br /><code>$('#item').css('color','blue')</code><br />vs<br /><code>$('#item').css({'color':'blue'})</code><br /><br />You can find other examples in your workspace with this query on the dictionary view.<br /><pre class="brush:javascript">select application_id, page_id, page_name, region_name, chart_type<br /> ,javascript_code<br />from apex_application_page_charts <br />where javascript_code is not null;</pre>You may also enjoy changing series colours with similar treatment by Colin Archer of Explorer UK.<br /><a href="http://www.explorer.uk.com/customising-chart-colours-apex-5-1/">http://www.explorer.uk.com/customising-chart-colours-apex-5-1/</a><br />The German APEX community also has a thorough rundown of JET charting in 5.1<br /><a href="https://apex.oracle.com/pls/apex/germancommunities/apexcommunity/tipp/5841/index-en.html">https://apex.oracle.com/pls/apex/germancommunities/apexcommunity/tipp/5841/index-en.html</a><br /><br />In my <a href="http://www.grassroots-oracle.com/2018/01/modify-OracleJET-property-at-runtime-in-APEX.html" target="_blank">next post</a> I'll explore how to play with these attributes at runtime, not just on render. Scott Wesley tag:blogger.com,1999:blog-4818542164384221282.post-3122729905977341356 Mon Jan 08 2018 19:12:00 GMT-0500 (EST) APEXExportSplitter deprecated in Oracle APEX 5.1.4 http://oracleinsights.blogspot.com/2018/01/apexexportsplitter-deprecated-in-oracle.html <div dir="ltr" style="text-align: left;" trbidi="on"> According to the <a href="http://www.oracle.com/technetwork/developer-tools/apex/application-express/apex-514-patch-set-notes-4124555.html#GUID-CE4058CA-F50E-4854-9025-C77401E4A5A9" target="_blank">Oracle APEX 5.1.4 patchset notes</a> the APEXExportSplitter Java utility is deprecated.<br /> <br /> That's not a bad thing, because it's simply been included into the APEXExport utility as an extra command option.<br /> <br /> Better yet, it's been bundled into the Oracle SQLcl 17.4 utility.<br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://3.bp.blogspot.com/-cMGtV0H1xZU/WlNzompU-CI/AAAAAAAAAcE/l_uKyhUv2hk7yCJUmrp8WMUTzUON8POmwCLcBGAs/s1600/Screen%2BShot%2B2018-01-08%2Bat%2B11.23.30%2Bpm.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="886" data-original-width="1600" height="354" src="https://3.bp.blogspot.com/-cMGtV0H1xZU/WlNzompU-CI/AAAAAAAAAcE/l_uKyhUv2hk7yCJUmrp8WMUTzUON8POmwCLcBGAs/s640/Screen%2BShot%2B2018-01-08%2Bat%2B11.23.30%2Bpm.png" width="640" /></a></div> In the screenshot above you can see the following commands run from within SQLcl.<br /> <br /> <pre style="border: 1px solid rgba(0, 0, 0, 0.0980392); box-sizing: border-box; color: #2b2b2b; font-family: monospace, serif; font-size: 15px; hyphens: none; line-height: 1.6; margin-bottom: 24px; max-width: 100%; outline: 0px; overflow: auto; padding: 12px; vertical-align: baseline; word-wrap: normal;"><code style="border: 0px; font-family: monospace, serif; font-style: inherit; font-weight: inherit; hyphens: none; line-height: 1.6; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">!sql -version</code></pre> This issues a host command to show the SQLcl version being used.<br /> <br /> <br /> <pre style="border: 1px solid rgba(0, 0, 0, 0.0980392); box-sizing: border-box; color: #2b2b2b; font-family: monospace, serif; font-size: 15px; hyphens: none; line-height: 1.6; margin-bottom: 24px; max-width: 100%; outline: 0px; overflow: auto; padding: 12px; vertical-align: baseline; word-wrap: normal;"><code style="border: 0px; font-family: monospace, serif; font-style: inherit; font-weight: inherit; hyphens: none; line-height: 1.6; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">apex</code></pre> Typing apex lists the apex applications owned by the current user.<br /> <br /> <br /> <pre style="border: 1px solid rgba(0, 0, 0, 0.0980392); box-sizing: border-box; color: #2b2b2b; font-family: monospace, serif; font-size: 15px; hyphens: none; line-height: 1.6; margin-bottom: 24px; max-width: 100%; outline: 0px; overflow: auto; padding: 12px; vertical-align: baseline; word-wrap: normal;"><code style="border: 0px; font-family: monospace, serif; font-style: inherit; font-weight: inherit; hyphens: none; line-height: 1.6; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">!mkdir test</code></pre> This issues a host command to create a new directory.<br /> <br /> <br /> <pre style="border: 1px solid rgba(0, 0, 0, 0.0980392); box-sizing: border-box; color: #2b2b2b; font-family: monospace, serif; font-size: 15px; hyphens: none; line-height: 1.6; margin-bottom: 24px; max-width: 100%; outline: 0px; overflow: auto; padding: 12px; vertical-align: baseline; word-wrap: normal;"><code style="border: 0px; font-family: monospace, serif; font-style: inherit; font-weight: inherit; hyphens: none; line-height: 1.6; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">cd test</code></pre> Within SQLcl change to the newly created directory.<br /> <br /> <br /> <pre style="border: 1px solid rgba(0, 0, 0, 0.0980392); box-sizing: border-box; color: #2b2b2b; font-family: monospace, serif; font-size: 15px; hyphens: none; line-height: 1.6; margin-bottom: 24px; max-width: 100%; outline: 0px; overflow: auto; padding: 12px; vertical-align: baseline; word-wrap: normal;"><code style="border: 0px; font-family: monospace, serif; font-style: inherit; font-weight: inherit; hyphens: none; line-height: 1.6; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">apex export -applicationid 200 -skipExportDate -split</code></pre> The bit we are interested in; the command to export an application from the database, and split it into seperate files in one statement.<br /> <br /> <br /> <pre style="border: 1px solid rgba(0, 0, 0, 0.0980392); box-sizing: border-box; color: #2b2b2b; font-family: monospace, serif; font-size: 15px; hyphens: none; line-height: 1.6; margin-bottom: 24px; max-width: 100%; outline: 0px; overflow: auto; padding: 12px; vertical-align: baseline; word-wrap: normal;"><code style="border: 0px; font-family: monospace, serif; font-style: inherit; font-weight: inherit; hyphens: none; line-height: 1.6; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">!ls -l</code></pre> Proving the f200.sql file was created, and then split into components in the f200 directory.<br /> <br /> To see the full syntax available simply type "apex export" to view the help.<br /> <br /> <pre style="border: 1px solid rgba(0, 0, 0, 0.0980392); box-sizing: border-box; color: #2b2b2b; font-family: monospace, serif; font-size: 15px; hyphens: none; line-height: 1.6; margin-bottom: 24px; max-width: 100%; outline: 0px; overflow: auto; padding: 12px; vertical-align: baseline; word-wrap: normal;"><code style="border: 0px; font-family: monospace, serif; font-style: inherit; font-weight: inherit; hyphens: none; line-height: 1.6; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">cardiac_own@orcl&gt; apex export -applicationid: ID for application to be exported -workspaceid: Workspace ID for which all applications to be exported or the workspace to be exported -instance: Export all applications -expWorkspace: Export workspace identified by -workspaceid or all workspaces if -workspaceid not specified -expMinimal: Only export workspace definition, users, and groups -expFiles: Export all workspace files identified by -workspaceid -skipExportDate: Exclude export date from application export files -expPubReports: Export all user saved public interactive reports -expSavedReports: Export all user saved interactive reports -expIRNotif: Export all interactive report notifications -expTranslations: Export the translation mappings and all text from the translation repository -expFeedback: Export team development feedback for all workspaces or identified by -workspaceid to development or deployment -expTeamdevdata: Export team development data for all workspaces or identified by -workspaceid -deploymentSystem: Deployment system for exported feedback -expFeedbackSince: Export team development feedback since date in the format YYYYMMDD -expOriginalIds: If specified, the application export will emit ids as they were when the application was imported -split: Split the exported file -splitFlat: Split with no directory strucure -splitUpdate: Generate update.sql file while splitting -splitNoCheckSum: Overwrite all files Application Example: apex export -applicationid 31500 Workspace Example: apex export -workspaceid 9999 Instance Example: apex export -instance Export All Workspaces Example: apex export -expWorkspace Export Feedback to development environment: apex export -workspaceid 9999 -expFeedback Export Feedback to deployment environment EA2 since 20100308: apex export -workspaceid 9999 -expFeedback -deploymentSystem EA2 -expFeedbackSince 20100308 </code></pre> Happy new year! Now, I've got some command scripts to update...<br /> <br /></div> Mark Lancaster tag:blogger.com,1999:blog-869579236085438805.post-8342205107748964457 Mon Jan 08 2018 09:01:00 GMT-0500 (EST) ALL THE THINGS – Project Outline http://douggault.com/2018/01/08/all-the-things-project-outline/ <p>In my <a href="http://douggault.com/2018/01/02/new-year-new-blog-new-series/">previous post</a> I mentioned that I&#8217;d be developing a non-trivial, real-world application from scratch and approach it in the same way I would if I were doing it for a paying client. The first step in that direction is to gather requirements and define the project:</p> <ul> <li>What is the main purpose of the project and what need does it satisfy?</li> <li>Are there real and artificial limitations placed on the project?</li> <li>What technologies will be used to satisfy the requirements? Why?</li> </ul> <p>There are obviously loads more questions that we need to ask, and answer. But lets start with these three. The rest of this post will provide a broad outline for the project, where I&#8217;m going to try to set the boundaries, and why I chose this specific idea to tackle.</p> <h3>The Problem of Workflow</h3> <p>Since my early days working with the Oracle database, all the way into my tenure with Oracle APEX, workflow has been something of a conundrum. When most people see or hear workflow it usually goes one of two ways: They think of something specific to their business and therefore fairly concrete (in their minds at least) <em><strong>or</strong></em> they think of something wildly generic that will suit every case that ever existed and ever will exist.</p> <p>As a long time consultant programmer, every time I discuss <em><strong>workflow</strong></em> with a client it usually goes something like this.</p> <p style="padding-left: 30px;"><strong>Client</strong>: We need some sort of workflow engine so that we can track the progress of <em>Process A</em> through its multiple steps.</p> <p style="padding-left: 30px;"><strong>Me</strong>: Ok, I&#8217;d love to understand more about the steps in this process, how complex is it?</p> <p style="padding-left: 30px;"><strong>Client</strong>: Oh, very complex. There are multiple steps, various people involved, various decision points that may change the outcome and we have restrictions on how long the process can take.</p> <p style="padding-left: 30px;"><strong>Me</strong>:<strong> </strong>How &#8220;static&#8221; is the process? Do the steps and process change over time or has the process been fairly stable?</p> <p style="padding-left: 30px;"><strong>Client</strong>: It&#8217;s fairly stable, but we&#82