tag:blogger.com,1999:blog-17990939691337983902024-03-14T01:55:59.775-07:00Technology BlogMy experience with technologySanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.comBlogger73125tag:blogger.com,1999:blog-1799093969133798390.post-60829876493089380422018-05-30T15:00:00.000-07:002018-11-28T17:40:57.245-08:00Oracle Bot Cloud (IBCS): Voice based coversation<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Problem Description</b>: In this blog we are trying to enhance our web chatbot ui created in previous blog and add voice features.<br />
<br />
Idea here is to send text message to Bot and receive only text messages but before sending convert user voice (speech) to text and again when we receive and message from bot server play it as audio.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-fMGc0ecouXM/Ww-p8BUsxtI/AAAAAAAADrI/Oz3iXB8OrhARg3gOIGVtVw92HRy-ifwsgCLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="323" data-original-width="697" height="296" src="https://1.bp.blogspot.com/-fMGc0ecouXM/Ww-p8BUsxtI/AAAAAAAADrI/Oz3iXB8OrhARg3gOIGVtVw92HRy-ifwsgCLcBGAs/s640/1.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
There are few options available to convert voice and text. In this blog we are going to use</div>
<div class="separator" style="clear: both; text-align: left;">
1. Speech to Text: webkitSpeechRecognition api of browser</div>
<div class="separator" style="clear: both; text-align: left;">
2. Text to Speech: speechSynthesis api of browser</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Lets take our previous chatbot UI created in blog http://sanjeev-technology.blogspot.com/2018/05/oracle-bot-cloud-ibcs-custom-ui.html and enhance it for voice support.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Now we can follow below steps</div>
<div class="separator" style="clear: both; text-align: left;">
1. Add a button to initiate voice chatting</div>
<div class="separator" style="clear: both; text-align: left;">
<oj-button id="start_button" on-oj-action="[[startVoiceChat]]">Start Voice Chat</oj-button></div>
<div class="separator" style="clear: both; text-align: left;">
Now add corresponding code in appcontroller.js</div>
<div class="separator" style="clear: both;">
self.startVoiceChat = function(event){</div>
<div class="separator" style="clear: both;">
listenUserVoice();</div>
<div class="separator" style="clear: both;">
}</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
NOTE: I am using oracle jet so I use oj-button. Point is we have to call listenUserVoice method on button click.</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
2. Add speak method in app.js. This method will provide audio to text message. It will also callback once meassage reading is finished.</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;">function speak(text, onendcallback){</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> var msg = new SpeechSynthesisUtterance();</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> msg.text = text;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> if(onendcallback){</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> msg.onend = onendcallback;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> window.speechSynthesis.speak(msg);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> console.log(JSON.stringify(msg));;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
3. Add listenUserVoice method also in app.js. This method reconizes user voice and converts it to text. It also calls bots sendmessage or triggerpostback depending on situation.</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;">function listenUserVoice(){</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> var recognition = new webkitSpeechRecognition();</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> recognition.continuous = false;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> recognition.interimResults = true;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> recognition.onstart = function() {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> recognizing = true;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> };</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> recognition.onend = function() {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> recognizing = false;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> };</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> recognition.onresult = function(event) {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> console.log("recognition-onresult" + event);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> console.log(event);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> var interim_transcript = '';</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> if (typeof(event.results) == 'undefined') {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> recognition.onend = null;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> recognition.stop();</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> upgrade();</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> return;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> for (var i = event.resultIndex; i < event.results.length; ++i) {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> if (event.results[i].isFinal) {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> final_transcript += event.results[i][0].transcript;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> } else {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> interim_transcript += event.results[i][0].transcript;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> </span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> if(final_transcript){</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> console.log("User said: " + final_transcript);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> var totalMsg = Bots.getConversation().messages.length;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> if(Bots.getConversation().messages[totalMsg-1] && Bots.getConversation().messages[totalMsg-1].actions){</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> </span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> var actions = Bots.getConversation().messages[totalMsg-1].actions.filter(function(action){</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> return action.text === final_transcript; //Improve it by performing case insensitive matching</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> })</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> if(actions && actions[0]){</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> Bots.triggerPostback(actions[0]._id).then(function() {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> console.log("postback");</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> });</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> </span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> else{</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> Bots.sendMessage(final_transcript).then(function() {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> console.log("normal message");</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }); </span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> </span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> if(final_transcript){</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> recognizing = false;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> </span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> if (recognizing) {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> recognition.stop();</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> return;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> final_transcript = '';</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> recognition.start();</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
</div>
<div class="separator" style="clear: both;">
4. Now modify displayServerMessage method to call listenUserVoice method so that system automatically starts taking user message after providing any information.</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;">function displayServerMessage(message) {</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> console.log(message);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> var conversationElement = document.getElementById('conversation');</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> var messageElement = document.createElement('li');</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> var text = 'Server says "' + message.text + '"';</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> messageElement.innerText = text;</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> if(message.actions && message.actions.length > 0){</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> var wrapperElement = document.createElement('div');</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> for(var i = 0; i < message.actions.length; i++){</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> var action = message.actions[i];</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> var btnElement = createButtonElement(action);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> wrapperElement.appendChild(btnElement);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> messageElement.appendChild(wrapperElement);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> </span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> conversationElement.appendChild(messageElement);</span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> <span style="background-color: yellow;"> speak(text, listenUserVoice);</span></span></div>
<div class="separator" style="clear: both;">
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
Thats all.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
</div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com129tag:blogger.com,1999:blog-1799093969133798390.post-2662742363274847052018-05-30T14:49:00.000-07:002018-05-31T01:10:43.577-07:00Oracle Bot Cloud (IBCS): Custom UI <div dir="ltr" style="text-align: left;" trbidi="on">
<b>Problem Description:</b> In this blog I would be going over various options to build a web UI for IBCS chat bot.<br />
<br />
By default IBCS provides two sdks to build web UI for Chatbot. We can download those sdks from<br />
http://www.oracle.com/technetwork/topics/cloud/downloads/mobile-suite-3636471.html under heading Bots Client SDK<br />
<br />
<br />
We can follow link https://docs.oracle.com/en/cloud/paas/mobile-suite/use-chatbot/bot-channels.html#GUID-A0A40E26-54BA-4EDD-A4C5-95D498D6CF61 to find out how to use these SDKs.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-L5GocMUlaNo/Ww8QoSp9qvI/AAAAAAAADqk/jdNAhi0vFlg5RAa4bNORQyXTn4drTNZNACLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="220" data-original-width="1085" src="https://3.bp.blogspot.com/-L5GocMUlaNo/Ww8QoSp9qvI/AAAAAAAADqk/jdNAhi0vFlg5RAa4bNORQyXTn4drTNZNACLcBGAs/s1600/1.png" /></a></div>
<br />
Widget is very cool and rich but still at times you want to build your own custom UI instead of widget. To do that you can follow<br />
https://docs.oracle.com/en/cloud/paas/mobile-suite/use-chatbot/bot-channels.html#GUID-78F6DD7E-5085-476B-AD03-1318D9107D39<br />
<br />
In this blog I am trying to enhance that code to handle postback requests. Also this blog will help me in my next blog to achieve voice based conversation.<br />
<br />
1. Add below code in html<br />
HTML:<br />
<span style="font-family: "courier new" , "courier" , monospace;"> <div id="no-display" style="display:none;"></div></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <p>User ID: <span id="user-id"></span></p></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <ul id="conversation"></ul></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <input type="text" id="text-input" placeholder="text"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><script src="js/app.js"></script></span><br />
<br />
<br />
2. Add app.js inside js directory. It can have following code<br />
<span style="font-family: "courier new" , "courier" , monospace;">!function(e,t,n,r){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> function s(){try{var e;if((e="string"==typeof this.response?JSON.parse(this.response):this.response).url){var n=t.getElementsByTagName("script")[0],r=t.createElement("script");r.async=!0,r.src=e.url,n.parentNode.insertBefore(r,n)}}catch(e){}}var o,p,a,i=[],c=[];e[n]={init:function(){o=arguments;var e={then:function(t){return c.push({type:"t",next:t}),e},catch:function(t){return c.push({type:"c",next:t}),e}};return e},on:function(){i.push(arguments)},render:function(){p=arguments},destroy:function(){a=arguments}},e.__onWebMessengerHostReady__=function(t){if(delete e.__onWebMessengerHostReady__,e[n]=t,o)for(var r=t.init.apply(t,o),s=0;s<c.length;s++){var u=c[s];r="t"===u.type?r.then(u.next):r.catch(u.next)}p&&t.render.apply(t,p),a&&t.destroy.apply(t,a);for(s=0;s<i.length;s++)t.on.apply(t,i[s])};var u=new XMLHttpRequest;u.addEventListener("load",s),u.open("GET",r+"/loader.json",!0),u.responseType="json",u.send()</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}(window,document,"Bots", "<Your-Bot-sdk-url>");</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">var appId = '<Your app id>';</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">Bots.init({</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> appId: appId, embedded: true</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }).then(function (res){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> console.log("init complete");</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> });</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">Bots.render(document.getElementById('no-display'));</span><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">var inputElement = document.getElementById('text-input');</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> inputElement.onkeyup = function(e) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> if (e.key === 'Enter') {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <span style="background-color: yellow;">var totalMsg = Bots.getConversation().messages.length;</span></span><br />
<span style="background-color: yellow; font-family: "courier new" , "courier" , monospace;"> if(Bots.getConversation().messages[totalMsg-1] && Bots.getConversation().messages[totalMsg-1].actions){</span><br />
<span style="background-color: yellow; font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="background-color: yellow; font-family: "courier new" , "courier" , monospace;"> var actions = Bots.getConversation().messages[totalMsg-1].actions.filter(function(action){</span><br />
<span style="background-color: yellow; font-family: "courier new" , "courier" , monospace;"> return action.text === inputElement.value; //Improve it by performing case insensitive matching</span><br />
<span style="background-color: yellow; font-family: "courier new" , "courier" , monospace;"> })</span><br />
<span style="background-color: yellow; font-family: "courier new" , "courier" , monospace;"> if(actions){</span><br />
<span style="background-color: yellow; font-family: "courier new" , "courier" , monospace;"> Bots.triggerPostback(actions[0]._id).then(function() {</span><br />
<span style="background-color: yellow; font-family: "courier new" , "courier" , monospace;"> inputElement.value = '';</span><br />
<span style="background-color: yellow; font-family: "courier new" , "courier" , monospace;"> });</span><br />
<span style="background-color: yellow; font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="background-color: yellow; font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="background-color: yellow; font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> else{</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> Bots.sendMessage(inputElement.value).then(function() {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> inputElement.value = '';</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }); </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">function displayUserMessage(message) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> console.log(message);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> var conversationElement = document.getElementById('conversation');</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> var messageElement = document.createElement('li');</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> messageElement.innerText = message.name + ' says "' + message.text + '"';</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> conversationElement.appendChild(messageElement);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> function createButtonElement(action) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> var btnElement = document.createElement('button');</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> var btnTitle = document.createTextNode(action.text);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> btnElement.appendChild(btnTitle);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> btnElement.onclick = function(e){Bots.triggerPostback(action._id);};</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return btnElement;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> function displayServerMessage(message) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> console.log(message);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> var conversationElement = document.getElementById('conversation');</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> var messageElement = document.createElement('li');</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> var text = 'Server says "' + message.text + '"';</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> messageElement.innerText = text;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> if(message.actions && message.actions.length > 0){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> var wrapperElement = document.createElement('div');</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> for(var i = 0; i < message.actions.length; i++){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> var action = message.actions[i];</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> var btnElement = createButtonElement(action);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> wrapperElement.appendChild(btnElement);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> messageElement.appendChild(wrapperElement);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> isPostBackRequired = true;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> lastPostBackServerMsg = message;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> conversationElement.appendChild(messageElement);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> // display new messages</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> Bots.on('message:sent', displayUserMessage);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> Bots.on('message:received', displayServerMessage);</span><br />
<div>
<br /></div>
<br />
<br />
NOTE:<br />
1. Bot-sdk-url is url of your sdk directory. If you copy bot-sdk inside js directory as bot-client-sdk-js and server is running on port 8000, your bot-sdk-url would be http://localhost:8000/js/bots-client-sdk-js<br />
2. app-id mentioned in above code is given on channels page of IBCS (once you register a web channel)<br />
<br />
3. Input element in which user types message is enhanced to handle postBack message of user.<br />
4. displayUserMessage function adds user typed message in list<br />
5. displayServerMessage function adds server message in list. It also create appropriate buttons if server wants user to select one value.<br />
<br />
UI is very crude but it gives you complete control to decorate it.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-t1SN9H9Mmms/Ww8WFnytJEI/AAAAAAAADqw/XM2FjkNW_fcYC_gJ-LKKDPSNpNTS2VpKgCLcBGAs/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="167" data-original-width="547" height="97" src="https://2.bp.blogspot.com/-t1SN9H9Mmms/Ww8WFnytJEI/AAAAAAAADqw/XM2FjkNW_fcYC_gJ-LKKDPSNpNTS2VpKgCLcBGAs/s320/2.png" width="320" /></a></div>
<br />
Now we have a very basic UI ready. My idea is to enhance it further and add voice feature to it in my Next blog.<br />
<br />
Thats all in this blog.</div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com32tag:blogger.com,1999:blog-1799093969133798390.post-57908908709800518322018-05-16T11:17:00.002-07:002018-05-31T01:11:12.937-07:00Oracle Bot Cloud (IBCS): Switching Intents while in conversation (Nested Intent)<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Problem Description</b>: If we see IBCS flow generally tries to find user intent first. Once it identifies and intent, it tries to complete intent based on flow defined. There are all reasons that end user may want to switch his intent before completing first intent. For example, I am ordering pizza but while system asks me for pizza type, I decide to verify their payment options and I changed my intent. Something like below<br />
<br />
Me: I would like to order a pizza<br />
<br />
Bot: Which type of pizza would you like to have?<br />
<br />
Me: Hold on, What are your payment options<br />
<br />
<br />
In ideal conversation bot should provide me details of payment. Once payment options information is provided, it can ask me if I want to continue with Pizza order.<br />
<br />
But in general we use either System.Text or System.List component when we want to take user input. This is the time when user can change his mind (or intent).<br />
<br />
It looks like<br />
askPizzaType:<br />
component: "System.List"<br />
properties:<br />
options: "${pizzaType.type.enumValues}"<br />
prompt: "Which type of pizza would you like to have?"<br />
variable: "pizzaType"<br />
transitions: {}<br />
<br />
with this state, bot will provide a list of pizza types (say small, medium or large). Now even if user changes his mind and asks about payment options, bot will ask pizza type again and again. Very annoying.<br />
<br />
In this blog we want to make it a bit realistic and introduce intelligence of user intent switching.<br />
<br />
Lets say we have following initial bot configuration<br />
<br />
1. Intents: OrderPizza, ProvideInfo<br />
2. Entity: PizzaType (Associated with OrderPizza Intent)<br />
<br />
3. Dialog-Flow:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-2_tEeWS1_rU/WvxiOj8VF1I/AAAAAAAADpw/YIu4KLXAZSM-DWJ0WZi37SxKADgnDqAqgCLcBGAs/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="727" data-original-width="931" height="311" src="https://1.bp.blogspot.com/-2_tEeWS1_rU/WvxiOj8VF1I/AAAAAAAADpw/YIu4KLXAZSM-DWJ0WZi37SxKADgnDqAqgCLcBGAs/s400/2.png" width="400" /></a></div>
<br />
Its able to complete payment option enquiry and pizza order but if user tries to switch from OrderPizza intent to ProvideInfo, bot keeps on asking about pizza type as shown below<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-0J8SdFbOy9Y/WvxNGwllSMI/AAAAAAAADpg/V4zj0Wjr-tY7BZ9YeWaYoB-EYrqOJEKTQCLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="538" data-original-width="1277" height="267" src="https://4.bp.blogspot.com/-0J8SdFbOy9Y/WvxNGwllSMI/AAAAAAAADpg/V4zj0Wjr-tY7BZ9YeWaYoB-EYrqOJEKTQCLcBGAs/s640/1.png" width="640" /></a></div>
<br />
Now lets improve it to handle intent switching.<br />
a. To stop bot asking for pizzaType repeatedly, we can introduce maxPrompts=1 with askPizzaType (System.List) component.<br />
<br />
b. We can add cancel action with askPizzaType (System.List) component to perform a transition, if bot can't find pizzaType even after max number of attempts ( NOTE: here we have already set max attempt as 1, so user can only provide one input. If that is not small/medium/large, cancel transition will take place)<br />
<span style="font-family: "courier new" , "courier" , monospace;">askPizzaType:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> component: "System.List"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> properties:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> options: "${pizzaType.type.enumValues}"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> prompt: "Which type of pizza would you like to have?"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> variable: "pizzaType" </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> maxPrompts: 1</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> transitions: </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> actions:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> cancel: "verifyIntentWhileOrderPizzaInProgress" </span><br />
<br />
c. verifyIntentWhileOrderPizzaInProgress can set <span style="font-family: "courier new" , "courier" , monospace;">uncompletedIntent </span>in a variable and then perform an nlp intent-matching on user input. If its unresolved in NLP matching assume that user is trying to answer pizzaType question but some typo etc happened so lets take him back to askPizzaType.<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">verifyIntentWhileOrderPizzaInProgress:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> component: "System.SetVariable"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> properties:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> variable: "<b>uncompletedIntent</b>"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> value: "OrderPizza"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> transitions: {} </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> verifyIntent:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> component: "System.Intent"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> properties:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> variable: "iResult2"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> confidenceThreshold: 0.4</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> transitions:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> actions:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> OrderPizza: "orderPizza"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> ProvideInfo: "provideInfo"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> unresolvedIntent: "<b>askPizzaType</b>"</span><br />
<br />
d. Lets improve provideInfo state as well to handle uncompleted intent (OrderPizza). After providing information of payment option, verify if there is any uncompleted intent. If yes suggest to continue with that intent else done<br />
<span style="font-family: "courier new" , "courier" , monospace;">provideInfo:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> component: "System.Output"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> properties:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> text: "We support credit card, debit card and cash on delivery. "</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> keepTurn: true</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> transitions: </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><b> next: "isAnyIncompleteIntent"</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><b><br /></b></span>
<span style="font-family: inherit;">e. Lets introduce few states to gracefully end conversation or ask for any pending intent completion.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> isAnyIncompleteIntent:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> component: "System.ConditionEquals"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> properties:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> variable: "uncompletedIntent"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> value: "OrderPizza"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> transitions:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> actions:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> equal: "askToStartPizzaOrderAgain"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> notequal: "done" </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> askToStartPizzaOrderAgain:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> component: "System.Output"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> properties:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> text: "Lets continue with Pizza ordering."</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> keepTurn: true</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> transitions: </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> next: "orderPizza" </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> done:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> component: "System.Output"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> properties:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> text: "Is there any other way I can help you?"</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> transitions:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> actions:</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return: "done"</span><br />
<br />
Complete flow looks like below<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-vkpV6RVnctw/Wvx1BiMbxeI/AAAAAAAADqA/TrD53qUEVsYHbQ0pj2CdBdD_R2fsVKRsQCLcBGAs/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="879" src="https://4.bp.blogspot.com/-vkpV6RVnctw/Wvx1BiMbxeI/AAAAAAAADqA/TrD53qUEVsYHbQ0pj2CdBdD_R2fsVKRsQCLcBGAs/s1600/3.png" /></a></div>
<br />
Effectively by above improvements in flow we are trying to enable user to switch intent while in between conversation.<br />
After above change flow looks like this.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-MoFVkQCL5EI/Wvx38e9j0hI/AAAAAAAADqM/xzZAxcuMnX4kHLMAVJwxlp63wtLnjBe7QCLcBGAs/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1059" data-original-width="528" height="320" src="https://2.bp.blogspot.com/-MoFVkQCL5EI/Wvx38e9j0hI/AAAAAAAADqM/xzZAxcuMnX4kHLMAVJwxlp63wtLnjBe7QCLcBGAs/s320/4.png" width="159" /></a></div>
Thats all</div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com21tag:blogger.com,1999:blog-1799093969133798390.post-43570288839143801172018-05-15T11:47:00.002-07:002018-05-15T11:47:49.691-07:00Oracle Cloud Bot Designer UI URL<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Problem Description:</b> This blog is just to remind me how to find bot designer UI. I recently created a bot cloud service. It created lots of services and it was really hard for me to find bot designer UI url.<br />
<br />
Finally I could find it as shown in below dig.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-JwIEr8Y7vQ4/WvsrEvhxuRI/AAAAAAAADpM/cbpPDM0IxjkxIH6MWjn1UA4rTlniYt-7gCLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="729" data-original-width="1218" height="380" src="https://2.bp.blogspot.com/-JwIEr8Y7vQ4/WvsrEvhxuRI/AAAAAAAADpM/cbpPDM0IxjkxIH6MWjn1UA4rTlniYt-7gCLcBGAs/s640/1.png" width="640" /></a></div>
<br /></div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com7tag:blogger.com,1999:blog-1799093969133798390.post-92229841138441442182018-04-11T22:49:00.000-07:002018-04-11T23:14:29.671-07:00Java SOAP WebService Proxy: SOAPHandler to print SOAP messages<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Problem</b>: We all know about creating webservice proxy from jdeveloper. Proxy generates few classes based on WSDL and associated XSD and allow us to invoke webservice as if we are simply calling some java method. Complexity of creating soap message and sending over network and receiving output is hidden from us. One of the problem we face many a time is to view SOAP request and response messages. If we can it would be very helpful for debugging.<br />
In this blog I will be using SOAP handler to view SOAP messages.<br />
<br />
<b>Solution</b>: Solution which I am going to show is using SOAP handler feature of web-service proxy.<br />
<br />
Using proxy is very simple, we just work with normal java classes and complexity of invoking webservice is completely hidden. SOAP Handler is java class (with some guidelines) that can be injected with proxy and proxy will make sure to call methods of this class before sending a request and after receiving message.<br />
<br />
SOAP Handler class must implement SOAPHandler<SOAPMessageContext> class.<br />
A Sample SOAPHandler class can look like<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">import java.util.Collections;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">import java.util.Set;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">import javax.xml.namespace.QName;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">import javax.xml.soap.SOAPException;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">import javax.xml.ws.handler.MessageContext;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">import javax.xml.ws.handler.soap.SOAPHandler;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">import javax.xml.ws.handler.soap.SOAPMessageContext;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">public class CalculatorSOAPHandler implements SOAPHandler<SOAPMessageContext> {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> public Set<QName> getHeaders() {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return Collections.emptySet();</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> public boolean handleMessage(SOAPMessageContext messageContext) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><span style="font-family: courier new, courier, monospace;"> Boolean outboundProperty = (Boolean)</span><br />
<span style="font-family: courier new, courier, monospace;"> messageContext.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY);</span><br />
<span style="font-family: courier new, courier, monospace;"><br /></span>
<span style="font-family: courier new, courier, monospace;"> if (outboundProperty.booleanValue()) {</span><br />
<span style="font-family: courier new, courier, monospace;"> System.out.println("Request message:");</span><br />
<span style="font-family: courier new, courier, monospace;"> } else {</span><br />
<span style="font-family: courier new, courier, monospace;"> System.out.println("Response message:");</span><br />
<span style="font-family: courier new, courier, monospace;"> }</span><br />
<span style="font-family: courier new, courier, monospace;"> </span><br />
<span style="font-family: courier new, courier, monospace;"> try {</span><br />
<span style="font-family: courier new, courier, monospace;"> System.out.println(messageContext.getMessage().getSOAPPart().getEnvelope().toString());</span><br />
<span style="font-family: courier new, courier, monospace;"> } catch (SOAPException e) {</span><br />
<span style="font-family: courier new, courier, monospace;"> e.printStackTrace();</span><br />
<span style="font-family: courier new, courier, monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> return true;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> public boolean handleFault(SOAPMessageContext messageContext) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return true;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> public void close(MessageContext messageContext) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<br />
<br />
Now we need to inject this class in proxy or in other words we need to configure it with proxy so that it knows about this class. There are couple of ways to do that.<br />
1. Specify SOAP handler while creating proxy in Proxy creating wizard.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-d9MfpNHv8RU/Ws64_eqnu9I/AAAAAAAADno/d-iF17ZJMj4aHiWisDf4VNPmdkwl_a0WQCLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="602" data-original-width="803" height="298" src="https://4.bp.blogspot.com/-d9MfpNHv8RU/Ws64_eqnu9I/AAAAAAAADno/d-iF17ZJMj4aHiWisDf4VNPmdkwl_a0WQCLcBGAs/s400/1.png" width="400" /></a></div>
In above diagram we are specifying a SOAP handler. We have not selected any port so handler will be registered against all web-service port. Jdev will not create any class. You must create class separately.<br />
<br />
When we generate proxy, there is one most important class which has @WebServiceClient annotation. Above step will create a handler entry in that class as<br />
<br />
@HandlerChain(file = "MyServiceProxy-HandlerChain.xml")<br />
<br />
It will also create a HandlerChain.xml file, which will have entry of handler.<br />
<span style="font-family: "courier new" , "courier" , monospace;"><ns0:handler-chains xmlns:ns0="http://java.sun.com/xml/ns/javaee"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <ns0:handler-chain></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <ns0:service-name-pattern xmlns:ns1="http://xmlns.oracle.com/SIH/SIHParentProcess/BPELParentProcess">ns1:bpelparentprocess_client_ep</ns0:service-name-pattern></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <ns0:handler></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <ns0:handler-name></span><span style="font-family: "courier new" , "courier" , monospace;">CalculatorSOAPHandler</span><span style="font-family: "courier new" , "courier" , monospace;"></ns0:handler-name></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <ns0:handler-class>com.san.wsproxy.client.</span><span style="font-family: "courier new" , "courier" , monospace;">CalculatorSOAPHandler</span><span style="font-family: "courier new" , "courier" , monospace;"></ns0:handler-class></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </ns0:handler></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </ns0:handler-chain></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"></ns0:handler-chains></span><br />
<br />
<br />
<br />
Now when you run service you will see that handleMessage method of SOAP handler is getting called and its printing SOAP header and body.<br />
<br />
Another way to associate SOAP handler class with proxy is simply modify client code.<br />
2. With proxy generation you get a client class. It has a main method, which shows how to run a webservice. You can use this class to add security (WS-Security) header in soap message by setting OWSM policy. Similarly you can use this class also to associate handler with proxy.<br />
<br />
Your client method would look something like<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"> public static void main(String[] args) {</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Calculator calculator = new Calculator();</span><br />
<span style="font-family: Courier New, Courier, monospace;"> CalculatorSoap calculatorSoap = calculator.getCalculatorSoap();</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // Add your code to call the desired methods.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> <b>Binding binding = ((BindingProvider)calculatorSoap).getBinding();</b></span><br />
<span style="font-family: Courier New, Courier, monospace;"><b> List handlerList = binding.getHandlerChain();</b></span><br />
<span style="font-family: Courier New, Courier, monospace;"><b> handlerList.add(new CalculatorSOAPHandler());</b></span><br />
<span style="font-family: Courier New, Courier, monospace;"><b> binding.setHandlerChain(handlerList);</b></span><br />
<span style="font-family: Courier New, Courier, monospace;"> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> System.out.println(calculatorSoap.add(5, 6));</span><br />
<span style="font-family: Courier New, Courier, monospace;"> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> }</span><br />
<br />
Thats all, Now if you run service, you will see that SOAP messages are getting printed on console.<br />
<br />
<br />
<br />
Below is the print of messages<br />
<span style="font-family: "courier new" , "courier" , monospace;">Calling handleMessage</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><env:Header xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"/></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><S:Body xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <Add xmlns="http://tempuri.org/"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <intA>5</intA></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <intB>6</intB></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </Add></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"></S:Body></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">Calling handleMessage</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><env:Header xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"/></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <AddResponse xmlns="http://tempuri.org/"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <AddResult>11</AddResult></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </AddResponse></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"></soap:Body></span><br />
<br />
<br />
Instead system.out.println, you can add ADF logger also to print messages. In that case your messages would appear in weblogic log as well.</div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com21tag:blogger.com,1999:blog-1799093969133798390.post-32172706957541860832018-02-19T00:42:00.001-08:002018-02-19T00:47:13.026-08:00Oracle JET: Bookmark a secured pages<div dir="ltr" style="text-align: left;" trbidi="on">
<b><u>Problem Description</u></b>: Oracle JET allows us to create SinglePage application (SPA). It changes url when we navigate between pages. What if application is secured application and pages require login to visit. In such case if we book mark a page and later try to launch it, application should verify if user is already logged in, If not redirect user to login page and once logged in user should be shown same page, which he has requested. In this blog we are trying to achieve it.<br />
<br />
Also if user has directly started from login page then if login is successful we need to take him to default page mentioned in router configuration.<br />
<br />
Solution:<br />
To implement this we need to achieve following flow<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-DuUDHhH0wbc/Wop-EOYNvDI/AAAAAAAADjk/-DyqrhApkX4GupI1FD9iruS_q02HbbvTACLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="837" data-original-width="1142" height="234" src="https://3.bp.blogspot.com/-DuUDHhH0wbc/Wop-EOYNvDI/AAAAAAAADjk/-DyqrhApkX4GupI1FD9iruS_q02HbbvTACLcBGAs/s320/1.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
Here are the steps to achieve above flow<br />
<br />
1. User can either launch login page or a secured page (say Page-X). If user launches login page, we can directly show him login page, but if he launches Page-X, we need to verify if user is already logged in.To verify if user has already logged in depends on server side logic.<br />
<div>
Here in this blog I assume there is a REST service available, which returns profile of logged in user (myprofile service). we will call this service, without passing any Authorization header. In such case browser will pass SESSIONID from cookie if user is already logged in. If not logged in then we will get 401 from server. If we get error from server, we can redirect user to login page, but we will add current url in login page url additionally, so that we can use it later to redirect user back to Page-X. Here is the common code checkIfLoginDone function written in appcontroller.js</div>
<div>
<br /></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">function ControllerViewModel() {</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> $.ajaxSetup({</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> xhrFields: {</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> withCredentials: true</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> }); </span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> var self = this;</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> self.baseURL='http://localhost:7101';</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> self.serviceContextRoot = '/myapp';</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> self.serviceInitialURL = self.baseURL + self.serviceContextRoot + '/resources';</span></div>
</div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> self.router = oj.Router.rootInstance;</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> self.checkIfLoginDone = function checkIfLoginDone(){</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> console.log('starting login check');</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> </span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> var promise = $.ajax({</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> type: "GET",</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> url: self.serviceInitialURL+ "/v1/myprofile",</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> contentType: "application/json; charset=utf-8",</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> crossDomain: true,</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> dataType: "json"});</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> </span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> promise.then(function(response) {</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> </span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> </span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> }, function(error) {</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> // error handler</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> <b>var currenturl = window.location.pathname + window.location.search ;</b></span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"><b> window.location.href = '/?root=login&origurl='+currenturl;</b></span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> });</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> return promise;</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> </span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> </span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> }</span></div>
</div>
<div>
<br /></div>
<div>
In above code if we get error from server, we will be redirecting user to login page and add url of secured page as a parameter origurl. Login page url will appear like</div>
<div>
http://<host>:<port>/?root=login&origurl=<url-path-of-secured-page></div>
<div>
<br /></div>
<div>
[Assuming that login will be router state for login page]</div>
<div>
<br /></div>
<div>
2. To perform login check we can it checkIfLoginDone from all secured pages's ViewModel as</div>
<div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">define(['ojs/ojcore', 'knockout', 'jquery', 'appController'],</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> function(oj, ko, $, app) {</span></div>
</div>
<div>
<div>
</div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> self.handleActivated = function(info) {</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> // Implement if needed</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> return app.checkIfLoginDone();</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"> };</span></div>
</div>
<div>
<br /></div>
<div>
3. Create a login page: For this you can follow below steps<br />
a. Create login.html in js/views directory. Content could be<br />
<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"> <div class="oj-hybrid-padding"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <h1>Login Content Area</h1></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <div id="sampleDemo" style="" class="demo-container"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <div id="componentDemoContent" style="width: 1px; min-width: 100%;"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <div id="form-container" class="oj-form-layout"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <div class="oj-form"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <div class="oj-flex"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <div class="oj-flex-item"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <oj-label show-required for="username">User Name</oj-label></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <b><oj-input-text id="username" required value="{{username}}"></oj-input-text></b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </div></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </div></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <div class="oj-flex"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <div class="oj-flex-item"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <oj-label for="password" show-required>Passward</oj-label></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <b><oj-input-password id="password" required value="{{password}}"></oj-input-password></b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </div></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </div></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </div></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <b><oj-button id='submit' on-click='[[doLogin]]'>Login</oj-button></b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </div> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </div></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </div></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </div></span><br />
<br />
In above page, we have created two fields username/password and a button Login.<br />
Username and password are bound to ViewModel and Login button click calls doLogin method of ViewModel<br />
<br />
b. Create login.js as a ViewModel in js/viewModels directory. Its code would be<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">define(['ojs/ojcore', 'knockout', 'jquery', 'appController','ojs/ojknockout','ojs/ojlabel','ojs/ojinputtext', 'ojs/ojcheckboxset'],</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> function(oj, ko, $, app) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> function LoginViewModel() {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> var self = this;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> function param(name) {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return (location.search.split(name + '=')[1] || '').split('&')[0];</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> self.username = ko.observable("");</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> self.password = ko.observable("");</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> self.doLogin = function doLogin(event){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> $("body").css("cursor", "wait");</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> //do server login here</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> var string = self.username() + ':' + self.password();</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> var encodedString = 'Basic ' + btoa(string);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> var promise = $.ajax({</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> type: "POST",</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> url: app.serviceInitialURL + '/v1/auth/login',</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> contentType: "application/json; charset=utf-8",</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> headers: {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> "Content-Type": "text/plain",</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> "Authorization": encodedString</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> },</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> crossDomain: true,</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> dataType: "json"});</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> promise.then(function(response){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> var origurl = param('origurl');</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> if(origurl){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> window.location.href = origurl;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> else{</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> oj.Router.rootInstance.go('dashboard');</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> $("body").css("cursor", "default");</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }, function(response){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> //write logic here to show error message to end user.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }) ; </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> // Header Config</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> self.headerConfig = {'viewName': 'header', 'viewModelFactory': app.getHeaderModel()};</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> return new LoginViewModel();</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: inherit;">Important piece of above code is </span><br />
<span style="font-family: inherit;"> i. username/password created as ko observable.</span><br />
<span style="font-family: inherit;"> ii. username password is used to create base 64 encoded authorization string</span><br />
<span style="font-family: inherit;"> iii. server side login using $.ajax POST request</span><br />
<span style="font-family: inherit;"> iv. If login is success then verify if there is any url parameter as origurl present. Navigate to the location whereever origurl points to. If not specified then get default page from router and navigate there. </span><br />
<br />
c. register login page in router configuration<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">self.router.configure({</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <b>'login': {label: 'Login'},</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'dashboard': {label: 'Dashboard', isDefault: true},</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'incidents': {label: 'Incidents'},</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'customers': {label: 'Customers'},</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'profile': {label: 'Profile'},</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> 'about': {label: 'About'}</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> });</span><br />
<span style="font-family: inherit;"><br /></span>
4. Finally we need a logout button. We can keep it in header.html<br />
<div class="oj-flex-bar-end"><br />
<oj-button id='button1' on-click="[[logout]]">Logout</oj-button><br />
</div><br />
<br />
logout implementation is written in appcontroller.js by changing getHeaderModel method.<br />
<span style="font-family: Courier New, Courier, monospace;"><b>self.logout = function(event)</b>{</span><br />
<span style="font-family: Courier New, Courier, monospace;"> $.ajax({</span><br />
<span style="font-family: Courier New, Courier, monospace;"> type: "GET",</span><br />
<span style="font-family: Courier New, Courier, monospace;"> url: self.serviceInitialURL+ "/v1/auth/logout",</span><br />
<span style="font-family: Courier New, Courier, monospace;"> contentType: "application/json; charset=utf-8",</span><br />
<span style="font-family: Courier New, Courier, monospace;"> crossDomain: true,</span><br />
<span style="font-family: Courier New, Courier, monospace;"> dataType: "json",</span><br />
<span style="font-family: Courier New, Courier, monospace;"> success: function (data, status, jqXHR) {</span><br />
<span style="font-family: Courier New, Courier, monospace;"> oj.Router.rootInstance.go('login');</span><br />
<span style="font-family: Courier New, Courier, monospace;"> },</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> error: function (jqXHR, status) {</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // error handler</span><br />
<span style="font-family: Courier New, Courier, monospace;"> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> }</span><br />
<span style="font-family: Courier New, Courier, monospace;"> });</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> }</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: courier new, courier, monospace;">self.getHeaderModel = function() {</span><br />
<span style="font-family: courier new, courier, monospace;"> var headerFactory = {</span><br />
<span style="font-family: courier new, courier, monospace;"> createViewModel: function(params, valueAccessor) {</span><br />
<span style="font-family: courier new, courier, monospace;"> var model = {</span><br />
<span style="font-family: courier new, courier, monospace;"> pageTitle: self.router.currentState().label,</span><br />
<span style="font-family: courier new, courier, monospace;"> handleBindingsApplied: function(info) {</span><br />
<span style="font-family: courier new, courier, monospace;"> // Adjust content padding after header bindings have been applied</span><br />
<span style="font-family: courier new, courier, monospace;"> self.adjustContentPadding();</span><br />
<span style="font-family: courier new, courier, monospace;"> },</span><br />
<span style="font-family: courier new, courier, monospace;"> toggleDrawer: self.toggleDrawer,</span><br />
<span style="font-family: courier new, courier, monospace;"> logout: <b>self.logout</b></span><br />
<span style="font-family: courier new, courier, monospace;"> };</span><br />
<span style="font-family: courier new, courier, monospace;"> return Promise.resolve(model);</span><br />
<span style="font-family: courier new, courier, monospace;"> }</span><br />
<span style="font-family: courier new, courier, monospace;"> }</span><br />
<span style="font-family: courier new, courier, monospace;"> return headerFactory;</span><br />
<span style="font-family: courier new, courier, monospace;"> }</span><br />
<br />
Above logout method calls server side logout and then redirect user to login page.<br />
<br />
<br />
<span style="font-family: inherit;"><br /></span></div>
</div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com100tag:blogger.com,1999:blog-1799093969133798390.post-68116063412639587482018-02-10T05:07:00.000-08:002018-02-10T05:07:32.613-08:00ADF: Attribute Defaulting<div dir="ltr" style="text-align: left;" trbidi="on">
<b><u>Problem Description:</u></b> Recently I came across a forum question where requirement was to make an EO attribute to be fetched value from database but should be ignored completely while saving data. User should definitely be able to update attribute from UI but it should not be posted to database.<br />
<a href="https://community.oracle.com/message/14677169#14677169">https://community.oracle.com/message/14677169#14677169</a><br />
<br />
Solution: Let us see what are our options<br />
<br />
In ADF either we can make attribute persistent or transient. If we make persistent, it will be mapped to a database column and its value will be fetched from database and also it will get posted back to database. There is no option to say only fetch from database but ignore while posting to database.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-hwkI0P4RJok/Wn54gVPAsaI/AAAAAAAADiE/1f6s-MGopEEmtxWUBRcHPkJPMsEVTON1wCLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="490" data-original-width="990" height="197" src="https://2.bp.blogspot.com/-hwkI0P4RJok/Wn54gVPAsaI/AAAAAAAADiE/1f6s-MGopEEmtxWUBRcHPkJPMsEVTON1wCLcBGAs/s400/1.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
As a solution we can mark our attribute transient so that its value will be ignored while posting to database. Now to default its value from database field we can specify default value. Value can be picked from SQL and good part is we can directly specify column name from which we want to default its value. Of course column must be present in same table. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
What if we want to fetch default value from some other table. </div>
<div class="separator" style="clear: both; text-align: left;">
You have two option</div>
<div class="separator" style="clear: both; text-align: left;">
1. Write a complete SELECT statement on default value field. You can pass values from current row of EO. For example let say you are querying employee table (which has manager id) and now you want to fetch his manager name. You can simply write SQL query as [SELECT MGR.FIRST_NAME FROM EMPLOYEES MGR WHERE MGR.EMPLOYEE_ID = EmployeeEO.MANAGER_ID]</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-WgAMOZajriU/Wn6OISIUdWI/AAAAAAAADiU/cimi4SZD6X4kuLe_TYoQFMRGmSE75G9uwCLcBGAs/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="136" data-original-width="494" height="110" src="https://3.bp.blogspot.com/-WgAMOZajriU/Wn6OISIUdWI/AAAAAAAADiU/cimi4SZD6X4kuLe_TYoQFMRGmSE75G9uwCLcBGAs/s400/2.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
2. You can also use a ViewAccessor with expression to default value. In this case you will use VO and add it as view accessor in EO. Now in default value, you can write groovy expression to get value from view accessor. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Same thing is applied for VO transient attributes as well. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Out of option 1 and 2, I would chose option 1 as preference. Reason for that is if you write SQL based default expression, a single query is fired against database and result is used to set default value of all rows. Query if formed something like</div>
<div class="separator" style="clear: both;">
SELECT EmployeeEO.EMPLOYEE_ID, EmployeeEO.FIRST_NAME, EmployeeEO.LAST_NAME, EmployeeEO.EMAIL, </div>
<div class="separator" style="clear: both;">
EmployeeEO.PHONE_NUMBER, EmployeeEO.HIRE_DATE, EmployeeEO.JOB_ID, EmployeeEO.SALARY, </div>
<div class="separator" style="clear: both;">
EmployeeEO.COMMISSION_PCT, EmployeeEO.MANAGER_ID, EmployeeEO.DEPARTMENT_ID, </div>
<div class="separator" style="clear: both;">
<b>(SELECT MGR.FIRST_NAME FROM EMPLOYEES MGR WHERE MGR.EMPLOYEE_ID = EmployeeEO.MANAGER_ID) AS MGR_NAME</b></div>
<div class="separator" style="clear: both;">
FROM EMPLOYEES EmployeeEO</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
In option 2, View accessor will be fired once for every row fetched. For example if we fetch 100 employee records and for each record a manager-vo query will fire to get manager name. You will end up with 101 queries. To improve View accessor queries, you can set RowLevelBinds = false if same view-accessor query result is ok for all records. In above case it will not fit. You need to fire separate view-accessor query with bind parameter as employee-id from source row to get correct manager name. </div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
Thats all</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br /></div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com1tag:blogger.com,1999:blog-1799093969133798390.post-43484680499503320452018-01-13T04:29:00.003-08:002018-01-13T04:30:39.019-08:00Oracle JET: Caching data<div dir="ltr" style="text-align: left;" trbidi="on">
<b><u>Problem Description</u></b>: Oracle JET is a client side technology and mostly it uses REST services to fetch data from server. Some of data is used on multiple pages and it does not change very frequently so its a good approach to query such data once and then cache it. Next time when you need it refer from cache.<br />
<br />
<br />
<b><u>Solution</u></b>:<br />
<br />
In Oracle JET we have index.html, which serves as main (or base) page. All other pages (module) appears on it. Some modules might be static and some are attached dynamically using router. To some up at run time, things are like below image.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-Y_kHn0mcGDU/WlYpBb7eyJI/AAAAAAAADek/R_9eNo1FXXI2mOtovQrzqXMb1YRWlyLyACLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="492" data-original-width="710" height="276" src="https://2.bp.blogspot.com/-Y_kHn0mcGDU/WlYpBb7eyJI/AAAAAAAADek/R_9eNo1FXXI2mOtovQrzqXMb1YRWlyLyACLcBGAs/s400/1.png" width="400" /></a></div>
Based on URL different modules keep on changing but index.html (base page) is as it is. It implies view model associated with it (also called root viewmodel) is also available all the time.<br />
<br />
Another thing that we should know is 'LifeCycle of ViewModel instances'. In general code for viewmodels are like below<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">define(['ojs/ojcore', 'knockout', 'jquery', 'appController'],</span><br />
<span style="font-family: Courier New, Courier, monospace;"> function(oj, ko, $, app) {</span><br />
<span style="font-family: Courier New, Courier, monospace;"> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> function PageXViewModel() {</span><br />
<span style="font-family: Courier New, Courier, monospace;"> console.log("Instantiating PageXViewModel");</span><br />
<span style="font-family: Courier New, Courier, monospace;"> var self = this;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> }</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> return new PageXViewModel();</span><br />
<span style="font-family: Courier New, Courier, monospace;"> }</span><br />
<span style="font-family: Courier New, Courier, monospace;">);</span><br />
<br />
If we see ViewModels are created using RequireJS define function. RequireJS is an AMD framework. It helps creating JS objects only when needed and once object is available, it associate it with a key. Object remains in memory always and you can access it with that key. All ViewModels are created like that. Which means ViewModel instace would get created when first time you access module associated with that ViewModel. Next time when you try to access ViewModel, you will not get a fresh instance, you will get same old instance instead.<br />
In above example PageXViewModel instance would get created only once, when we access PageX first time. After that if we go to PageY and come back to PageX, same instance of PageXViewModel will be reused. To confirm that you can see browser console log and find how many times "Instantiating PageXViewModel" is getting printed. You will find its only once, when PageX is loaded first time.<br />
<div>
<br /></div>
<div>
Effectively we can say if page is showing a module (PageX), there are two instances available PageXViewModel and RootViewModel. We can use them to cache our data. </div>
<br />
With that in mind, in this blog we can see various strategy to cache our data.<br />
<br />
There are different kinds of data that we show on pages<br />
1. Transactional data: which keeps on changing and user expects it to be latest always. For example table showing employee data. We should not try to cache such data as user expectation is to see latest data always. As we know our ViewModel instances are getting reused so how should we make sure that every time, we go to a page data is re-fetched from server. ViewModel has a function called handleActivated. This is called by framework always when a view is loaded. We can use this function to fetch data from server. For example<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"> self.handleActivated = function(info) {</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> var promise = $.ajax({</span><br />
<span style="font-family: Courier New, Courier, monospace;"> type: 'GET',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> url: 'http://myservice-url',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> contentType: "application/json; charset=utf-8",</span><br />
<span style="font-family: Courier New, Courier, monospace;"> crossDomain: true,</span><br />
<span style="font-family: Courier New, Courier, monospace;"> dataType: "json"</span><br />
<span style="font-family: Courier New, Courier, monospace;"> })</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span> </span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span> promise.then(function(data) {</span><br />
<span style="font-family: Courier New, Courier, monospace;"> self.data = ko.observableArray(data);</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> });</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> return promise;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> };</span><br />
<span style="font-family: inherit;">In above code we are setting data property of ViewModel using a REST output and this code runs every time we load page, so data will always show new values from server whenever page is loaded.</span><br />
<br />
2. Setup data: which rarely changes. For example data appearing in various drop-downs (lookup). This kind of data is ideal for caching. In this example let say we have a lookup PRIORITY and it shows values as High (H), Medium (M), Low (L). We want to show it as drop-down on customer and profile pages.<br />
<br />
To cache that I have two step code<br />
a. Add below method in appcontroller.js<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">function ControllerViewModel() {</span><br />
<span style="font-family: Courier New, Courier, monospace;"> var self = this;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> //initiate global cache with empty objects</span><br />
<span style="font-family: Courier New, Courier, monospace;"> self.globals = {lookups: []};</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> //core private method responsible for fetching lookup data using rest-service</span><br />
<span style="font-family: Courier New, Courier, monospace;"> var fetchLookupData = function fetchLookupData(lookupType){</span><br />
<span style="font-family: Courier New, Courier, monospace;"> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> var encodedString = 'Basic ' + btoa('username:password');</span><br />
<span style="font-family: Courier New, Courier, monospace;"> var promise = $.ajax({</span><br />
<span style="font-family: Courier New, Courier, monospace;"> type: 'GET',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> url: 'my-rest-url,</span><br />
<span style="font-family: Courier New, Courier, monospace;"> contentType: "application/json; charset=utf-8",</span><br />
<span style="font-family: Courier New, Courier, monospace;"> headers: {"Authorization": encodedString},</span><br />
<span style="font-family: Courier New, Courier, monospace;"> crossDomain: true,</span><br />
<span style="font-family: Courier New, Courier, monospace;"> dataType: "json"</span><br />
<span style="font-family: Courier New, Courier, monospace;"> });</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> promise.then(function(response) {</span><br />
<span style="font-family: Courier New, Courier, monospace;"> self.globals.lookups.push ( {"lookupType": lookupType, </span><br />
<span style="font-family: Courier New, Courier, monospace;"> "lookupValues": response.lookupValues});</span><br />
<span style="font-family: Courier New, Courier, monospace;"> </span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> }, function(error) {</span><br />
<span style="font-family: Courier New, Courier, monospace;"> //alertFactory.handleServiceErrors(error);</span><br />
<span style="font-family: Courier New, Courier, monospace;"> console.log(error); //Handle errors in a better way</span><br />
<span style="font-family: Courier New, Courier, monospace;"> });</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> return promise;</span><br />
<span style="font-family: Courier New, Courier, monospace;"> }</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> //method to put a logic to get lookup data from cache (global) first and if not present then from rest-service</span><br />
<span style="font-family: Courier New, Courier, monospace;"> self.initLookpCache = function initLookpCache(lookupType){</span><br />
<span style="font-family: Courier New, Courier, monospace;"> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> var lookups = self.globals.lookups.filter(function (lookup){</span><br />
<span style="font-family: Courier New, Courier, monospace;"> return lookup.lookupType === lookupType;</span><br />
<span style="font-family: Courier New, Courier, monospace;"> })</span><br />
<span style="font-family: Courier New, Courier, monospace;"> if(lookups.length > 0){</span><br />
<span style="font-family: Courier New, Courier, monospace;"> console.log("Lookup present in cache");</span><br />
<span style="font-family: Courier New, Courier, monospace;"> return lookups[0];</span><br />
<span style="font-family: Courier New, Courier, monospace;"> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> }</span><br />
<span style="font-family: Courier New, Courier, monospace;"> else{</span><br />
<span style="font-family: Courier New, Courier, monospace;"> console.log("Reading lookup from service");</span><br />
<span style="font-family: Courier New, Courier, monospace;"> return fetchLookupData(lookupType);</span><br />
<span style="font-family: Courier New, Courier, monospace;"> }</span><br />
<span style="font-family: Courier New, Courier, monospace;"> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> }</span><br />
<div>
<span style="font-family: Courier New, Courier, monospace;"> </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> //Remaining standard code of appcontroller.js is not shown.</span></div>
<br />
Now on page, which requires cached data we can add below lines. Add it in customer.js and profile.js both<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">self.handleActivated = function(info) {</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // Implement if needed</span><br />
<span style="font-family: Courier New, Courier, monospace;"> console.log('running handleActivated from CustomerViewModel');</span><br />
<span style="font-family: Courier New, Courier, monospace;"> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> var promise = app.initLookpCache('MY_LOOKUP_TYPE');</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Promise.resolve(promise).then(function(lookupTypeValues) {</span><br />
<span style="font-family: Courier New, Courier, monospace;"> self.linkTypes = ko.observableArray(lookupTypeValues.lookupValues);</span><br />
<span style="font-family: Courier New, Courier, monospace;"> });</span><br />
<div>
<br /></div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> return promise;</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> };</span><br />
<br />
<br />
We have actually put a call to Root-ViewModel's initLookupCache<br />
It can return either Promise or lookupvalue. Promise is returned if values are getting fetched from REST service call. LookupValues are returned directly if values are coming from cache.<br />
<br />
Promise.resolve make sure that<br />
if input is promise object then wait for it to get completed and once completed then only run function specified in then.<br />
if input is not promise but direct values then directly runs the function and pass values as input.<br />
<br />
If you run customer and profile pages, you will find below log<br />
<span style="font-family: Courier New, Courier, monospace;">running handleActivated from CustomerViewModel</span><br />
<span style="font-family: Courier New, Courier, monospace;">Reading lookup from service</span><br />
<br />
Instantiating ProfileViewModel<br />
<span style="font-family: Courier New, Courier, monospace;">running handleActivated from ProfileViewModel</span><br />
<span style="font-family: Courier New, Courier, monospace;">Lookup present in cache</span><br />
<br />
You can see lookup values are coming from cache second time. Good part is its incremental cache, as and when you need lookup data first time, it will get cached. You are not loading all lookup data upfront.<br />
<br />
Few other tips<br />
<br />
a. If you want to cache a data which is required very frequently (almost on all pages) you can cache such data from appcontroller.js itself.<br />
<br />
<br />
c. If you want to cache a data, which is required only in very very few pages you can cache them in their respective page's ViewModel itself. For that instead of calling appcontroller's method you can have local method and populate ViewModel (self.data) variable. NOTE: Even these page's viewmodel are not getting destroyed so anything cached there is also present throughout. For local caching your code of handleActivated could be be something like<br />
<span style="font-family: "Courier New", Courier, monospace;">self.data = ko.observable();</span><br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">self.handleActivated = function(info) {</span><br />
<span style="font-family: "Courier New", Courier, monospace;"> if(!self.data()){</span><br />
<span style="font-family: Courier New, Courier, monospace;"> //Make reset service call and populate self.data</span><br />
<span style="font-family: Courier New, Courier, monospace;"> }</span><br />
<span style="font-family: "Courier New", Courier, monospace;">}</span><br />
<br />
<br />
<br />
<br />
Thats all.<br />
<br /></div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com2tag:blogger.com,1999:blog-1799093969133798390.post-87297242556572362062017-11-24T09:53:00.001-08:002017-11-24T09:59:59.649-08:00Removing a corrupted weblogic deployment.<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Problem Description</b>: What if you have deployed an application on weblogic and somehow it has got corrupted and you want to undeploy it. Most of the time you can go to weblogic console and undeploy but at times it gets corrupted so badly that you can't even start your weblogic server. I faced this issue recently while experimenting with filters. My filter code has some problem. Application got deployed successfully but when I try to use it, due to code bug in filter, it was going in infinite loop. So I stopped weblogic server. Now when I try to start my weblogic server, it by default tries to deploy previous application and this time because of problem in deployment weblogic was not starting. To sum up I need to delete my weblogic deployment offline.<br />
<br />
Here are the changes I did<br />
<br />
1. Find your config.xml and see app-deployment node. For integrated server config.xml is located in <System-Directory>/DefaultDomain/config/config.xml<br />
<br />
Your entry will be something like below<br />
<br />
<app-deployment><br />
<name>MyApplication</name><br />
<target>DefaultServer</target><br />
<module-type>ear</module-type><br />
<source-path>D:\Oracle\Middlewares\JDEV_SystemDir\system12.2.1.0.42.151011.0031\o.j2ee\drs\MyApplication</source-path><br />
<security-dd-model>DDOnly</security-dd-model><br />
<staging-mode xsi:nil="true"></staging-mode><br />
<plan-staging-mode xsi:nil="true"></plan-staging-mode><br />
<cache-in-app-directory>false</cache-in-app-directory><br />
</app-deployment><br />
<br />
a. Note source-path location. Remove your deployment from that location.<br />
b. Remove entry of app-deployment from config.xml file as well.<br />
c. Also remove your applicaton from <System-Directory>/servers\DefaultServer\tmp\_WL_user directory.<br />
d. To my surprise even after all these changes, weblogic server was not starting. I thought of deleting DefaultDomain directory but then I decided to close jdev once and try. That worked.<br />
<br />
To sumup you need to close jdev and then perform a,b and c task mentioned above.<br />
<br />
<br />
Now you can start your application.<br />
<br />
Similarly I believe you can delete invalid jndi entries also from this file if you find that your weblogic is taking long time to start because of invalid jndi entries. Actually weblogic tries to look in this file and connect with those database while starting to reserve connections in pool but if database is down or no longer valid, weblogic waits for timeout and it makes weblogic startup slow.<br />
<br />
Thats all.</div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com2tag:blogger.com,1999:blog-1799093969133798390.post-77538154106025718332017-07-31T22:11:00.000-07:002017-07-31T22:11:46.345-07:00JCS-SX: Deploy your first application<div dir="ltr" style="text-align: left;" trbidi="on">
Problem description: If you create a minimum ADF application and try deploy it directly on JCS-SX instance your deployment may fail with below error<br />
<br />
2017-07-31 19:02:13 CDT: weblogic.application.ModuleException: weblogic.application.ModuleException:<br />
<span style="white-space: pre;"> </span>at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1531)<br />
<span style="white-space: pre;"> </span>at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:488)<br />
<span style="white-space: pre;"> </span>at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:425)<br />
<span style="white-space: pre;"> </span>at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)<br />
<span style="white-space: pre;"> </span>at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:119)<br />
<span style="white-space: pre;"> </span>at weblogic.application.internal.flow.ScopedModuleDriver.start(ScopedModuleDriver.java:200)<br />
<span style="white-space: pre;"> </span>at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:247)<br />
<span style="white-space: pre;"> </span>at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:425)<br />
<span style="white-space: pre;"> </span>at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)<br />
<span style="white-space: pre;"> </span>at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:119)<br />
<span style="white-space: pre;"> </span>at weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:27)<br />
<span style="white-space: pre;"> </span>at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:671)<br />
<span style="white-space: pre;"> </span>at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)<br />
<span style="white-space: pre;"> </span>at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:212)<br />
<span style="white-space: pre;"> </span>at weblogic.application.internal.EarDeployment.activate(EarDeployment.java:59)<br />
<span style="white-space: pre;"> </span>at<br />
<br />
<br />
Solution:<br />
You need to create weblogic.xml file inside WEB-INF and make following entry in it<br />
<br />
<?xml version = '1.0' encoding = 'windows-1252'?><br />
<weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-web-app http://www.bea.com/ns/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd"<br />
xmlns="http://www.bea.com/ns/weblogic/weblogic-web-app"><br />
<br />
<br />
<library-ref><br />
<library-name>adf.oracle.domain.webapp</library-name><br />
</library-ref><br />
<library-ref><br />
<library-name>jstl</library-name><br />
<specification-version>1.2</specification-version><br />
</library-ref><br />
<library-ref><br />
<library-name>jsf</library-name><br />
<specification-version>1.2</specification-version><br />
<exact-match>true</exact-match><br />
</library-ref><br />
<br />
<br />
</weblogic-web-app><br />
<br />
<br />
Once done you can deploy your application.<br />
<br />
<br />
Thats all.</div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com1tag:blogger.com,1999:blog-1799093969133798390.post-53077388414469102082017-07-31T16:50:00.003-07:002017-07-31T16:51:12.115-07:00Making ADF page Readonly<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Problem description</b>: Sometime we found that we want to make ADF page readonly based on certain condition. One option is apply EL expression on all input fields of ADF page. For example you can write EL as readonly="#{pageFlowScope.pPageMode=='View'}. By this expression we are saying make input field read only if page mode is view. If there are multiple input fields, we need to apply it on all those fields. I would say if number of fields are less, its manageable but at times fields are more and it becomes very difficult to maintain this condition. In future also some developer may add new field but then forget to add this condition. So at times it becomes error pron and we need a centralized solution to make a page readonly. In this blog I am showing a generic method, which makes page input/action items disabled/readonly.<br />
<br />
<b><u>Solution</u></b><br />
<br />
<b>1. Have a bean for page and write below method</b><br />
<br />
private void makeComponentHierarchyReadOnly(UIComponent component) {<br />
<br />
try {<br />
Method method1 =<br />
component.getClass().getMethod("setDisabled", boolean.class);<br />
if (method1 != null) {<br />
method1.invoke(component, true);<br />
}<br />
<br />
<br />
} catch (NoSuchMethodException e) {<br />
try {<br />
Method method =<br />
component.getClass().getMethod("setReadOnly", boolean.class);<br />
if (method != null) {<br />
method.invoke(component, true);<br />
}<br />
} catch (Exception e1) {<br />
// e.printStackTrace();//silently eat this exception.<br />
}<br />
<br />
<br />
} catch (Exception e) {<br />
// e.printStackTrace();//silently eat this exception.<br />
}<br />
List<UIComponent> childComponents = component.getChildren();<br />
for (UIComponent comp : childComponents) {<br />
makeComponentHierarchyReadOnly(comp);<br />
}<br />
<br />
}<br />
<br />
Above method is taking UI component as input. It iterates over each child upto n level and try to disable them or if disable property is not there then it tries to make it readonly.<br />
<br />
NOTE: Disable will also disable links/button and all action items as well.<br />
<br />
<b>2. You can call above code at appropriate time:</b> Mostly we want to call above code at page load but at times you may have View/Edit button and on click of that you want to call it. If you want to call it at page load you can take approach 3 as described in blog http://sanjeev-technology.blogspot.in/2017/02/adf-execute-code-before-page-load.html<br />
<br />
If you want to call on button click then you can simply have actionListener and call above method from there. For example<br />
public void makePageReadOnly(ActionEvent actionEvent) {<br />
// Add event code here...<br />
makeComponentHierarchyReadOnly(this.getMyPageRootComponent());<br />
<br />
}<br />
<br />
getMyPageRootComponent is a getter for a UI component under which you want everything to be readonly. To get this component, you just need to bind it with bean.<br />
<br />
Thats all. Thank you for your time.<br />
<br />
<br />
<br /></div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com3tag:blogger.com,1999:blog-1799093969133798390.post-81079008555906383002017-05-08T02:44:00.002-07:002017-05-08T17:43:47.575-07:00Oracle JET: Hybrid android app using NetBeans<div dir="ltr" style="text-align: left;" trbidi="on">
This blog is continuation of my previous blog http://sanjeev-technology.blogspot.in/2017/05/oracle-jet-first-hybrid-android-mobile.html<br />
<br />
In that blog I showed how we can use npm, yo and grunt commands to develop a new web/mobile application in JET.<br />
In this blog my idea is simply open the project in NetBeans and start development in NetBeans. NetBeans provide auto-completion + templates for new project etc for Oracle JET. As we have already created project using commands so we will not be creating a new project but directly open it in NetBeans and start using it.<br />
<br />
1. <b>Open project</b>: To open project in NetBeans you can navigate as File > Open Project<br />
Good News: NetBeans automatically identifies our project created using yoman (yo) as a project.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-is33HaKNelM/WRAOWd3IuFI/AAAAAAAADF0/KnYzNJBkpeAijkIUwn5eCLq1QZ9mPpJsQCLcB/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="149" src="https://4.bp.blogspot.com/-is33HaKNelM/WRAOWd3IuFI/AAAAAAAADF0/KnYzNJBkpeAijkIUwn5eCLq1QZ9mPpJsQCLcB/s320/1.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<blockquote class="tr_bq" style="clear: both; text-align: left;">
We get various source directories (src, src-hybrid, src-web). We also have a separate web directory.</blockquote>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-A37ravGLsbU/WRAfeSNcDgI/AAAAAAAADGE/VtpU_OIE8YUuUPhIruoZL-WqvVDdyFCLgCLcB/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="270" src="https://3.bp.blogspot.com/-A37ravGLsbU/WRAfeSNcDgI/AAAAAAAADGE/VtpU_OIE8YUuUPhIruoZL-WqvVDdyFCLgCLcB/s320/2.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
2. <b>Make changes</b>: Let us make some changes in source and see its<br />
<blockquote class="tr_bq">
Few things to notice: </blockquote>
<br />
<blockquote class="tr_bq">
<ul style="text-align: left;">
<li>We can directly run index.html present in web directory.</li>
</ul>
</blockquote>
<blockquote class="tr_bq">
<ul style="text-align: left;">
<li>Once its running Chrome browser shows a bar " NetBeans Connector" is debugging this browser. Don't cancel it. It enables browser log to appear in NetBeans console. </li>
</ul>
</blockquote>
<blockquote class="tr_bq">
<ul style="text-align: left;">
<li>Any changes done in web directory (Site Root) are picked immediately (without restart). </li>
<li>Any changes done in src directories are also picked immediately (without restart). Actually these changes are pushed automatically to web directory immediately and application picks from web after that.</li>
<li>Ideally we should be changing src directory and should not code in web directory in this kind of setup. web directory is kind of classes directory and NetBeans will use it to run application. </li>
</ul>
</blockquote>
<br />
<blockquote class="tr_bq">
</blockquote>
<br />
3. <b>Run and Quick test</b>: For this demo I just make changes in index.html inside src directory. I will change quickly change <h2 class="demo-profile-name">James</h2> to <h2 class="demo-profile-name">Sanjeev</h2>. I just need to save it. I find that changes are automatically pushed to web directory and even my browser is refreshed automatically to show new changes.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-P8UZI82O31E/WRAwTct-fyI/AAAAAAAADGU/T7fqoYvKBmgDoesVDskACOy346fD4VlCACLcB/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="262" src="https://4.bp.blogspot.com/-P8UZI82O31E/WRAwTct-fyI/AAAAAAAADGU/T7fqoYvKBmgDoesVDskACOy346fD4VlCACLcB/s320/3.png" width="320" /></a></div>
<br />
<br />
<br />
4. <b>Release using Grunt from NetBeans</b><br />
<br />
To run grunt commands for project, I can right click on project and select Grunt Tasks. There are few tasks already listed. To release I need to use serve:release task, which is not listed, so I can go to advance and create my own task.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-H0NG9GH5GpU/WRAyIMPN38I/AAAAAAAADGk/FP1JewAu-l8-POdmzU6itaXlQV7ase_jwCLcB/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="264" src="https://3.bp.blogspot.com/-H0NG9GH5GpU/WRAyIMPN38I/AAAAAAAADGk/FP1JewAu-l8-POdmzU6itaXlQV7ase_jwCLcB/s320/4.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-of_kywHaX_I/WRAztZJhpVI/AAAAAAAADGw/whUcP-kQi1sxb9OD0vSSjJD_AfdDD9-aACLcB/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="211" src="https://4.bp.blogspot.com/-of_kywHaX_I/WRAztZJhpVI/AAAAAAAADGw/whUcP-kQi1sxb9OD0vSSjJD_AfdDD9-aACLcB/s320/5.png" width="320" /></a></div>
<br />
Under grunt tab log you will see location of apk file.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-txz6UkPV_Fs/WRA9dlHM-YI/AAAAAAAADHA/lr7Ch6oFieAB2Q1kPiWU7ZD7FKE00HfJgCLcB/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="227" src="https://2.bp.blogspot.com/-txz6UkPV_Fs/WRA9dlHM-YI/AAAAAAAADHA/lr7Ch6oFieAB2Q1kPiWU7ZD7FKE00HfJgCLcB/s320/6.png" width="320" /></a></div>
<br />
Thats all. Now you can move and install this apk in android phone.<br />
<br /></div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com5tag:blogger.com,1999:blog-1799093969133798390.post-74867840178562485242017-05-01T05:12:00.000-07:002017-05-08T17:42:03.172-07:00Oracle JET: First Hybrid android Mobile App<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Problem Description</b>: In this blog I am just putting all steps those I followed to create a mobile app using Oracle JET<br />
<br />
<b>Solution: Here are the steps that I followed to create my first application. As there are multiple ways to start JET development so I would not say this is best way but this is what works for me.</b><br />
<br />
<br />
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->
<br />
<div style="margin-left: .5in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";">
</span></span>Install Node.js: <a href="https://nodejs.org/en/download">https://nodejs.org/en/download</a>. Once
node is installed you should be able to run npm commands.</div>
<div style="margin-left: .5in;">
<br /></div>
<div style="margin-left: .5in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";">
</span></span>Run command prompt in Admin mode and then run below
commands to install various npm modules</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">a.<span style="font: 7.0pt "Times New Roman";">
</span></span>npm install -g cordova</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">b.<span style="font: 7.0pt "Times New Roman";">
</span></span>npm install -g yo</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">c.<span style="font: 7.0pt "Times New Roman";">
</span></span>npm install -g grunt-cli</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">d.<span style="font: 7.0pt "Times New Roman";">
</span></span>npm install -g bower</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">e.<span style="font: 7.0pt "Times New Roman";">
</span></span>npm install -g generator-oraclejet</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">f.<span style="font: 7.0pt "Times New Roman";">
</span></span>npm install -g cordova</div>
<br />
<div style="margin-left: .5in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">3.<span style="font: 7.0pt "Times New Roman";">
</span></span>Install android sdk: I have installed android studio,
which comes with android sdk as well.
https://developer.android.com/studio/index.html </div>
<div style="margin-left: .5in;">
<br /></div>
<div style="margin-left: .5in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">4.<span style="font: 7.0pt "Times New Roman";">
</span></span>Use SDK Manager and install api required api: To launch
SDK manager from android studio you need not to create any project. You can
simply start android studio and select configure option</div>
<!--[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="--"/>
<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="371">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="0" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" 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" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 9"/>
<w:LsdException Locked="false" Priority="0" 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" Priority="0" 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" Priority="0" 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" Priority="0" 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" Priority="0" 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" 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" 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: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="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<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/-ENqFPpQ4jaQ/WQX3KcJzonI/AAAAAAAADCU/-8w4wNIyPVEDHe1orQZtdMZ06RV60FrlACLcB/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="254" src="https://4.bp.blogspot.com/-ENqFPpQ4jaQ/WQX3KcJzonI/AAAAAAAADCU/-8w4wNIyPVEDHe1orQZtdMZ06RV60FrlACLcB/s320/1.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--></div>
<div class="separator" style="clear: both; text-align: left;">
<!--[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="--"/>
<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="371">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="0" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" 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" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 9"/>
<w:LsdException Locked="false" Priority="0" 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" Priority="0" 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" Priority="0" 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" Priority="0" 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" Priority="0" 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" 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" 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: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]-->
</div>
<div class="MsoListParagraph">
Below image shows how my SDK manager looks like</div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-PuDicd1OFXg/WQX3NllGxbI/AAAAAAAADCY/ADIMQEvHV4oaVJgjHaDoMwXzyLtO432aQCEw/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="285" src="https://2.bp.blogspot.com/-PuDicd1OFXg/WQX3NllGxbI/AAAAAAAADCY/ADIMQEvHV4oaVJgjHaDoMwXzyLtO432aQCEw/s320/2.png" width="320" /></a></div>
<br />
<br />
<br />
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->5. Create web project and run it.<br />
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">a.<span style="font: 7.0pt "Times New Roman";">
</span></span>Navigate to directory where you want to create project
(say: D:\practice-jet)</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">b.<span style="font: 7.0pt "Times New Roman";">
</span></span>Before creating porject verify that you have all npm
modules installed: <span style="color: #3d3d3d; font-family: "arial" , sans-serif; font-size: 10.5pt;"> </span></div>
<!--[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="--"/>
<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="371">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="0" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" 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" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 9"/>
<w:LsdException Locked="false" Priority="0" 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" Priority="0" 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" Priority="0" 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" Priority="0" 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" Priority="0" 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" 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" 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: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 style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="color: #3d3d3d; font-family: "helvetica neue" , "helvetica" , "arial" , "lucida grande" , sans-serif; font-size: 14px;">npm list -g --depth=0</span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-Kdrdhbinmlo/WQX5aRmvLiI/AAAAAAAADCk/NKSvHnwxnU07Xu5ccuWrzPCHAzsPjYzLQCLcB/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="100" src="https://3.bp.blogspot.com/-Kdrdhbinmlo/WQX5aRmvLiI/AAAAAAAADCk/NKSvHnwxnU07Xu5ccuWrzPCHAzsPjYzLQCLcB/s320/3.png" width="320" /></a></div>
<br />
<div style="color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 14px; padding: 0px;">
</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="--"/>
<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="371">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="0" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" 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" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 9"/>
<w:LsdException Locked="false" Priority="0" 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" Priority="0" 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" Priority="0" 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" Priority="0" 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" Priority="0" 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" 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" 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: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]--> c. Run command: I prefer creating a web project first and
then add hybrid mobile<br />
application feature to it.
<br />
<div style="margin-left: 1.0in;">
<span style="mso-spacerun: yes;"> </span>yo
oraclejet MyFirstApp --template=navdrawer:hybrid</div>
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-2j6Dd9JpAZ4/WQb0HF9fPrI/AAAAAAAADC0/ZzkJm3OtMug1ZXw5iIn-VBwQbhdzkt4KwCLcB/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="237" src="https://2.bp.blogspot.com/-2j6Dd9JpAZ4/WQb0HF9fPrI/AAAAAAAADC0/ZzkJm3OtMug1ZXw5iIn-VBwQbhdzkt4KwCLcB/s320/4.png" width="320" /></a></div>
d. cd MyFirstApp<br />
e. grunt build<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-dzusM3xt2Kc/WQb2f3bp1_I/AAAAAAAADDA/9LIMHeLsPi49HDKm8mxJSW9GutzDldwYACLcB/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="204" src="https://3.bp.blogspot.com/-dzusM3xt2Kc/WQb2f3bp1_I/AAAAAAAADDA/9LIMHeLsPi49HDKm8mxJSW9GutzDldwYACLcB/s320/5.png" width="320" /></a></div>
<br />
f. grunt serve<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-YMizQjCCIfg/WQb3ZUiSDVI/AAAAAAAADDM/sqYCtxW0FTwfviFLvGU1qUMZuaa-XLhFACLcB/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://1.bp.blogspot.com/-YMizQjCCIfg/WQb3ZUiSDVI/AAAAAAAADDM/sqYCtxW0FTwfviFLvGU1qUMZuaa-XLhFACLcB/s320/6.png" width="306" /></a></div>
grunt serve command will start a process at port 8000 port. Your page will be visible on<br />
browser at http://localhost:8000<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-FtzCC3c6NBg/WQb4exSKQpI/AAAAAAAADDY/nsj4cuDlelQZWLXKYeN3ltwl6Mr7l1HqwCLcB/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="165" src="https://3.bp.blogspot.com/-FtzCC3c6NBg/WQb4exSKQpI/AAAAAAAADDY/nsj4cuDlelQZWLXKYeN3ltwl6Mr7l1HqwCLcB/s320/7.png" width="320" /></a></div>
we can kill process using ctrl+c. Now our application is running fine on browser. We<br />
have following directory structure till now.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-A6HTqLUWsmU/WQb7LCc0eOI/AAAAAAAADDk/KdJF496cDY0Yxq7iqQTgDoCK5choTxVogCLcB/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="183" src="https://4.bp.blogspot.com/-A6HTqLUWsmU/WQb7LCc0eOI/AAAAAAAADDk/KdJF496cDY0Yxq7iqQTgDoCK5choTxVogCLcB/s320/8.png" width="320" /></a></div>
6. Let us add android feature to our project<br />
yo oraclejet:add-hybrid --platforms=android<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-NEFpesvbEyQ/WQb9QMkuFXI/AAAAAAAADD0/HPkOqDzUofYwcm1Ro-wRfoK2KJ91dfDNwCLcB/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="216" src="https://1.bp.blogspot.com/-NEFpesvbEyQ/WQb9QMkuFXI/AAAAAAAADD0/HPkOqDzUofYwcm1Ro-wRfoK2KJ91dfDNwCLcB/s320/9.png" width="320" /></a></div>
If we see directory structure, it has got two additional directory src-web and src-hybrid. We already have one src directory. Main (or common code ) will reside in src folder. Code which is only applicable to web application will go in src-web project. Code which is only applicable to hybrid application will be in src-hybrid folder.<br />
<br />
7. Build project<br />
grunt build --platform=android<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-8ktew42nl_Q/WQcH-J2S11I/AAAAAAAADEQ/sauHsZrNVfESxm13gIbps3-PEYnN4yV_ACLcB/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://3.bp.blogspot.com/-8ktew42nl_Q/WQcH-J2S11I/AAAAAAAADEQ/sauHsZrNVfESxm13gIbps3-PEYnN4yV_ACLcB/s320/11.png" width="306" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
This step has created an android-debug.apk file in D:\practice-jet\MyFirstApp\hybri\platforms\android\build\outputs\apk folder. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
8. Create release ready apk file</div>
<div class="separator" style="clear: both; text-align: left;">
Keystore with key creation: Now we want to create a release ready apk file. For that we need to first use keytool to create keystore and alias. We can run below command for that </div>
<div class="separator" style="clear: both; text-align: left;">
keytool -genkey -v -keystore MyFirstApp.keystore -alias MyFirstApp -keyalg RSA -keysize 2048 -validity 10000</div>
<div class="separator" style="clear: both; text-align: left;">
Command should ask for password for keystore and key. It will also ask for additional details like lastname, first name etc. You can hit enter if you don't want to provide. </div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-Q9-Te9Gqsy4/WQca6Evyg-I/AAAAAAAADE4/jf9A0fFcvw8W5IIS-22xGMud--jo8p-MgCLcB/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="171" src="https://2.bp.blogspot.com/-Q9-Te9Gqsy4/WQca6Evyg-I/AAAAAAAADE4/jf9A0fFcvw8W5IIS-22xGMud--jo8p-MgCLcB/s320/12.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
We can keep keystore file outside project so that you can use same keystore with multiple application. My KeyStore name is MyFirstApp, password is 'manager' and Key name is agains MyFirstApp. Keystore and key passwords are same. Definitely you will have different keystore/key/passwords.<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
Now we will create a buildconfig file, which has entry of keystore. I placed file in d:\practice-jet folder. Content of file looks like</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-JbUBgYvLUpE/WQccRLY8rSI/AAAAAAAADFE/iA2dKr8jQa44bkXOn1OBpPYl9ABLa69GQCLcB/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="174" src="https://4.bp.blogspot.com/-JbUBgYvLUpE/WQccRLY8rSI/AAAAAAAADFE/iA2dKr8jQa44bkXOn1OBpPYl9ABLa69GQCLcB/s320/13.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Finally run below command to generate release ready apk file</div>
<br />
grunt serve:release --platform=android --buildConfig=D:\practice-jet\buildConfig.json<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-Fv8-z4OWQL4/WQcfeNec0rI/AAAAAAAADFQ/RSP8gxIcVzQSWepsd39wYhYOo9rQbFZ4QCLcB/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="246" src="https://1.bp.blogspot.com/-Fv8-z4OWQL4/WQcfeNec0rI/AAAAAAAADFQ/RSP8gxIcVzQSWepsd39wYhYOo9rQbFZ4QCLcB/s320/14.png" width="320" /></a></div>
<br />
I have moved file to my android phone and installed apk. Here is the image of running application<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-VkWXtCE0ByM/WQchwDg6l_I/AAAAAAAADFc/mnqCdEsymBQLPc3kEnNMthq9_ciZSfCagCLcB/s1600/output.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://2.bp.blogspot.com/-VkWXtCE0ByM/WQchwDg6l_I/AAAAAAAADFc/mnqCdEsymBQLPc3kEnNMthq9_ciZSfCagCLcB/s320/output.jpg" width="180" /></a></div>
<br />
<br />
9. Edit something in code and verify changes.<br />
To edit code you should make changes in src folder and then use grunt serve command to run it.<br />
NOTE: to edit web specific code use src-web and to edit hybrid specific code use src-hybrid.<br />
NOTE: As we have multiple platform now grunt serve will not be enough, we need to specify which platform. Use command grunt serve --platform=web to run its web version in browser.<br />
<br />
To sum up, we have run following important commands<br />
<br />
<!--[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="--"/>
<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="371">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="0" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" 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" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toc 9"/>
<w:LsdException Locked="false" Priority="0" 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" Priority="0" 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" Priority="0" 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" Priority="0" 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" Priority="0" 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" 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" 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: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 style="margin-left: .5in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";">
</span></span>One time setup</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">a.<span style="font: 7.0pt "Times New Roman";">
</span></span>Node install</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">b.<span style="font: 7.0pt "Times New Roman";">
</span></span>Node module install</div>
<div style="margin-left: 1.5in; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;">
<span style="mso-list: Ignore;"><span style="font: 7.0pt "Times New Roman";">
</span>i.<span style="font: 7.0pt "Times New Roman";">
</span></span>npm install -g cordova</div>
<div style="margin-left: 1.5in; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;">
<span style="mso-list: Ignore;"><span style="font: 7.0pt "Times New Roman";">
</span>ii.<span style="font: 7.0pt "Times New Roman";">
</span></span>npm install -g yo</div>
<div style="margin-left: 1.5in; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;">
<span style="mso-list: Ignore;"><span style="font: 7.0pt "Times New Roman";">
</span>iii.<span style="font: 7.0pt "Times New Roman";">
</span></span>npm install -g grunt-cli</div>
<div style="margin-left: 1.5in; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;">
<span style="mso-list: Ignore;"><span style="font: 7.0pt "Times New Roman";">
</span>iv.<span style="font: 7.0pt "Times New Roman";">
</span></span>npm install -g bower</div>
<div style="margin-left: 1.5in; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;">
<span style="mso-list: Ignore;"><span style="font: 7.0pt "Times New Roman";">
</span>v.<span style="font: 7.0pt "Times New Roman";">
</span></span>npm install -g generator-oraclejet</div>
<div style="margin-left: 1.5in; mso-list: l0 level3 lfo1; mso-text-indent-alt: -9.0pt; text-indent: -1.5in;">
<span style="mso-list: Ignore;"><span style="font: 7.0pt "Times New Roman";">
</span>vi.<span style="font: 7.0pt "Times New Roman";">
</span></span>npm install -g cordova</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">c.<span style="font: 7.0pt "Times New Roman";">
</span></span>Android SDK installation</div>
<div style="margin-left: 1.0in;">
<br /></div>
<div style="margin-left: .5in; mso-list: l0 level1 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";">
</span></span>Project Specific setup</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">a.<span style="font: 7.0pt "Times New Roman";">
</span></span>Create project: yo oraclejet MyFirstApp
--template=navdrawer:hybrid</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">b.<span style="font: 7.0pt "Times New Roman";">
</span></span>cd MyFirstApp</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">c.<span style="font: 7.0pt "Times New Roman";">
</span></span>grunt build</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">d.<span style="font: 7.0pt "Times New Roman";">
</span></span>grunt serve</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">e.<span style="font: 7.0pt "Times New Roman";">
</span></span>Add hybrid features: yo oraclejet:add-hybrid
--platforms=android</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">f.<span style="font: 7.0pt "Times New Roman";">
</span></span>grunt build --platform=android</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">g.<span style="font: 7.0pt "Times New Roman";">
</span></span>Create keystore: keytool -genkey -v -keystore
MyFirstApp.keystore -alias MyFirstApp -keyalg RSA -keysize 2048 -validity 10000</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">h.<span style="font: 7.0pt "Times New Roman";">
</span></span>Create buildConfig file</div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
<span style="mso-list: Ignore;">i.<span style="font: 7.0pt "Times New Roman";">
</span></span>Create release ready apk file: grunt serve:release
--platform=android --buildConfig=D:\practice-jet\buildConfig.json<br />
<br />
From here you can use NetBeans for development: To do so, you can follow<br />
http://sanjeev-technology.blogspot.in/2017/05/oracle-jet-hybrid-android-app-using.html<br />
<br /></div>
<div style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;">
</div>
</div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com14tag:blogger.com,1999:blog-1799093969133798390.post-39421016523916765042017-04-25T21:11:00.001-07:002017-05-01T05:17:16.601-07:00ADF: Popup gets closed automatically<div dir="ltr" style="text-align: left;" trbidi="on">
<b><u>Problem description</u></b>: I found at times people complaint that ADF popup gets closed automatically.<br />
In this blog I am trying to figure out possible cause of popup getting closed.<br />
<br />
<b><u>Possible cause</u></b>: There are following four scenarios when a popup gets closed.<br />
1. User selects default buttons or close icon of dialog<br />
2. User programmatically closes popup using hide function<br />
3. User hit enter/escape key<br />
4. Popup or its parent component gets refreshed.<br />
<br />
In first two points popup getting closed is desired behavior.<br />
<br />
In third case when you use default buttons of popup, it gets closed with enter/escape keys. If you don't want you can use custom buttons as suggested in blog <a class="jive-link-external-small" href="https://blogs.oracle.com/jheadstart/entry/adf_faces_how_to_prevent_closi" rel="nofollow" style="background-color: #e5e5e5; border: 0px; color: #707271; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 14px; margin: 0px; padding: 0px calc(12px + 0.35ex) 0px 0px; text-decoration-line: none; vertical-align: baseline;">https://blogs.oracle.com/jheadstart/entry/adf_faces_how_to_prevent_closi</a><br />
<br />
Point 4 is most problamatic, when user is not doing anything to close popup but it gets closed automatically. This happens when as a ppr we refresh popup or any of its parent component.<br />
Lets take a scenario:<br />
You have an inputText on popup the moment you enter its value and tab out your popup is getting closed. This may be because you are refreshing popup or any of its parent component. When you do so popup gets closed automatically. Your popup or any parent component of it might have partialtrigger property pointing to inputText. Or you may have valuechangeListener on inputText and you programmatically using addPartialTarget trying to refresh a component, which is having popup as child component in hierarchy.<br />
<br />
Most of the time this happens accidentally. You decide to refresh UI component on base page and forget that same UI component is having popup also as child component. As a good practice I can suggest that we should move all our popups in single panelGroupLayout and keep them somewhere close to root components. For example<br />
<br />
PanelGroupLayout -container<br />
PanelGroupLayout - main [Keep your main page content here]<br />
PanelGroupLayout - popus [Keep all your popups together here]<br />
af:popup1<br />
af:popup2<br />
<br />
Keeping popups out of main page ensure that you can freely refresh main page components while working on popups.<br />
One exception to this rule I see is when you have inline popups. For example you have a table and every row is showing some information in popup (may be on hover) and you have added popup inside a column with contentDelivery=immediate to make sure that popup launches quick with making a server trip. In such cases you have to add popup inside and refer #{row.myAttribute} kind of expression's EL in those.<br />
<br />
<br />
Thats all.<br />
</div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com1tag:blogger.com,1999:blog-1799093969133798390.post-55893767803090757422017-04-19T18:27:00.001-07:002017-05-01T05:19:51.251-07:00Change webservice endpoint at runtime<div dir="ltr" style="text-align: left;" trbidi="on">
Problem Description: In ADF we can create a webservice proxy and if we see the main class which extends Service has references of wsdl like<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-E7XbFsufouA/WPgL0gXeo6I/AAAAAAAADBs/9B-kshKkgS8uqP-tD_fjafzG0KL9hwc7ACLcB/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="107" src="https://2.bp.blogspot.com/-E7XbFsufouA/WPgL0gXeo6I/AAAAAAAADBs/9B-kshKkgS8uqP-tD_fjafzG0KL9hwc7ACLcB/s400/1.png" width="400" /></a></div>
Now if we have dev/uat/production environment and for each environment we need to change endpoint, it could be very bad to change url manually and then generate ear. We need a way to dynamically change url at runtime.<br />
<br />
<br />
Solutions<br />
What we can do is keep service class as it is. We can use Client class, which we use to create instance of Servce and while creating instance we can provide url<br />
<br />
Let say my client class is HCMUserDetailService. I change its constructor to accept url from outside.<br />
<br />
public HCMUserDetailService(String wsdlLocation, String username, String password) {<br />
super();<br />
userDetailsService_Service = new UserDetailsService_Service(wsdlLocation, new QName("http://xmlns.oracle.com/apps/hcm/people/roles/userDetailsServiceV2/",<br />
"UserDetailsService"));<br />
SecurityPoliciesFeature securityFeatures = new SecurityPoliciesFeature(new String[] { "oracle/wss_username_token_over_ssl_client_policy" });<br />
userDetailService = userDetailsService_Service.getUserDetailsServiceSoapHttpPort(securityFeatures);<br />
Map<String, Object> reqContext = ((BindingProvider)userDetailService).getRequestContext();<br />
reqContext.put(BindingProvider.USERNAME_PROPERTY, username);<br />
reqContext.put(BindingProvider.PASSWORD_PROPERTY, password);<br />
objectFactory = new ObjectFactory();<br />
<br />
<br />
}<br />
<br />
<br />
<br />
In above code constructor accepts a wsdl url as input and use that to create service instance using UserDetailsService_Service(wsdlLocation,new QName....<br />
<br />
<br />
Now anybody needs to invoke service using this proxy we can pass wsdl location as input.<br />
<br />
User of this client can read wsdl from<br />
1. web.xml context parameter and then use deployment plan to change value of web.xml<br />
2. from database table.<br />
<br />
That way wsdl url is not hardcoded and it will get changed dyanamically.<br />
<br />
Thats all.<br />
<br /></div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com1tag:blogger.com,1999:blog-1799093969133798390.post-488999907293657632017-04-16T22:07:00.001-07:002017-05-01T05:20:18.568-07:00JCS/JCS-SX: Creating application server connection<div dir="ltr" style="text-align: left;" trbidi="on">
<b><u>Problem Description</u></b>: I see most of the time people face issues while creating connection with JCS server using Jdev. Its pretty straight forward but we provide wrong details most of the time.<br />
<br />
<b><u>Solution</u></b><br />
<br />
1. Use Resources pane and select New Connection > Application Server<br />
<br />
2. If this JCS account then you can enable your weblogic ports 7001/7002 to public and make normal weblogic application server connection in Resource tab.<br />
<br />
<br />
3. If its JCS-SX then you may want to use Oracle Cloud type of application-server connection. On first tab provide any name to your connection and select connection-type = Oracle Cloud<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-cc1phwxyVj0/WPRJs6v1uPI/AAAAAAAADA0/7AXpCDNS_KoLDRKtyD6gMAeuhjyrj4XqwCLcB/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="190" src="https://3.bp.blogspot.com/-cc1phwxyVj0/WPRJs6v1uPI/AAAAAAAADA0/7AXpCDNS_KoLDRKtyD6gMAeuhjyrj4XqwCLcB/s400/2.png" width="400" /></a></div>
<br />
<br />
4. Next tab provide username/password. NOTE: These are cloud service user not weblogic user. In normal weblogic connection we provide weblogic user and its password but here it should be cloud user and password. If you don't have cloud user details ask cloud admin (who owns identity domain of cloud).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-q1Ca6u5ldQU/WPRKNffUWoI/AAAAAAAADA4/KxiqGLrZTpU8LpV77q-JwpersiPJ1tP6wCLcB/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="147" src="https://2.bp.blogspot.com/-q1Ca6u5ldQU/WPRKNffUWoI/AAAAAAAADA4/KxiqGLrZTpU8LpV77q-JwpersiPJ1tP6wCLcB/s320/3.png" width="320" /></a></div>
<br />
<br />
5. Next tab is where you need to select cloud service details [Datacenter, Identity-domain, Service Name]. This is the tab where I see mistakes most of the time. We should be knowing how to get these information. For that login to your cloud my services dashboard.<br />
<br />
Datacenter, you always know as that is first thing you select when you want to login to your cloud account. Most of the time for me its us2.<br />
<br />
Find identity domain on dashboard<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-0ZQu6wbTMv0/WPRFWr6-gGI/AAAAAAAADAo/bPafqnCp3x80UUu-3FSVChaQZrkIw1Y3gCLcB/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="176" src="https://4.bp.blogspot.com/-0ZQu6wbTMv0/WPRFWr6-gGI/AAAAAAAADAo/bPafqnCp3x80UUu-3FSVChaQZrkIw1Y3gCLcB/s640/1.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Select your JCS-SX instance and launch Service Detail page. </div>
<div class="separator" style="clear: both; text-align: left;">
Get Service-Name as shown below from Service Detail page</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-e8wToEvDMfA/WPRLfqQjDWI/AAAAAAAADBE/d-h42VH5Bk0EqC-WlyB86PRyjJGuctUjQCEw/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="115" src="https://1.bp.blogspot.com/-e8wToEvDMfA/WPRLfqQjDWI/AAAAAAAADBE/d-h42VH5Bk0EqC-WlyB86PRyjJGuctUjQCEw/s640/4.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
You can also get service name from Java console. Select Java Console from service detail page</div>
<div class="separator" style="clear: both; text-align: left;">
Service Name is mentioned at top of page</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-9vQxGI_j6H8/WPRMYAZ6dYI/AAAAAAAADBI/5Q0zxmyHj7ArrhP9UuzxQVppEb4bATvowCLcB/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="102" src="https://4.bp.blogspot.com/-9vQxGI_j6H8/WPRMYAZ6dYI/AAAAAAAADBI/5Q0zxmyHj7ArrhP9UuzxQVppEb4bATvowCLcB/s400/5.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Now mention these details on your Jdev connection</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-BYETOjQo_sI/WPRNAduBvuI/AAAAAAAADBQ/pV60lBxyfm0qzT15ZcAaiX3VE0WGF7tmwCLcB/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="217" src="https://3.bp.blogspot.com/-BYETOjQo_sI/WPRNAduBvuI/AAAAAAAADBQ/pV60lBxyfm0qzT15ZcAaiX3VE0WGF7tmwCLcB/s400/6.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />
Navigate to Test tab and perform a test<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-LQBz_7nkv5U/WPRNVeHAtfI/AAAAAAAADBU/F8fK87fjfRwz0oBIACYLTG_00T8RbCeuwCLcB/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="176" src="https://1.bp.blogspot.com/-LQBz_7nkv5U/WPRNVeHAtfI/AAAAAAAADBU/F8fK87fjfRwz0oBIACYLTG_00T8RbCeuwCLcB/s400/7.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Thats all.</div>
<br /></div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com2tag:blogger.com,1999:blog-1799093969133798390.post-53625697123799782562017-02-05T22:25:00.003-08:002017-03-04T06:23:22.942-08:00ADF: Execute code before page load<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Problem description: </b>In ADF there are multiple ways to execute a piece of code before page load. In this blog I would like to point out those options and their usecases.<br />
<br />
<b>Solution</b><br />
1. <b>If you have a Bounded task-flow and a pagefragment. You want to run a piece of code before fragment load and you want to do it only once. It means if you take any action on your page you do not want to run that piece of code again.</b><br />
<br />
In such case you can simply add a method activity before your page in task-flow. Such method activities gets executed only once before page load.<br />
<br />
While writing such methods, you will not have any handle for page components and its binding because you have not yet reached to your page.<br />
<br />
Generally we use this approach when we want to do something model side for example I want to execute a VO and before showing its data on page. We can write method in AMImpl, expose it and drop it before fragment on task-flow.<br />
<br />
<br />
2.<b> If you want a piece of code to get executed anytime you take action on your page</b>.<b> You don't want page components but you want bindings to be available. </b><br />
<br />
In such case you can add such methods and operation binding in pageDef file and also add corresponding executable. Set executable's refresh property as per your need. Also placing of this executable binding is important as it gets executed from top to bottom. If you expect some VO to have data then you may want to keep this executale binding after that.<br />
<br />
If its a bean method that you want to execute in this approach, I would suggest you to write a separate class and keep only that method in that java class and expose it as datacontrol. In any way you are not going to get page components. Getter/Setter of bean will return null so no point in mixing bean with this method. Keep bean and this Java method separately. Actually its not a bean method you are invoking but a datacontrol pojo kind of method.<br />
<br />
If you keep your method in different java file but you want to access your bean. You can invoke ADFUtils method to get beanscope first and then get bean instance.<br />
<br />
<br />
3. <b>If you want a piece of code to get executed anytime you take action on your page. You also want page components to be available. </b><br />
<br />
In such case you should add hidden outputtext (visible=false) to your page and bind it with bean. In its getter/setter method you can place your code. Keep outputText at the bottom of your page so that by the time its getter/setter runs all other page components are already bound to bean.<br />
<br />
<br />
<br />
In approach 2 and 3 although your method will get execute everytime you make server request but you can control its behaviour by keeping a variable in pageFlowScope and set its value to Y when method got executed first time and next time ownwards check if pageFlowScope variable value is Y then only execute. Something like below<br />
<br />
public void initMyPage(){<br />
<br />
String value = ADFUtils.getPageflowScope().get("isPageAlreadyInitialised");<br />
<br />
if(!"Y".equals(value)){<br />
<br />
//write your initialization code here. This piece will get executed only once.<br />
<br />
ADFUtils.getPageFlowScope().put("isPageAlreadyInitialised", "Y");<br />
<br />
<br />
}<br />
<br />
}<br />
<br />
4. <b>Using PagePhaseListener</b>: If you are working with jspx page you can have PhaseListeners as well. Here challenge is carefully picking the phase in which you want to execute your code.<br />
<br />
You can use ViewScope variable if you want to make sure code only runs on very first load of page.<br />
<br />
<div style="background-color: #f6f6f6; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 14px; padding: 0px; vertical-align: baseline;">
<strong style="border: 0px; font-family: inherit; font-style: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">@Override</strong></div>
<div style="background-color: #f6f6f6; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 14px; padding: 0px; vertical-align: baseline;">
<strong style="border: 0px; font-family: inherit; font-style: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"> public void afterPhase(PagePhaseEvent pagePhaseEvent) {</strong></div>
<div style="background-color: #f6f6f6; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 14px; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: #f6f6f6; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 14px; padding: 0px; vertical-align: baseline;">
<strong style="border: 0px; font-family: inherit; font-style: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"> if (pagePhaseEvent.getPhaseId() == Lifecycle.INIT_CONTEXT_ID) {</strong></div>
<div style="background-color: #f6f6f6; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 14px; padding: 0px; vertical-align: baseline;">
<strong style="border: 0px; font-family: inherit; font-style: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"> </strong></div>
String value = ADFUtils.getViewScope().get("isPageAlreadyInitialised");<br />
<br />
if(!"Y".equals(value)){<br />
<br />
initMyPage();<br />
<br />
ADFUtils.getViewScope().put("isPageAlreadyInitialised", "Y");<br />
<br />
<br />
<div style="background-color: #f6f6f6; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 14px; padding: 0px; vertical-align: baseline;">
<strong style="border: 0px; font-family: inherit; font-style: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"></strong></div>
}<br />
<div style="background-color: #f6f6f6; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 14px; padding: 0px; vertical-align: baseline;">
<strong style="border: 0px; font-family: inherit; font-style: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"><br /></strong></div>
<div style="background-color: #f6f6f6; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 14px; padding: 0px; vertical-align: baseline;">
<strong style="border: 0px; font-family: inherit; font-style: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"><br /></strong></div>
<div style="background-color: #f6f6f6; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 14px; padding: 0px; vertical-align: baseline;">
<strong style="border: 0px; font-family: inherit; font-style: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"> }</strong></div>
<div style="background-color: #f6f6f6; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 14px; padding: 0px; vertical-align: baseline;">
<strong style="border: 0px; font-family: inherit; font-style: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"> }</strong></div>
<br />
<br />
<br />
As bindings are already in place so you should be able to use bindingContext and bindingContainer to use bindings. Also to get UI component you can get handle of bean and get getter for bean. To get bean handle you can use expressions like<br />
MyBean myBean = ADFUtils.evalueageEL("#{backingBeanScope.myBean}");<br />
<br />
<br />
<br />
Thanks<br />
Sanjeev</div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com0tag:blogger.com,1999:blog-1799093969133798390.post-25904440345784055022017-01-28T00:18:00.001-08:002017-05-01T05:21:13.981-07:00ADF/SOA/Weblogic: Enabling fiddler for all webservice requests made by weblogic server<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Problem Description</b>: In ADF/SOA or simple J2EE application we may have requirement to enable third party webservices and we want to see exact request and response messages. Fiddler comes handy to me. In this blog I want to set fiddler to show all request/response messages sent by weblogic.<br />
<br />
<b>Solution</b><br />
1. Install Fiddler: You can download and install fiddler from https://www.telerik.com/download/fiddler<br />
<br />
2. Modify setDomainEnv.sh and add below line<br />
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dhttp.proxySet=true -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888<br />
<br />
Thats all. Now whenever your weblogic server will make a request to third party server, that request will go via fiddler and you can see exact Request/Response messages is fiddler.<br />
<br />
Its very useful in SOA framework where you need to invoke services very frequently.<br />
<br />
<br /></div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com1tag:blogger.com,1999:blog-1799093969133798390.post-82180697156873033792017-01-03T19:40:00.000-08:002017-05-01T05:22:35.203-07:00Oracle Cloud: Using Cloud Berry to connect with Cloud Storage<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Problem Description</b>: In this blog I just want to show how can we use cloud berry to connect with Oracle Cloud Storage. <br />
<br />
<b>Solution</b><br />
1. Get Oracle Cloud storage: To use Oracle Cloud storage you must have cloud storage account. You can get it from <a href="https://cloud.oracle.com/en_US/storage">https://cloud.oracle.com/en_US/storage</a><br />
<br />
<br />
2. Get details from Cloud environment: Once you have Oracle Cloud login you will have username/password and identity domain. Using this you can see you dashboard. From Dashboard you can launch cloud storage home page.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-r-Lx7rx7-ts/WFkIASTFLvI/AAAAAAAAC6k/oIv2QhOUSD4I0TmQmymkIbaEToYCW1CtwCLcB/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="248" src="https://2.bp.blogspot.com/-r-Lx7rx7-ts/WFkIASTFLvI/AAAAAAAAC6k/oIv2QhOUSD4I0TmQmymkIbaEToYCW1CtwCLcB/s640/1.png" width="640" /></a></div>
<br />
<br />
2. Install Cloud Berry: You can download and install Cloud Berry from <a href="http://www.cloudberrylab.com/explorer/openstack.aspx">http://www.cloudberrylab.com/explorer/openstack.aspx</a><br />
<br />
3.Run Cloud Berry and Navigate to File > New Oracle Cloud Account<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-x9qhS1nLcnw/WFlg_eaQ-kI/AAAAAAAAC60/8cB7YiJmkGIpQF0cjzyUVYbC750V-TM3ACLcB/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="377" src="https://1.bp.blogspot.com/-x9qhS1nLcnw/WFlg_eaQ-kI/AAAAAAAAC60/8cB7YiJmkGIpQF0cjzyUVYbC750V-TM3ACLcB/s400/2.png" width="400" /> </a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Before filling details in above shown form keep your REST endpoint handy. Its shown in Step-2</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<ul style="text-align: left;">
<li><b>Display Name</b>: It could be anything, which helps you to recognize cloud environment.</li>
<li><b>User Name</b>: This is important. Most of the time mistake we make is we directly provide username. It actually has two parts. First part is last part of REST endpoint url [Storage-<IdentityDomain>]. Second part is your oracle cloud username. Now join both of them using colon (:)</li>
<li><b>Password</b>: Your oracle cloud password.</li>
<li><b>Authentication Service</b>: This is another important part. You can provide two values here. </li>
<ul>
<li>Take REST endpoint url and remove /v1/Storage-<IdentityDomain> and replace it with /auth/V1.0 as shown in above diagram.</li>
<li>Another way is if you have us2 datacenter you can use https://us2.storage.oraclecloud.com/auth/v1.0</li>
</ul>
</ul>
<br />
<div class="separator" style="clear: both; text-align: left;">
4. Thats all, Now you can start managing cloud using Cloud Berry</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-13j3_vbrxUk/WFljvVFycXI/AAAAAAAAC7A/KgQwxdhbK04Hk1haCleoV9Zu84Pv_yr6wCLcB/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="132" src="https://3.bp.blogspot.com/-13j3_vbrxUk/WFljvVFycXI/AAAAAAAAC7A/KgQwxdhbK04Hk1haCleoV9Zu84Pv_yr6wCLcB/s640/3.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
</div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com13tag:blogger.com,1999:blog-1799093969133798390.post-61734597598655590102016-11-11T12:25:00.003-08:002017-05-01T05:22:52.487-07:00Oracle JET: RequireJS How it works<div dir="ltr" style="text-align: left;" trbidi="on">
In this blog I would like to show how requireJS. As I am exploring Oracle JET technology so I will keep my blog in context of Oracle JET<br />
<br />
What is requireJS and its purpose: This library solves three problems<br />
1. Download and execute a javascript library only when needed.<br />
2. Reduce global variables<br />
3. Provide modular structure to your javascript libraries.<br />
<br />
To understand RequireJS, its better to see what generally happens when we don't have any such library. In that case we add all required javascript libraries in our html file using <script> tag. Browser will download all of them and execute them even though I don't need some of them while loading page initially. I may need to them later when user performs some action on page.<br />
Also These libraries may by creating some global variables as well.<br />
Also we need to be double sure about sequence of libraries in html. For example I can't use jquery selectors (like $("#lastname")) in my code unless I have jquery library mentioned. I definitely need to put jquery library script tag in html before using its feature in any subsequent library.<br />
<br />
To overcome above limitations I need something which can<br />
1. download and execute library only when needed.<br />
2. reduce global variables<br />
3. manage dependencies<br />
<br />
That something is what requireJS is<br />
<br />
Let see how it works. I have Oracle JET quickstart basic template project running. If you don't know Oracle JET, its a javascript based framework with rich set of UI components. Its open source and uses various third party libraries like knockout, jquery, promise, and requireJS etc.<br />
<br />
I see in my index.html there is only one script tag<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"><script data-main="js/main" src="js/libs/require/require.js"></script></span><br />
<br />
The moment browser see this line in html, it download require.js and loads (execute) it.<br />
require.js library validates data-main property of script tag and found that its js/main, which means its will look for a library main.js in js folder. It downloads it and run it. So atleast two libraries are going to get downloaded at page load. Lets use browser developer tools and verify it. I have put a debug point at first line of my main.js file. This line is requirejs.config call.<br />
<br />
I found that<br />
a. First require.js is downloaded, which is because we have <script> tag for that. It gets loaded immediately<br />
b. After few milliseconds main.js is also getting download. Its not there in html script tag but its getting downloaded because require.js loads it asynchronously.<br />
c. I also see two global variable require and requirejs added by require.js library. (NOTE we no other library has got executed till now)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-6ftjtipGsdo/WCYhsAH30oI/AAAAAAAAC4g/UZ8-z9PGatoEbypTOQ7pWx_Ool06FHY9wCLcB/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="218" src="https://4.bp.blogspot.com/-6ftjtipGsdo/WCYhsAH30oI/AAAAAAAAC4g/UZ8-z9PGatoEbypTOQ7pWx_Ool06FHY9wCLcB/s640/1.png" width="640" /></a></div>
<br />
main.js: First thing it does is calls requirejs.config function. This function is used to configure your all js library locations with require. All these library locations are given a name. For example knockout library is at libs/knockout/knockout-3.4.0 location. Its registered with name 'knockout'.<br />
NOTE: we are not registering each and every js file. For example we have lots of oj libraries inside libs/oj/v2.1.0/debug but we are not mentioning them individually. We just mention parent directory here and associate it with ojs name. Which means if we want to refer any individual js from that directly we can simple say ojs/<that-library><br />
<br />
<br />
<br />
Next big call is require function call. It takes two inputs<br />
a. Array of String<br />
b. callback function<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"> require(['ojs/ojcore', 'knockout', 'appController', 'ojs/ojknockout', 'ojs/ojrouter',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'ojs/ojmodule', 'ojs/ojdialog', 'ojs/ojnavigationlist', 'ojs/ojtoolbar',</span><br />
<span style="font-family: Courier New, Courier, monospace;"> 'ojs/ojbutton', 'ojs/ojmenu'],</span><br />
<span style="font-family: Courier New, Courier, monospace;"> function (oj, ko, app) { // this callback gets executed when all required modules are loaded</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"> //Some code eliminated from here.</span><br />
<span style="font-family: Courier New, Courier, monospace;"> </span><br />
<span style="font-family: Courier New, Courier, monospace;"> }</span><br />
<span style="font-family: Courier New, Courier, monospace;"> );</span><br />
<br />
each entry in array of string can actually points to a js file if we join it with configuration done previously. For example ojs/ojcore, points to libs/oj/v2.1.0/debug/ojcore.js file. Each entry in this list is nothing but a dependency for the function. Each entry in terms of require is called a module.<br />
<br />
job of require function is to call callback function once all the dependencies are loaded. So require function is going to load each js file mentioned as dependency here and once all are loaded its going to run callback function. By above require call I can say its going to load<br />
<span style="font-family: Courier New, Courier, monospace;">libs/oj/v2.1.0/debug/ojcore.js, </span><br />
<span style="font-family: Courier New, Courier, monospace;">libs/knockout/knockout-3.4.0.js, </span><br />
<span style="font-family: Courier New, Courier, monospace;">appController.js, </span><br />
<span style="font-family: Courier New, Courier, monospace;">libs/oj/v2.1.0/debug/ojknockout.js, </span><br />
<span style="font-family: Courier New, Courier, monospace;">libs/oj/v2.1.0/debug/ojknockout.js, </span><br />
<span style="font-family: Courier New, Courier, monospace;">libs/oj/v2.1.0/debug/ojrouter.js, </span><br />
<span style="font-family: Courier New, Courier, monospace;">libs/oj/v2.1.0/debug/ojmodule.js, </span><br />
<span style="font-family: Courier New, Courier, monospace;">libs/oj/v2.1.0/debug/ojdialog.js</span><br />
<span style="font-family: Courier New, Courier, monospace;">libs/oj/v2.1.0/debug/ojnavigationlist.js</span><br />
<span style="font-family: Courier New, Courier, monospace;">libs/oj/v2.1.0/debug/ojs/ojtoolbar.js</span><br />
<span style="font-family: Courier New, Courier, monospace;">libs/oj/v2.1.0/debug/ojbutton.js</span><br />
<span style="font-family: Courier New, Courier, monospace;">libs/oj/v2.1.0/debug/ojmenu.js</span><br />
<br />
<br />
NOTE: appContorller.js is not mentioned in config call as its present in same directory as main.js. So if all your libraries are present where you have main.js then you need not to mention anything in configure. But it would be a bad design<br />
<br />
<br />
Lets put a debug point at very first line of our callback function<br />
But as I know require is going to load dependencies first lets add few more debug points<br />
First line of ojcore.js,<br />
First line of ojmenu.js<br />
First line of ojdialog.js etc<br />
<br />
What I observe is it definitely downloads all js before calling callback function.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-PeooP6YwW2w/WCYgQ9eN6yI/AAAAAAAAC4c/XQAa2sVWGPYRMpNisPKHIM4yqNhmab7rgCLcB/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="270" src="https://2.bp.blogspot.com/-PeooP6YwW2w/WCYgQ9eN6yI/AAAAAAAAC4c/XQAa2sVWGPYRMpNisPKHIM4yqNhmab7rgCLcB/s640/2.png" width="640" /></a></div>
<br />
Now I am stopped at first line of ojcore.js<br />
First line of ojcore.js is<br />
define(['require', 'ojL10n!ojtranslations/nls/ojtranslations', 'promise'], function(require, ojt) {<br />
//Some code here<br />
})<br />
<br />
Its a call to define function.<br />
Here define function is taking two arguments<br />
1. Array of String<br />
2. Callback function<br />
<br />
Array of String is again nothing but dependcies and define function is also going to download all dependencies and then call callback function. It means ojcore is also dependent on some other js file or better to say module.<br />
One question arise why not to use require when define is also doing something similar.<br />
<br />
Require vs Define: As name suggest require is to download required libraries and then call callback function but Define is something to define. Define is actually defining a module. If you see the callback function of define must return a value. It could be anything but it must return a value. That value is associated with module and module name is nothing but what is mentioned in require call.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-lEWoH1vsObQ/WCYkWjAUnZI/AAAAAAAAC4s/bEafJw91otsgYFWbu5y-FR8T-bp-A8EGgCLcB/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="290" src="https://3.bp.blogspot.com/-lEWoH1vsObQ/WCYkWjAUnZI/AAAAAAAAC4s/bEafJw91otsgYFWbu5y-FR8T-bp-A8EGgCLcB/s640/3.png" width="640" /></a></div>
Effectively define is not only downloading dependencies and calling callback but also defining a module using moduleName and value.<br />
<br />
What is the purpose of this module? This is what is passed to callback function as an input. If you see require function is taking oj, ko and app as three input. They are nothing but module value of ojs/ojcore, knockout and appcontroller first three dependencies mentioned in require call.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-truzfQ2ANwQ/WCYloQW1otI/AAAAAAAAC4w/GIJGT3wdKyc6QWJuJYNuLXboVWuY7u4KwCLcB/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="290" src="https://4.bp.blogspot.com/-truzfQ2ANwQ/WCYloQW1otI/AAAAAAAAC4w/GIJGT3wdKyc6QWJuJYNuLXboVWuY7u4KwCLcB/s640/4.png" width="640" /></a></div>
<br />
<br />
Now if I stop my bebugger at first line of require callback I see lots of other files are also downloaded<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-W4uVHr8NA5M/WCYm1lVvtcI/AAAAAAAAC40/EIJ7l1E5FgMI7qTedpN4SBrcx9-7ztoXQCLcB/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://2.bp.blogspot.com/-W4uVHr8NA5M/WCYm1lVvtcI/AAAAAAAAC40/EIJ7l1E5FgMI7qTedpN4SBrcx9-7ztoXQCLcB/s640/5.png" width="640" /></a></div>
<br />
<br />
Can I assume that by the time require's callback is running all modules of JET are loaded. Definitely NOT. If we have to load all modules then why not to load using script tag itself. Only few required modules are loaded. Rest you will be loading when you create a viewModule.<br />
<br />
When we create a viewModule, its js file again start of define call. Using that viewModule will load its dependencies separately. That is the advantage a module is loaded when its needed.<br />
<br />
Few things you should notice<br />
1. RequireJS tries to divide our code in modules. With that we should also change of coding style. We should write one module (function) in one js file. These functions should clearly know their dependencies.<br />
<br />
2. require has so many dependencies but callback only takes three oj, ko, app as input. Why we have other dependencies. If you see first is ojs/ojcore. It creates oj global variable (namespace). All other dependencies adds its methods to oj namespace. For example ojs/ojrouter at Router related functions to oj namespace.<br />
<br />
That's all I have here.<br />
<br /></div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com2tag:blogger.com,1999:blog-1799093969133798390.post-80941684749866622752016-11-11T10:07:00.000-08:002016-11-11T12:35:16.979-08:00ADF: Token replacement for resource bundle af:formatNamed<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Problem Description</b>: There is a common usecase to have a translatable string in resource bundle with tokens. In this blog I want to show how to use such strings using af:formatNamed apis<br />
<br />
Let say we have a string in bundle as<br />
<br />
WELCOME_MESSAGE=Hello {USER_NAME}. Welcome to Benefits Application.<br />
<br />
We want to replace username token at run-time.<br />
<br />
<b>Solution:</b> You can simply use af:formatNamed apis to do so<br />
<br />
<af:outputText value="#{af:formatNamed(viewcontrollerBundle.WELCOME_MESSAGE,'USER_NAME','Sanjeev')}" id="ot1"/><br />
<br />
In above you make 'Sanjeev' to an expression like securityContext.userName to show actual username.<br />
<af:outputText value="#{af:formatNamed(viewcontrollerBundle.WELCOME_MESSAGE,'USER_NAME',securityContext.userName)}" id="ot1"/><br />
<br />
<br />
<br />
If you have two tokens you can use af:formatNamed2, It can replace two tokens<br />
WELCOME_MESSAGE=Hello {USER_NAME}. Welcome to {APPLICATION_NAME}.<br />
<br />
<af:outputText value="#{af:formatNamed2(viewcontrollerBundle.WELCOME_MESSAGE,'USER_NAME','Sanjeev', APPLICATION_NAME, 'Benefits Application')}" id="ot1"/><br />
<br />
Similarly for 3 tokens, use af:formatNamed3 and 4 tokens use af:formatNamed4 apis<br />
<br />
Token name in bundle must be surrounded by curly braces as {USER_NAME}<br />
<br />
<br />
What if I don't use token but simply break strings in multiple parts. For example instead of<br />
WELCOME_MESSAGE=Hello {USER_NAME}. Welcome to Benefits Application.<br />
I create a bundle as<br />
WELCOME_MESSAGE_PART1=Hello<br />
WELCOME_MESSAGE_PART2=Welcome to Benefits Application.<br />
<br />
Now in expression I write it like<br />
<af:outputText value="#{viewcontrollerBundle.WELCOME_MESSAGE_PART1} Sanjeev. #{viewcontrollerBundle.WELCOME_MESSAGE_PART2}"<br />
id="ot2"/><br />
<br />
If you run application you may not find any difference but I suggest NOT to do that. This approach has some hidden problems<br />
<br />
a. Your translator will not be able to understand whole message. Breaking message in parts can be very difficult to translate and may end up having a completely different meaning.<br />
b. Also I have my doubts that it may not work properly with RTL language. Need to verify this point.<br />
<br />
<br />
<br />
<br />
<br />
<br /></div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com3tag:blogger.com,1999:blog-1799093969133798390.post-91119848347149688702016-10-20T12:10:00.001-07:002016-10-20T12:11:53.642-07:00ADF: Know if VO attribute is currently changed<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Problem description:</b> We have isAttributeChanged(String) method available in VORowImpl, which can tell if a particular attribute in vo row has changed or not. Problem with this method is if we change attribute once and then restore its value back, method still returns that attribute has changed. I would not say this is bug as this might be requirement at times to know if attribute is ever changed. but at times we are interested in knowing if attribute's current value is different from the database value.<br />
In this blog I want to come up with another method isAttributeCurrentlyChanged(String), which can compare database value with current value and let us know if attribute is actually changed at this time. If value is restored, we should get false as there is no effective change.<br />
<br />
<b>Solution: </b>Idea is to use getPostedAttribute method of entity to get database value and compare it with attribute's current value to know if its actually changed. We also want to add this method to be available on each vo row so we would be writing our own base classes and introduce method in those.<br />
<br />
<b>1. Create an Entity Impl (say SanEntityImpl) base class and introduce a method getDataBaseValue as</b><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">import oracle.jbo.server.EntityImpl;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">public class SanEntityImpl extends EntityImpl {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"> public Object getDataBaseValue(String attributeName){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return getPostedAttribute(this.getAttributeIndexOf(attributeName));</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<br />
<b>2. Create a View Row Impl (say SanViewRowImpl) base class as </b><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">import oracle.jbo.server.AttributeDefImpl;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">import oracle.jbo.server.ViewAttributeDefImpl;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">import oracle.jbo.server.ViewRowImpl;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">public class SanViewRowImpl extends ViewRowImpl {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> public boolean isEOBasedAttribute(String voAttributeName){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> ViewAttributeDefImpl voAttrDef = (ViewAttributeDefImpl)this.getViewDef().findAttributeDef(voAttributeName);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> byte attributeKind = voAttrDef.getAttributeKind();</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> if(AttributeDefImpl.ATTR_PERSISTENT == attributeKind){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return true;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> else{</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return false;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> public boolean isTransientAttribute(String voAttributeName){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> ViewAttributeDefImpl voAttrDef = (ViewAttributeDefImpl)this.getViewDef().findAttributeDef(voAttributeName);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> byte attributeKind = voAttrDef.getAttributeKind();</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> if(AttributeDefImpl.ATTR_TRANSIENT == attributeKind){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return true;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> else{</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return false;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> public Object getDatabaseValue(String voAttributeName){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> if(this.isEOBasedAttribute(voAttributeName)){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> ViewAttributeDefImpl voAttrDef = (ViewAttributeDefImpl)this.getViewDef().findAttributeDef(voAttributeName);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> AttributeDefImpl eoAttrDef = voAttrDef.getEntityAttributeDef();//voAttrDef.getReferenceAttribute()</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> String entityAttributeName = eoAttrDef.getName();</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return ((SanEntityImpl)this.getEntity(this.getViewDef().getEntityIndex(voAttrDef.getEntityReference()))).getDataBaseValue(entityAttributeName);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> else if(this.isTransientAttribute(voAttributeName)){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return null;//Better if we can return initial value of attribute</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> else{</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return this.getAttribute(voAttributeName); </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> public boolean isAttributeCurrentlyChanged(String voAttributeName){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> Object dbValue = this.getDatabaseValue(voAttributeName);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> Object ctValue = this.getAttribute(voAttributeName);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> if(dbValue == null && ctValue == null){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return false;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> else if(dbValue == null && ctValue != null){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return true;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> else if(dbValue != null && ctValue == null){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return true;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> else if(dbValue.equals(ctValue)){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return false;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> else{</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return true;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<br />
<b><br /></b>
<b>3. Configure these classes as base classes in project properties</b><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-wor3ltbhXrA/WAkVX2GIKAI/AAAAAAAAC3k/URegRmKkYqE144tLP9_UwBibbV-Fouk5wCLcB/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="468" src="https://4.bp.blogspot.com/-wor3ltbhXrA/WAkVX2GIKAI/AAAAAAAAC3k/URegRmKkYqE144tLP9_UwBibbV-Fouk5wCLcB/s640/1.png" width="640" /></a></div>
<br />
<br />
<b>4. Test behavior of isAttributeChanged and isAttributeCurrentlyChanged</b><br />
<br />
Create EmployeeEO, EmployeeVO based on HR schema and add it in AM. Generate AMImpl and have below method in AM to verify<br />
<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"> public static void main(String[] args){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> String amDef = "com.san.adf.model.am.HRAppModule"; //Replace it with your AM</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> String config = "HRAppModuleLocal"; //Replace it with your AM configuration</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> HRAppModuleImpl am = (HRAppModuleImpl) Configuration.createRootApplicationModule(amDef, config);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> ViewObjectImpl empVO = am.getEmployeeVO();</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> empVO.executeQuery(); </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> SanViewRowImpl empRow = (SanViewRowImpl)empVO.first();</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> String attrValue = null;</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> String attributeName = "FirstName";</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> if(empRow != null){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> attrValue = (String)empRow.getAttribute(attributeName);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> //When there is no change</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> System.out.println("Without any change");</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> System.out.println("isAttributeChanged: " + empRow.isAttributeChanged(attributeName));</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> System.out.println("isAttributeCurrentlyChanged: " + empRow.isAttributeCurrentlyChanged(attributeName));</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> //Change value of attribute and verify</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> System.out.println("Changing attribute value to Sanjeev");</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> empRow.setAttribute(attributeName, "Sanjeev"); </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> System.out.println("isAttributeChanged: " + empRow.isAttributeChanged(attributeName));</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> System.out.println("isAttributeCurrentlyChanged: " + empRow.isAttributeCurrentlyChanged(attributeName));</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> //Restore value of attribute and verify</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> System.out.println("Restoring attribute value");</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> empRow.setAttribute(attributeName, attrValue); </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> System.out.println("isAttributeChanged: " + empRow.isAttributeChanged(attributeName));</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> System.out.println("isAttributeCurrentlyChanged: " + empRow.isAttributeCurrentlyChanged(attributeName));</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> Configuration.releaseRootApplicationModule(am, true);</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> }</span><br />
<br />
<br />
If you run the AMImpl, output is something like this.<br />
<br />
Without any change<br />
isAttributeChanged: false<br />
isAttributeCurrentlyChanged: false<br />
<br />
Changing attribute value to Sanjeev<br />
isAttributeChanged: true<br />
isAttributeCurrentlyChanged: true<br />
<br />
Restoring attribute value<br />
isAttributeChanged: true<br />
<span style="background-color: lime;">isAttributeCurrentlyChanged: false</span><br />
<div>
<br /></div>
<div>
We can see that after restoring value isAttributeCurrentlyChanged returns false, which means no change. </div>
<div>
<br /></div>
<div>
Other utility method added in base class VORowImpl are </div>
<div>
isEOBasedAttribute: This method returns true if attribute is database driven.</div>
<div>
isTransientAttribute: This method returns true if attribute is transient</div>
<div>
getDatabaseValue: This attribute returns value of attribute from database.</div>
<div>
<br /></div>
<div>
Thats all.</div>
</div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com3tag:blogger.com,1999:blog-1799093969133798390.post-17197575401095226732016-07-29T03:17:00.002-07:002017-03-14T11:00:23.160-07:00Weblogic integrated server Demo Identity Keystore and Demo Trust Keystore<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Weblogic has two kinds of keystore, one is IdentityKeyStore and other is TrustStore.<br />
<br />
<b><u>IdentityKeyStore</u></b>: T<span style="background-color: white; font-family: "verdana" , "arial" , "helvetica" , sans-serif; font-size: 12.8px;">his keystore contains the identity for WebLogic Server. It means if any client wants to make an SSL request to server, server will send him this certificate. By default, file is located in <</span><span style="background-color: white; font-family: "courier new" , "courier" , monospace; font-size: 12.8px;">WL_HOME>\server\lib\</span><span style="background-color: white; font-family: "courier new" , "courier" , monospace; font-size: 12.8px;">DemoIdentity.jks. Its password is </span><span style="font-family: "courier new" , "courier" , monospace;"><span style="font-size: 12.8px;">DemoIdentityKeyStorePassPhrase. Private key password is DemoIdentityPassPhrase. </span></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-size: 12.8px;"><br /></span></span>
If you want clients to call an application on weblogic server over SSL then you need to set IdentityKeyStore and you need to add a certificate in it. You have two options to get certificate.<br />
1. Contact verisign or other certificate authority to provide you a certificate.<br />
2. You can yourself generate a certificate using keytool<br />
<code class="cCode" style="background-color: white; font-family: "Courier New", Courier, monospace; font-size: 13.3333px;">keytool -genkey -keystore </code><code class="cCodeEmphasis" style="background-color: white; font-family: "Courier New", Courier, monospace; font-size: 13.3333px; font-style: italic;">keystorename</code><code class="cCode" style="background-color: white; font-family: "Courier New", Courier, monospace; font-size: 13.3333px;"> -storepass </code><code class="cCodeEmphasis" style="background-color: white; font-family: "Courier New", Courier, monospace; font-size: 13.3333px; font-style: italic;">keystorepassword</code><br />
<code class="cCodeEmphasis" style="background-color: white; font-family: "Courier New", Courier, monospace; font-size: 13.3333px; font-style: italic;"><br /></code>
<span style="background-color: white; font-size: 13.3333px;"><span style="font-family: "arial" , "helvetica" , sans-serif;">You will use CA provided certificate if you want browser not to throw any warning of certificate when user tries to access your site. With self-signed certificate, browser throws exception and user needs to accept that OR alternatively they need to add that certificate to browser. </span></span><br />
<span style="background-color: white; font-family: "courier new" , "courier" , monospace; font-size: 12.8px;"><br /></span>
<span style="background-color: white; font-family: "verdana" , "arial" , "helvetica" , sans-serif; font-size: 12.8px;"><br /></span>
<span style="background-color: white; font-family: "verdana" , "arial" , "helvetica" , sans-serif; font-size: 12.8px;"><b><u>TrustStore</u></b>: </span><span style="background-color: white; font-family: "verdana" , "arial" , "helvetica" , sans-serif; font-size: 12.8px;">This keystore establishes trust for WebLogic Server. It means if this weblogic server needs to make a call to some secured server over SSL then its going to use this certificate. If you are making a call to thirdpart webservice using a java code, which is deployed on weblogic then weblogic will use this keystore to verify identity of thirdpart-server. This keystore is located at </span><br />
<span style="background-color: white; font-family: "courier new" , "courier" , monospace; font-size: 12.8px;"><WL_HOME>\server\lib\DemoTrust.jks. Its password is DemoTrustKeyStorePassPhrase. </span><br />
<span style="background-color: white; font-family: "courier new" , "courier" , monospace; font-size: 12.8px;"><br /></span>
In truststore you generally need to add those certificates which are provided by third-party services, which weblogic is going to call. To get those cerficate is simple.<br />
1. Access their service in IE, it will be an https call and you will see a lock icon.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-pdNDFodrgKo/V5splBS3mjI/AAAAAAAACyw/0blzDhl7q3cDxgxdNfZBl7935B1eqFYpQCLcB/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="342" src="https://1.bp.blogspot.com/-pdNDFodrgKo/V5splBS3mjI/AAAAAAAACyw/0blzDhl7q3cDxgxdNfZBl7935B1eqFYpQCLcB/s400/1.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Install certificate as shown above.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
2<span style="font-family: "arial" , "helvetica" , sans-serif;">. <span style="background-color: #fefdfa; color: #333333; font-size: 13px; line-height: 18.2px;">Export certificate from browser Tools >> Internet Options >> Content >> Certificate >> Other People >> Select Certificate >> Export</span></span></div>
Import certificate in DemoTrust.jks by following these steps<br />
a. Navigate to <span style="background-color: white; font-family: "verdana" , "arial" , "helvetica" , sans-serif; font-size: 12.8px;"><</span><span style="background-color: white; font-family: "courier new" , "courier" , monospace; font-size: 12.8px;">WL_HOME>\server\lib and </span>Take backup of DemoTrust.jks<br />
b. Import certificate<br />
keytool -importcert -file <location-of-your-cer-file> –keystore <location-of-trust-keystore> -alias <youraliasname> -storepass DemoTrustKeyStorePassPhrase<br />
For example<br />
keytool -importcert -file D:\temp\OracleOutSourcing_DER.cer –keystore D:\Oracle\Product\11.1.1.7.1-Cloud\Middleware64\wlserver_10.3\server\lib\DemoTrust.jks -alias oracleoutsourcing -storepass DemoTrustKeyStorePassPhrase<br />
<br />
Once certificate is imported then you should be able to call thirdparty webservices over SSL.<br />
<br />
NOTE: Jdeveloper also using same DemoTrust.jks for standalone program. If you run a java program in jdeveloper,<br />
<your-jdk>\bin\javaw.exe -client -classpath <your-jars> -Djavax.net.ssl.trustStore=<WL_HOME>\server\lib\DemoTrust.jks <Your-java-class><br />
<br />
You can configure it in jdev using Tools > Preferences > Credentials<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-V2VwaYHcUWg/V5ssA7lP_wI/AAAAAAAACy8/LwHyMKCd5ZUxkqNhl778PRrt1uckXoqewCLcB/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="237" src="https://3.bp.blogspot.com/-V2VwaYHcUWg/V5ssA7lP_wI/AAAAAAAACy8/LwHyMKCd5ZUxkqNhl778PRrt1uckXoqewCLcB/s400/2.png" width="400" /></a></div>
<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="background-color: white; font-size: 13.3333px;"><i>You can also change keystore/truststore in weblogic console and point to completely new keystore files. </i></span></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="background-color: white; font-size: 13.3333px;"><i><br /></i></span></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-bpMrbOpg6uw/V5stCUv6aiI/AAAAAAAACzI/pOeOv6yMSI4KmIF4DVtroVRzYCLzn5qtQCLcB/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="243" src="https://2.bp.blogspot.com/-bpMrbOpg6uw/V5stCUv6aiI/AAAAAAAACzI/pOeOv6yMSI4KmIF4DVtroVRzYCLzn5qtQCLcB/s320/3.png" width="320" /></a></div>
<span style="font-family: "courier new" , "courier" , monospace;"><span style="background-color: white; font-size: 13.3333px;"><i><br /></i></span></span>
<span style="font-family: "courier new" , "courier" , monospace;"><span style="background-color: white; font-size: 13.3333px;"><i><br /></i></span></span>
NOTE: keystore/trustore is server specific. It means all applications of one server are forced to use same keystore/truststore. If you want different keystore/truststore, you may need to create a new managed server.<br />
<br />
NOTE: If you get bad-certificate issue after importing certificate in trusstore, then verify if certificate has entries like *.<domain>.com kind of entries. If yes, then you need to remove host verification in weblogic as wildcard host certificates are not allowed if host verification is enabled.<br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="background-color: white; font-size: 13.3333px;"><i><br /></i></span></span></div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com4tag:blogger.com,1999:blog-1799093969133798390.post-52165448808750118352016-06-04T12:54:00.002-07:002016-06-05T08:38:51.024-07:00ADF: Colorful Panel Accordion (ShowDetail Item headers)<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Problem Description</b>: In ADF we can mostly change styles of all components. Recently in one of forum post it was asked to do styling of ADF panel accordion to have different colors of header. Like below<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-Wuem-yv5330/V01JQNvQbiI/AAAAAAAACws/JHwgRciALu48c_8baiKY0oCBn9piur2zQCLcB/s1600/colorful%2Bpanel%2Baccordion.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="139" src="https://4.bp.blogspot.com/-Wuem-yv5330/V01JQNvQbiI/AAAAAAAACws/JHwgRciALu48c_8baiKY0oCBn9piur2zQCLcB/s320/colorful%2Bpanel%2Baccordion.png" width="320" /></a></div>
<br />
<br />
Problem here is if I style panel-accordion provides a way to style its header. But that style will be applied to all headers. So I can have yellow headers but all will become yellow. How can we have different headers with different colors.<br />
<br />
Solution: Lets go from simple to complex<br />
<br />
What if we just need to make all headers yellow<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"><af:panelAccordion id="pa1" ></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <af:showDetailItem text="showDetailItem 1" id="sdi1"</span><span style="font-family: "courier new" , "courier" , monospace;">/></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <af:showDetailItem text="showDetailItem 2" id="sdi2"/></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <af:showDetailItem text="showDetailItem 3" id="sdi3"/></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <af:showDetailItem text="showDetailItem 4" id="sdi4"/></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </af:panelAccordion></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">af|panelAccordion::header{</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> background: yellow none no-repeat fixed center !important; </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">af|panelAccordion::header-subsequent{</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> background: yellow none no-repeat fixed center !important; </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">af|panelAccordion::header-disclose {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> background: yellow none no-repeat fixed center !important; </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<br />
<br />
Above settings will impact all panel accordions. What if we want it for only specific panel accordion<br />
We can add a class with panelAccordion and refer that in css<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"><af:panelAccordion id="pa1" styleClass="colorfulAccordian"></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <af:showDetailItem text="showDetailItem 1" id="sdi1"/></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <af:showDetailItem text="showDetailItem 2" id="sdi2"/></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <af:showDetailItem text="showDetailItem 3" id="sdi3"/></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> <af:showDetailItem text="showDetailItem 4" id="sdi4"/></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </af:panelAccordion></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">.colorfulAccordian af|panelAccordion::header{</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> background: </span><span style="font-family: "courier new" , "courier" , monospace;">yellow </span><span style="font-family: "courier new" , "courier" , monospace;">none no-repeat fixed center !important; </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">.colorfulAccordian af|panelAccordion::header-subsequent{</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> background: </span><span style="font-family: "courier new" , "courier" , monospace;">yellow </span><span style="font-family: "courier new" , "courier" , monospace;">none no-repeat fixed center !important; </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<div>
<br /></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "courier new" , "courier" , monospace;">.colorfulAccordian </span>af|panelAccordion::header-disclose {</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> background: yellow none no-repeat fixed center !important; </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: inherit;">Till here everything is great and Oracle provides selectors to style accordion headers. Now what if we want to style each accordion header differently.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">There is no direct way to apply different different styles for each panel accordion headers. They are governed by one style only af|panelAccordion::header (or header-susequent/header-disclose). Any change in this style will affect all headers equally.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">To style individual headers we need to use css styling in combination of adf selectors. We need to use nth child selector of css to select one particular header (h1) tag.</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
.colorfulAccordian af|panelAccordion::header{</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
background: #000000 none no-repeat fixed center !important;</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
}</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; min-height: 8pt; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; min-height: 8pt; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
.colorfulAccordian af|panelAccordion::header-subsequent{</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
background: #000000 none no-repeat fixed center !important;</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
}</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; min-height: 8pt; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
.colorfulAccordian.af|panelAccordion h1:nth-child(2) {</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
background-color: yellow !important;</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
}</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; min-height: 8pt; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
.colorfulAccordian.af|panelAccordion h1:nth-child(4), af|panelAccordion h1:nth-child(5){</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
background-color: red !important;</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
}</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
.colorfulAccordian.af|panelAccordion h1:nth-child(6), af|panelAccordion h1:nth-child(7){</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
background-color: green !important;</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
}</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; min-height: 8pt; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
.colorfulAccordian.af|panelAccordion h1:nth-child(8), af|panelAccordion h1:nth-child(9){</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
background-color: blue !important;</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
<br /></div>
<span style="font-family: inherit;"></span><br />
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
}</div>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">Above styles will give you required output. </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">Similarly if you want to style only one tab heading of a panelTab</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<br />
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
<af:panelTabbed id="pt1" styleClass="colorfulTab"></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
<af:showDetailItem text="showDetailItem 5" id="sdi5"/></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
<af:showDetailItem text="showDetailItem 6" id="sdi6"/></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
</af:panelTabbed></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; min-height: 8pt; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
and you want to style only first tab</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; min-height: 8pt; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; min-height: 8pt; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
.colorfulTab.af|panelTabbed af|panelTabbed::viewable-tabs > div:nth-child(1) af|panelTabbed::tab-text-link {</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
color: yellow !important;</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
}</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; min-height: 8pt; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; min-height: 8pt; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
To style only second tab</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13px; line-height: 19.5px; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13.3333px; padding: 0px; vertical-align: baseline;">
.colorfulTab.af|panelTabbed af|panelTabbed::viewable-tabs > div:nth-child(2) af|panelTabbed::tab-text-link {</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13.3333px; padding: 0px; vertical-align: baseline;">
color: yellow !important;</div>
<div style="background-color: #e5e5e5; border: 0px; color: #3d3d3d; font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; font-size: 13.3333px; padding: 0px; vertical-align: baseline;">
}</div>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">We have to use nth-child selector of css because Oracle by default style all panelAccordion headers (or panelTab's tab) with one single style. There is no way to provide different styles for different headers. Ideally I would have loved to have an attribute in panelAccordion like headerStyle, which I can set as comma separated classnames. Then framework could have taken care to apply those class on individual headers. I just need to provide styles on those classes.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">Disclaimer: This solution is not upgrade safe as there is no guarantee that header tags (h1) will be placed same way in html hierarchy as it is today. If ADF framework changes h1 tag in html then whole implementation will fail and you may need to write a new class.</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
</div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com1tag:blogger.com,1999:blog-1799093969133798390.post-81138435878016443252016-03-23T22:14:00.002-07:002016-03-23T22:14:23.276-07:00JDeveloper (ADF) Tip: Open pages in source mode instead of design mode. (Improve Productivity)<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Problem description</b>: When we try to open a jspx/jsff file it opens up in design mode and generally it takes long time to show page. Most of the time we directly want to see page in source mode.<br />
<br />
Here I am just showing to simple jdeveloper tip to open page or page-fragment directly in source mode. This will save time and improve productivity.<br />
<br />
<b><u>Solution</u></b><br />
<br />
Simple navigate to Tools > Preferences > File Type > Default Editor<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-UMqTw9dq2fg/VvN3NxMWCPI/AAAAAAAACu8/YjFYI09IN4EfWhfpNik0hcVwhb4matv1Q/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="282" src="https://3.bp.blogspot.com/-UMqTw9dq2fg/VvN3NxMWCPI/AAAAAAAACu8/YjFYI09IN4EfWhfpNik0hcVwhb4matv1Q/s400/1.png" width="400" /></a></div>
<br />
Set default editor for different types of file. Mainly I set default editor = Source for JSFF Label, JSP Segment, JSP Source, HTML Source<br />
<br />
Thats all.<br />
<br />
<br /></div>
Sanjeev Chauhanhttp://www.blogger.com/profile/01177389601954395860noreply@blogger.com0