UIComponent.getAttributes() doesn't return a proper Map?
I am finding that the 'Map' returned by UIComponent.getAttributes() doesn't obey the entire Map contract:
- containsKey() always returns false
- new HashMap<String, Object>(event.getComponent().getAttributes()) doesn't return a filled-in Map, which suggests that the iteration facilities of the underlying Map don't work either.
Is this a known problem/limitation/feature?
JSF 1.2 and JSF 2.0.
ejp wrote:
I don't really care about the iterators as that was just a non-working workaround for the other problem. The case I'm interested in is where the attribute is set via <f:attribute>. These don't show up via containsKey(). In certain places I have a test to ensure all the required f:attributes are being set in the page, to avoid NPEs later on, and these aren't showing up via containsKey() - but they do via get().Well as noted in the spec quote, if the attribute you are setting is a JavaBean property then containsKey() is supposed to return false. Otherwise, it sounds like a bug.
Similar Messages
-
UIComponent.getAttributes( ).get( ) Question
According to the 1.1 release notes, the Map returned by UIComponent.getAttributes( ) has a get( ) method that calls the corresponding property accessor of the UIComponent if it exists. So, if I had the following code:
class UIFoo implements UIComponent
public String getFoo( )
return( this.getAttributes( ).get( "foo" ) );
}Then I would effectively be setting myself up for infinite recursion. In fact, I am, because I get nested FacesException until I get a StackOverFlowException causing an OutOfMemoryError. I've been able to fence these exceptions until I got to the getAttributes( ).get( ) method, so that and the release notes seem to verify this.
The tutorial shows that in the setProperties method of the tag you should call getAttributes( ).put( "foo", "value" ) rather than calling a property accessor backed by an instance variable on the UIComponent implementation. Is this correct? If so, should I avoid writing accessors on my UIComponent? And if so, how should I abstract value binding logic?
Any help/suggestions/proven design patterns would be greatly appreciated.
Thanks,
- JesseJust for clarity, you can't "implement UIComponent"; you extend it, since it's an abstract class. And I'm guessing that you're actually extending UIComponentBase, not UIComponent - and this matters for what I'll say below.
The way UIComponentBase implements the Map returned by getAttributes() is to automatically call through to bean getters and setters. This, as you've seen, means that you get infinite recursion if you try to store your properties in the generic Map. The Map calls the bean getter calls the Map calls the bean getter...
So, you're forced to store properties directly as instance variables. The correct pattern for property accessors is something like:
public String getFoo()
if (_foo != null) return foo;
ValueBinding fooBinding = getValueBinding("foo");
if (fooBinding != null)
return fooBinding.getValue(getFacesContext());
return null;
public void setFoo(String foo)
_foo = foo;
// And you'd better override saveState() and getState() too, to preserve _foo!
private String _foo;Now, this is kind of frustrating, for reasons you allude to: if your Renderers and JSP tags are going through the generic Map, you're not optimizing anything by storing these properties as instance variables instead of in the Map. (You're still paying the cost of a Map lookup, and adding on top of that the cost of an introspector call.) And, worse, while storing properties in the Map gives you ValueBinding support and state saving and state restoring for free, when you store things as instance variables you get to implement all this from scratch. Painful stuff.
If you extend UIComponentBase, there's not a lot you can do about this. However, you could instead extend UIComponent. This'd put you on the hook for re-implementing all of UIComponentBase (UIComponent is a pure abstract class), but one of the things you could reimplement is getAttributes(). There's plenty of room for clever implementation work here, and this is one of the reasons that we provided a pure abstract base class for UIComponent.
What the docs are saying about the tag is that you can use the Map to talk to the component, but not that the Map can't talk to an accessor - just that in the tag, you don't care what the backing storage is for that property or attribute.
Hope this helps.
-- Adam Winer (EG member) -
Trace Route Doesn't Return DNS Name
I changed from a Linksys E4200 to a 5505 and when I use trace route, it doesn't return a DNS name for each hop. I can see the hops shown as asterisks. Do I have to add something to inspect for this to work?
Hi,
You could try the following. (Depending if your "policy-map" configuration is as its default settings)
policy-map global_policy
class inspection_default
inspect icmp error
inspect icmp
Then you could add the following to your ACL attached to your "outside" interface or configure a new ACL to your "outside" interface if it doesnt yet exist
access-list OUTSIDE-IN remark Allow ICMP return messages
access-list OUTSIDE-IN permit icmp any any unreachable
access-list OUTSIDE-IN permit icmp any any time-exceeded
access-list OUTSIDE-IN permit icmp any any echo-reply
access-group OUTSIDE-IN in interface outside
You will naturally use the existing ACL if you have one. If no ACL exists you can use the above configuration as it is.
Hope this helps
Please remember to mark the reply as the correct answer if it answered your question.
Ask more if needed
- Jouni -
Clip doesn't retain its proper duration
Hi there,
I have a 1 min. 6 sec Quicktime movie that I'm trying to import into Final Cut Pro. My problem is that whenever I try to import it, it doesn't retain the proper duration. It shortens itself to 1 min. and 3 or so seconds.
I've tried restarting FCP and the problem remained. I double-checked the Quicktime movie, and its duration is still 1 min. and 6 sec. I tried deleting the movie's reference in the Browser and re-imported it, but it still only has a 1 min. and 3 or so second duration. I need the rest of that clip.
What's even weirder is that when I make a freeze frame of some part of that clip (after it's been imported into the timeline), for some odd reason, the freeze frame references a later part of the clip (not where I chose to mkae a freeze frame).
I don't know if this will help, but the movie is a credits sequence done in After Effects that I exported to a Quicktime movie using DV/DVCPRO NTSC settings at a very high quality.
I appreciate all help.
Thanks,
AdamWhat's even weirder is that when I make a freeze frame of some part of that clip (after it's been imported into the timeline), for some odd reason, the freeze frame references a later part of the clip (not where I chose to mkae a freeze frame).I don't know if this will help, but the movie is a credits sequence done in After Effects that I exported to a Quicktime movie using DV/DVCPRO NTSC settings at a very high quality.
"Very high quality" is not helpful. You should have used Animation codec at the same frame rate. Your freeze frame would be easier to build if you did it in AE but, since you're out of time, your credits would be faster to create in FCP using one of the Boris titlers.
bogiesan -
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:
ZorryThanks 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,
GBHi 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 -
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 PathakAre 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 Masnybut 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
hamdogHI 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 PMHi,
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 -
It doesn't appear that Apple Maps replaces Google Maps in this recent software update. Am I correct?
Hepvill wrote:
Ah...of course. Just updated my iPad and am really disappointed about Apple Maps. Thanks for setting me straight.
Maybe try the iPad forums.
Pete -
Revision: 12007
Revision: 12007
Author: [email protected]
Date: 2009-11-19 12:45:27 -0800 (Thu, 19 Nov 2009)
Log Message:
When the Internet Explorer browser window is obscured Stage.width and Stage.height never return the proper sizes until/unless the IE window is unobscured long enough for the player to feel it needs to render initially. This was preventing our preloader from completing, since we were waiting for a non-0 Stage size. Took a slightly different approach to solving the bug for which the original logic was added to work around.
QE notes: None
Doc notes: None
Bugs: SDK-24191
Reviewer: Alex, Evtim
Tests run: Checkin
Is noteworthy for integration: No
Ticket Links:
http://bugs.adobe.com/jira/browse/non-0
http://bugs.adobe.com/jira/browse/SDK-24191
Modified Paths:
flex/sdk/trunk/frameworks/projects/framework/src/mx/managers/SystemManager.as
flex/sdk/trunk/frameworks/projects/framework/src/mx/preloaders/Preloader.asRevision: 12007
Revision: 12007
Author: [email protected]
Date: 2009-11-19 12:45:27 -0800 (Thu, 19 Nov 2009)
Log Message:
When the Internet Explorer browser window is obscured Stage.width and Stage.height never return the proper sizes until/unless the IE window is unobscured long enough for the player to feel it needs to render initially. This was preventing our preloader from completing, since we were waiting for a non-0 Stage size. Took a slightly different approach to solving the bug for which the original logic was added to work around.
QE notes: None
Doc notes: None
Bugs: SDK-24191
Reviewer: Alex, Evtim
Tests run: Checkin
Is noteworthy for integration: No
Ticket Links:
http://bugs.adobe.com/jira/browse/non-0
http://bugs.adobe.com/jira/browse/SDK-24191
Modified Paths:
flex/sdk/trunk/frameworks/projects/framework/src/mx/managers/SystemManager.as
flex/sdk/trunk/frameworks/projects/framework/src/mx/preloaders/Preloader.as -
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,
NickPlease 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.
Maybe you are looking for
-
Uploading a Keynote file using iTunes 11.1.12
I'm using iTunes 11.1.12 for a PC and I need to upload a keynote file. In iTunes I don't see a place to upload or file share. This feature existed in the last version. Can anyone help?
-
Open popup from fragment through template
All, I have some links in my page template and i want to open popups based on the click which are defined in separate page fragments. How do i achieve that ? Any sample example available for that ? thnks Jdev 11.1.1.5
-
How can i get matte screen protected and cleaned ???
I know that glossy MBP has a piece of glass covered on the screen, and it's easy to clean it by using some soft material. However, for matte screen. how can I protect screen and clean it. Like at the edge of screen, if dust in it, I won't be able to
-
(The good section no longer exists) Reinstall Macintosh Performa LC 745
Before I begin, I want to apologize for having posted in a wrong section. There have to tell the truth at all to my worries. Good evening. A friend gave me a collection of mac Vieu (LC475) for my 18 years and it still works except that I need to rein
-
Good example of face recognition not working
I started the automatic face recognition process through my old family photos. As it happened, I had a photo of 35 passport type pics of myself (all the same pic) that I had used for a country that needed numerous permits. Remember....these shots of