PhaseListener doesn't return image

Hi Experts,
I have a JackRabbit content repository in my web application which contains some of the images that need to be rendered.
In order to do this I decided to map a URL pattern to a PhaseListener, which will on receiving such a request load the image and return it with the HTTP response.
In other words, if the URL is http://domain.com/images?path=name.jpg the PhaseListener will intercept that and return an image from the JackRabbit content repository. My problem is, even though everything seems fine, I keep on receiving a 404 error. My code is as follow:
public class ImagePhaseListener implement PhaseListener {
  public PhaseId getPhaseId() {
    return PhaseId.RESTORE_VIEW;
  public void beforePhase(PhaseEvent event) {
    // Nothing to do
  public void afterPhase(PhaseEvent event) {
    FacesContext facesContext = event.getFacesContext();
    String viewID = facesContext.getViewRoot().getViewId();
    if (viewID.startsWith("/image/") {
      serveResource(facesContext);
  private void serveResource(FacesContext facesContext) {
    Map<String, String> requestMap = facesContext.getExternalContext().getRequestParameterMap();
    String path = requestMap.get("path");
    // Get the stream from JackRabbit - this works fine
    InputStream imageStream = getImageStream(path);
    // Write the response - this doesn't throw any exception, but doesn't seem to work either
    HttpServletResponse servletResponse = (HttpServletResponse)facesContext.getExternalContext().getResponse();
    servletResponse.setContentType("image/jpeg");
    try {
      int streamLength = imageStream.available();
      servletResponse.setContentLength(streamLength);
      while (streamLength > 0) {
         servletResponse.getOutputStream().write(imageStream.read());
         --streamLength;
       servletResponse.getOutputStream().flush();           
     catch (IOException exception) {
       // Log error
     finally {
       try {
         servletResponse.getOutputStream().close();
         imageStream.close();
      catch (IOException exception) {
        // Log error
    facesContext.responseComplete();
// More code ...
}I used my debugger to step through this and everything works fine - no exceptions nothing. The inputstream is loaded correctly and contains the correct number of bytes. Here is my HTTP headers:
GET /Resources/images?path=test.jpg HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.3) Gecko/2008111716 Gentoo Firefox/3.0.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
HTTP/1.x 404 Not Found
X-Powered-By: Servlet/2.5, JSF/1.2
Server: Sun Java System Application Server 9.1_02
Content-Type: text/html
Content-Length: 1028
Date: Wed, 26 Nov 2008 14:25:32 GMTI have no idea why this won't work - any and all help is appreciated.
Btw, what's the best way to write from an InputStream to the Response's OutputStream?
Thank you,
Ristretto

Thanks IoboEsa and BalusC,
BalusC - the reason I tried to get this to work with a JSF PhaseListener is because this would give me easy access to a managed bean containing the user information. I see in your article you recommend passing an ID attribute encrypted by MD5 for authentication, but if this information can be obtained from a JSF bean so much the better, don't you think? I guess I'll try the servlet approach and just construct the FacesContext manually
Thanks,
Ristretto

Similar Messages

  • MII doesn't return images from copied projects

    We are using MII 12.2.6.44 and when I make a copy of the existing project, the images cannot be found on the copy. But I'm sure, that they are on the given path, I receive the message:
      404   Not Found
    SAP NetWeaver Application Server
      Error: Requested file /path/path/someimage.png does not exist.
      SAP Technology Troubleshooting Guide
    Details:
    No details available.
    Sometimes I have to wait hours to have the pictures loaded, sometimes it is not recovered after days... Is there some "flush" function or something, that I could invoke? Because it is very annoying

    hi,
    unfortunately this didn't solve my problem, I right-mouse-clicked on the "Web" tab on the "WEB" directory, then "Publish", but I still don't see the icons
    EDIT: it works in IE, but not works in FF
    EDIT2: okay, maybe I have to restart the browser thankx

  • SQL Query (PL/SQL Function Body returning SQL query) doesn't return any row

    I have a region with the following type:
    SQL Query (PL/SQL Function Body returning SQL query).
    In a search screen the users can enter different numbers, separated by an ENTER.
    I want to check these numbers by replacing the ENTER, which is CHR(13) || CHR(10) I believe, with commas. And then I can use it like this: POD IN (<<text>>).
    It's something like this:
    If (:P30_POD Is Not Null) Then
    v_where := v_where || v_condition || 'POD IN (''''''''||REPLACE(''' || :P30_POD || ''', CHR(13) || CHR(10), '','')||'''''''''')';
    v_condition := ' AND ';
    End If;
    But the query doesn't return any rows.
    I tried to reproduce it in Toad:
    select * from asx_worklistitem
    where
    POD IN (''''||REPLACE('541449200000171813'||CHR(13) || CHR(10)||'541449206006341366', CHR(13) || CHR(10), ''',''')||'''')
    ==> This is the query that does't return any rows
    select (''''||REPLACE('541449200000171813'||CHR(13) || CHR(10)||'541449206006341366', CHR(13) || CHR(10), ''',''')||'''')
    from dual;
    ==> This returns '541449200000171813','541449206006341366'
    select * from asx_worklistitem
    where pod in ('541449200000171813','541449206006341366');
    ==> and when I copy/paste this in the above query, it does return my rows.
    So why does my first query doesn't work?
    Doe anyone have any idea?
    Kind regards,
    Geert
    Message was edited by:
    Zorry

    Thanks for the help.
    I made it work, but via the following code:
    If (:P30_POD Is Not Null) Then
    v_pods := REPLACE(:P30_POD, CHR(13) || CHR(10));
    v_where := v_where || v_condition || 'POD IN (';
    v_counter := 1;
    WHILE (v_counter < LENGTH(v_pods)) LOOP
    v_pod := SUBSTR(v_pods, v_counter, 18);
    IF (v_counter <> 1) THEN
    v_where := v_where || ',';
    END IF;
    v_where := v_where || '''' || v_pod || '''';
    v_counter := v_counter + 18;
    END LOOP;
    v_where := v_where || ')';
    v_condition := ' AND ';
    End If;But now I want to make an update of all the records that correspond to this search criteria. I can give in a status via a dropdownlist and that I want to update all the records that correspond to one of these POD's with that status.
    For a region you can build an SQL query via PL/SQL, but for a process you only have a PL/SQL block. Is the only way to update all these records by making a loop and make an update for every POD that is specified.
    Because I think this will have a lot of overhead.
    I would like to make something like a multi row update in an updateable report, but I want to specify the status from somewhere else. Is this possible?

  • IDoc Transport Acknowledge doesn't return to PI 7.0 automatically

    Hi all,
    I realized an Integration scenario in which PI 7.0 generates custom IDocs messages (like MBGMCR) and send them to a SAP system (4.6 C). In particular there are the scenario steps:
    1. BPM -> IDoc msg
    2. IDoc msg transport ACK -> BPM
    3. BPM -> JDBC updating
    When SAP receive IDocs must send back to PI the related Transport Acknoledgement in order to complete the Integration Scenario with JDBC updating.
    So I observe that, if I don't refresh IDoc messages on SXMB_MONI, the Transport ACK doesn't return back from SAP to PI and the BPM remains pending.
    Any ideas?
    Thanks in advance,
    GB

    Hi Gaurav,
    could you please tell me which are these parameters:
    - partner number (for the receiver)
    - partner type (for the receiver)
    - partner role  (for the receiver)
    In my scenario PI 7.0 sends IDocs to R/3 so the receiver (written in the point 3 of the link you sent me) should be R/3.
    It's right?
    I'm unable to find the Parner Role. In which transaction can I found it?
    Thanks,
    GB

  • Finder doesn't show image dimensions

    Hi!
    I have a problem with image dimensions in Finder. Finder doesn't show image dimension info in preview column and Get Info window. But when I open in Preview app I can see dimensions in Get Info window. How to solve this problem. If I want to sort images by dimension, I can't do that. Because Finder doesn't know image dimensions. You can see images below.

    Terence Devlin wrote:
    That's because the Finder is a file manager and works from file metadata. The data you're seeking is about the file contents. You need to use a Photo Manager or Browser.
    There is someone who can sort images by dimensions and see dimensions in list view. Also if Finder will not show image dimensions, why give me "Dimensions" and "Resolution" option to select in list view.
    VikingOSX wrote:
    Launch a Finder window. Press command+J, and set Show Item Info. Now the image dimensions will show below each image icon. If it is a movie, then the duration of the movie is shown.
    I have done this. But doesn't show information.

  • XI doesn't return an xml file

    Hi,
    I've made a scenario using XI 3.0. I use a file adapter with an inbound synchronous interface to send a xml file to XI. XI consumes a function from CRM using a RFC adapter and an outbound synchronous interface. I've setted "Best Effort" as quality of service too.
    The xml file arrives correctly to CRM and CRM returns the BAPI result to XI correctly too. The problem is XI doesn't return the xml file which it should, that's to say, the xml file sent by XI isn't in the specified target directory (using an inbound synchronous interface and a XI adapter).
    Could someone explain me what happens?
    Thanks in advance,
    Samantha.

    Hi Samantha,
    bad news: File Adapter is always asynchronous, cant get any response. And if you use an interface to send data it is an outbound interface.
    To realize your business logic you must use BPM like
    file (outbound asynchronous) -> BP (abstract asynchronous)
    BP (abstract synchronous) <-> CRM (inbound synchronous)
    BP (abstract asynchronous) -> file (inbound asynchronous)
    Regards,
    Udo

  • Doesn't return true value .........

    Hi All,
    please check the following code.
    password (originalPassword) from the database is : xyz
    password (password) from the login page is : xyz
    when I try for equality for the password :
    if(originalPassword.equalsIgnoreCase(password)) {
    it doesn't return true value while the password is same that is : xyz ?
    I an stuck in the problem.
    Please look into the code and solve my problem.
    Thanks
    public boolean verifyPassword(String username, String password) {
            String originalPassword=null;
            try {
                Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
               Connection con = DriverManager.getConnection("jdbc:microsoft:sqlserver://sqlserver:1433","harish","harish");
               PreparedStatement pstmt = con.prepareStatement("select password from registration where username='"+username+"'");          
               //ResultSet rs = pstmt.getResultSet();
               ResultSet rs = pstmt.executeQuery();
               if(rs.next()) {
                   originalPassword=rs.getString(1);              
               pstmt.close();
               if(originalPassword.equalsIgnoreCase(password)) {
                              return true;
               } else {
                   return false;
           } catch (Exception e){
               System.out.println("Exception: verifyPassword="+e);
               return false;
         Harish Pathak

    Are you sure there's no space before or after "xyz"? Try adding some debug output to your code:
    if(originalPassword.equalsIgnoreCase(password)) {
      //foo
    } else {
      System.out.println("<" + password + "> does not match <" + originalPassword + ">");
    }

  • Query with subquery containing group clause doesn't return any rows - WHY ?

    Hi,
    My query doesn't return any values :
    select g1.NTRX from gtrx g1
    where exists
    (SELECT b.cfunctrx, b.cpro1trx, b.nmsgitrx, b.nmrc, b.ncrd, b.namtstrx,
    b.dltimtrx, b.nrtrftrx,count(*)
    FROM gtrxacq a, gtrx b
    WHERE a.ntrx = b.ntrx AND a.acq_bus_date = (SELECT curr_bus_date -1
    FROM gmbr
    WHERE nmbr = 0)
    and g1.NTRX=b.NTRX
    GROUP BY b.cfunctrx,
    b.cpro1trx,
    b.nmsgitrx,
    b.nmrc,
    b.ncrd,
    b.namtstrx,
    b.dltimtrx,
    b.nrtrftrx
    HAVING COUNT (*) > 1);
    but such query returns some number of rows :
    SELECT b.cfunctrx, b.cpro1trx, b.nmsgitrx, b.nmrc, b.ncrd, b.namtstrx,
    b.dltimtrx, b.nrtrftrx,count(*)
    FROM gtrxacq a, gtrx b
    WHERE a.ntrx = b.ntrx AND a.acq_bus_date = (SELECT curr_bus_date -1
    FROM gmbr
    WHERE nmbr = 0)
    /*and g1.NTRX=b.NTRX*/
    GROUP BY b.cfunctrx,
    b.cpro1trx,
    b.nmsgitrx,
    b.nmrc,
    b.ncrd,
    b.namtstrx,
    b.dltimtrx,
    b.nrtrftrx
    HAVING COUNT (*) > 1
    AND when i put results from query above into query :
    select g1.NTRX from gtrx g1
    where
    g1.CFUNCTRX= 200 and g1.CPRO1TRX= 000 and g1.NMSGITRX= 1240 and
    g1.NMRC= '000000000000675' and g1.NCRD= 405671**********
    and g1.NAMTSTRX=14.26 and g1.DLTIMTRX=to_date('07/08/2008 15:07:02','MM/DD/YYYY HH24:MI:SS')
    and g1.NRTRFTRX= '000414598393';
    it returns values.
    what is wrong ?
    Best Regards Arkadiusz Masny

    but such query returns some number of rows :
    /*and g1.NTRX=b.NTRX*/Add b.NTRX into group by and recheck.

  • Click on a cell in formula doesn't return value, only text. why?

    When doing a simple formula like =c4-c5 in one of my sheets, when i click on the cell, it doesn't return the value, only text.
    What setting do i have enabled/disabled?
    thanks
    hamdog

    HI Hamdog,
    What you are seeing is the formula that is in that cell.
    The setting you have turned on is the first one in the bottom section of the General page of Numbers Preferences. In the English versions, it looks like this:
    With the checkbox unchecked (as mine is), the formula would read:
    =L10-P10
    Column L is labeled "Tips", Column P is labeled "Lenka", Row 10 is labeled "9. 2. 2013"
    To Copy and Paste the result, 462, click (once) on the cell and Copy, then click (once) on the cell where you want to paste the result and go Edit > Paste Values. This should be the seventh item (not including the separator line) in the Edit menu.
    Regards,
    Barry
    Regards,
    Barry

  • The same selection doesn't return the same result in 2 identical systems

    Hi,
    After a copy we have 2 systems with same data.
    In a program the same selection doesn't returns the same result, it seems that the sort is different.
    I have checked indexes but they are ok in both systems.
    Here is the selection:
    SELECT but000~partner
    INTO TABLE lt_partner
    *UP TO 50 ROWS
    FROM but000
    JOIN but020
      ON but020partner = but000partner
    JOIN adrc
      ON adrcaddrnumber = but020addrnumber
    JOIN but100
      ON but100partner = but000partner
      WHERE but020~addr_valid_from LE '20100727000000'
      AND   but020~addr_valid_to   GE '20100727000000'.
    Is there a customizing point to define how the database must be sorted ?
    Thanks.
    Edited by: julien schneerberger on Jul 27, 2010 4:18 PM

    Hi,
    Thank you for your answer.
    Result is the same and I don't sort data after the selection.
    Do you think the system copy has "broke" the records order in database ?
    If it is the case it will be impossible to reproduce the same sort, is it right ?
    Edited by: julien schneerberger on Jul 27, 2010 5:19 PM
    Edited by: julien schneerberger on Jul 27, 2010 5:20 PM

  • Disco Report doesn't return data for a responsibilty

    Hi Guys,
    We have a report, we have shared with XXX Tax Manager. When we login through XXX Tax Manager, it doesn`t return data. But when we do similer with XXX Payables Manager, report runs fine and return data?
    Can any one help me on this.
    Note: Both Responsibility have access to the Business Area.
    Thanks,
    Nick

    Please find the below query:
    SELECT /*+ NOREWRITE */
    o101613.expense_account_num AS e264170,
    o271954.description AS e271961, o271954.po_number AS e272013,
    o271954.project AS e272033, o271954.task AS e272035,
    o271954.expenditure_type AS e272036, o272183.amount AS e275461,
    (o272183.gl_date) AS e275566, (o272183.invoice_date) AS e275578,
    o272183.invoice_id AS e275580, o275448.invoice_id AS e275581,
    o272183.invoice_number AS e275584,
    o272183.self_assessed_flag AS e275674,
    o272183.ship_to_location_code AS e275681, o272183.state AS e275685,
    o272183.tax_amount AS e275695,
    o272183.tax_jurisdiction_code AS e275698,
    o272183.tax_rate AS e275700, o272183.vendor_name AS e275720,
    o272183.vendor_number AS e275723, (o278494.gl_date) AS e278500,
    o278494.liability_account AS e278501
    FROM apfg_ap_invoices o101612,
    apfg_ap_invoice_distributions o101613,
    apps.ap_invoice_lines_v o271954,
    (SELECT ap.invoice_id, aps.vendor_name, aps.segment1 vendor_number,
    ap.invoice_num invoice_number, ap.invoice_date, ap.gl_date,
    apl.amount amount, zxl.tax_amt tax_amount,
    zxr.percentage_rate tax_rate, zxl.tax_jurisdiction_code,
    apl.ship_to_location_code, zxl.self_assessed_flag,
    hzg.geography_element2_code state, apl.line_number
    FROM ap.ap_suppliers aps,
    ap.ap_invoices_all ap,
    zx.zx_lines zxl,
    apps.ap_invoice_lines_v apl,
    zx.zx_rates_b zxr,
    zx.zx_jurisdictions_tl zxj,
    zx.zx_jurisdictions_b zxb,
    ar.hz_geographies hzg
    WHERE aps.vendor_id = ap.vendor_id
    AND ap.invoice_id = zxl.trx_id
    AND zxl.trx_id = apl.invoice_id
    AND zxl.trx_line_number = apl.line_number
    AND zxl.entity_code = 'AP_INVOICES'
    AND zxl.event_class_code = 'STANDARD INVOICES'
    AND zxl.self_assessed_flag = 'Y'
    --AND zxr.tax_rate_code         = zxl.tax_rate_code
    AND zxr.tax_rate_id = zxl.tax_rate_id
    AND zxj.tax_jurisdiction_id = zxl.tax_jurisdiction_id
    AND zxb.tax_jurisdiction_id = zxj.tax_jurisdiction_id
    AND zxb.zone_geography_id = hzg.geography_id
    AND zxl.tax_amt <> 0
    AND apl.line_type_lookup_code IN
    ('ITEM', 'FREIGHT', 'MISCELLANEOUS')
    AND apl.line_source IN
    ('HEADER MATCH',
    'MANUAL LINE ENTRY',
    'IMPORTED',
    'CHRG ITEM MATCH'
    AND ap.cancelled_date IS NULL
    ORDER BY aps.vendor_name, ap.invoice_num) o272183,
    apps.ap_invoices_v o275448,
    (SELECT xte.source_id_int_1 invoice_id, gcc.code_combination_id,
    xte.transaction_number, xal.accounting_date gl_date,
    gcc.segment1
    || '.'
    || gcc.segment2
    || '.'
    || gcc.segment3
    || '.'
    || segment4
    || '.'
    || segment5
    || '.'
    || segment6
    || '.'
    || segment7 liability_account
    FROM xla.xla_transaction_entities xte,
    xla.xla_ae_headers xah,
    xla.xla_ae_lines xal,
    gl.gl_code_combinations gcc
    WHERE 1 = 1
    AND xte.entity_id = xah.entity_id
    AND xte.application_id = xah.application_id
    AND xah.ae_header_id = xal.ae_header_id
    AND xal.accounting_class_code = 'SELF_ASSESSED_TAX_LIAB'
    AND xal.code_combination_id = gcc.code_combination_id) o278494
    WHERE ( (o101612.invoice_id = o101613.invoice_id(+))
    AND ( o101613.invoice_id = o271954.invoice_id
    AND o101613.invoice_line_number = o271954.line_number
    AND ( o272183.invoice_id = o271954.invoice_id
    AND o272183.line_number = o271954.line_number
    AND (o272183.invoice_id = o275448.invoice_id)
    AND (o278494.invoice_id = o275448.invoice_id)
    AND (o101613.dist_line_type_code IN
    ('ITEM', 'FREIGHT', 'MISCELLANEOUS'')')
    AND (o101612.invoice_number = :"Invoice Number ")
    AND ((o272183.gl_date) <= :"Ending GL DATE")
    AND ((o272183.gl_date) >= :"Beginning GL DATE")
    ORDER BY o271954.project ASC, o272183.invoice_number ASC;
    It does not contain any security profiles, only contains view that might be not returning data.
    thanks

  • Entering URL in address bar causes spinning beach ball...doesn't return

    entering URL in address bar causes spinning beach ball. Safari then doesn't return and I have to force quit. This happens every time I try to type a url. It only
    does this on one account on the computer and not another on same computer.
    Under library preference I dragged the internet pref pane into trash. This did not help. I also dragged the system user perference pane com.apple.safari.plist as well into the trash but also did not fix the problem.
    I can not drag the internet pref pane from the trash back to the library folder. Will this cuase any problems?

    Glad you took the next step. My next suggestion was going to be the History file, which too is in the Safari folder. Sounds like that was the culprit.
    Thanks for the and Aloha from Big Island.

  • When I open Firefox, it doesn't return me to where I was before.

    When I open Firefox, it doesn't return me to where I was before and when it crashes, i don't get get a dialog box asking me to return to your previous page or to start a fresh one.
    What can I do?

    What do you have set in Options > General > When Firefox starts:? Do you have multiple sessionstore files in the profile? If so, it would be best to delete all of them and start over with collecting tabs.

  • OCIStmtExecute doesn't return

    I'm using Ora 9.2.0.1.0 (both server and client the same version)
    When i'm calling OCIStmtExecute (with an INSERT command, 1 row, no threading) the function doesn't return. It causes about 30% cpu usage on the client. I've already checked all parameter handles - they're all ok. It insn't the first sql command in my app, all previous calls of OCIStmtExecute were successfull.
    Any ideas / hints, how to find the reason for this ?
    Thanks,
    Daniel

    Hi Adrian,
    executing the inserts manually is a difficult task, because there are about 4000 rows inserted before the error occurs ... ;-) But the behaviour is really reproducible.
    I'm using Keeptool's Hora 5 to maintain the db, so now I can't say the source of this information. But when I take a look into the 'Sessions' tab during the hanging OCIStmtExecute, the concerned session's status (event waits) is something like 'SQL*Net break/waiting for reset' or something like this. I don't now the meaning of this message. Tommorow I will post the exact message. But as mentioned before, I don't know the view which Hora takes this message from.
    Daniel

  • Re: Web SDK Returning Images

    Hi Brendan,
    Regarding your question on returning images...
    At 09:18 AM 5/2/97 U, Brendan Duddridge wrote:
    Mail*Link&reg; SMTP Web SDK Returning Images
    Hi,
    Why on earth does the Web SDK 1.1 allow you to return BinaryData objectsto the web page if there's no way to display them? I can understand why it
    lets you return image files stored on disk somewhere, but I can't
    understand what the BinaryData version of AssignBinaryResponse method is
    used for if not for retrieving images from a database. No one seems to
    know what internal format graphic images are stored in when they're stored
    as blobs in the database and then read into ImageData objects. I'm still
    trying to figure out the MIME type used for BinaryData images read in from
    a database.
    >
    Has anyone ever used AssignBinaryResponse with BinaryData and MimeType asparameters instead of FileName and MimeType as parameters?
    >
    Help would be greatly appreciated. Thanks,
    Brendan DuddridgeOne of the reasons we added binary object support to the WebSDK update 1.1.A
    is to allow applications (that make binaries available to end users) to
    store the binary files on a machine other than the web server. These
    binary files may be images, executables, or whatever.
    The intention is to have the application read the binary files into a
    binarydata object and passing the contents of that object to the requesting
    browser. If in your case, you want your generated html page to use various
    images, you would want to read the files into binarydata objects to retain
    the data format of your file. You wouldn't read your image files into a
    Forte ImageData because the image format (jpeg, gif,bmp) would be translated
    to the internal Forte format (ImageData objects are meant to be used with
    Forte clients, rather than WEB clients).
    Regards,
    Peter W. Pang
    Forte Technical Support
    Technical Support Direct
    Hotline: 510-451-5400 | Tel: 510-869-3437
    FAX: 510-869-2010 |
    MailTo:[email protected] | <a
    href="MailTo:[email protected]">MailTo:[email protected]</a>
    WWW: http://www.forte.com |
    ---------------------------------------------------------

    What is your Traget System?
    If ABAP proxy--Follow beloa appraoch
    option 1: develop two sync interfaces
    Option 2: Develop Receiver response proxy structure and this structure should hold two proxy responses and write proxy logic to send response in one shot.
    in this case one interface enough.
    Regards,
    Raj

Maybe you are looking for