
org.apache.jackrabbit.oak.query.SQL2Parser.class Maven / Gradle / Ivy
???? 2?
T?
?? R? R? R? R??
? R? R?
??? R?? R?
R????
? R??
? R?
R??
R??
R????
???
R?
R? R?
a??
R???????
R????????
1? R?
1??
/?
1?
0?
0?
R???
R? R??
R???
R?
R??
R??
G?
G?
?????? M?
a?
M? M?
?
R????? ? ???
? R?? R? ?????
R?
????? ??? ??? ????
R?
?
a
R
R
R
R
R
R
R
R
R !
"
R#$ %& '( )* +, -. /012
?34
56789
R:
R;<
T=
>? R@
??
?A
B
CDE
FG
RH
I
J
KL
MN
RO
PQ
RS
T
UVW
RXY
Z[
R\
]^
_`
ab
cd
ef
ghi?i
?j ?kl
mn ?op
mq ?rs
?t
muv
1w
?x
?y
?z
?{ ?|}
?~
m?
R??
1?
??
?
????)
R?
?? ??
m?? R??
R?
m?
R?
???
??
?
??
??? M?
R???
R?
???????
R????
?????????
R???
a?
a?
R?
?? R? R?
?
a?
R?
R??
???
R??
m? R??? R?????
?????
?
1??
??
???
a?
a????????
a??
a??
a??
??? ColumnOrWildcard InnerClasses LOG Lorg/slf4j/Logger; CHAR_END I
ConstantValue???? CHAR_IGNORE
CHAR_VALUE CHAR_QUOTED CHAR_NAME CHAR_SPECIAL_1 CHAR_SPECIAL_2 CHAR_STRING CHAR_DECIMAL CHAR_BRACKETED KEYWORD
IDENTIFIER PARAMETER END VALUE MINUS PLUS
OPEN CLOSE types /Lorg/apache/jackrabbit/oak/spi/state/NodeState; statement Ljava/lang/String; statementChars [C characterTypes [I
parseIndex currentTokenType currentToken currentTokenQuoted Z currentValue -Lorg/apache/jackrabbit/oak/api/PropertyValue; expected Ljava/util/ArrayList; Signature )Ljava/util/ArrayList;
bindVariables Ljava/util/HashMap; bLjava/util/HashMap; selectors Ljava/util/Map; ULjava/util/Map; allowTextLiterals allowNumberLiterals $includeSelectorNameInWildcardColumns factory 7Lorg/apache/jackrabbit/oak/query/ast/AstElementFactory; supportSQL1 namePathMapper 3Lorg/apache/jackrabbit/oak/namepath/NamePathMapper; settings 5Lorg/apache/jackrabbit/oak/query/QueryEngineSettings; literalUsageLogged ?(Lorg/apache/jackrabbit/oak/namepath/NamePathMapper;Lorg/apache/jackrabbit/oak/spi/state/NodeState;Lorg/apache/jackrabbit/oak/query/QueryEngineSettings;)V Code LineNumberTable LocalVariableTable this ,Lorg/apache/jackrabbit/oak/query/SQL2Parser; parse <(Ljava/lang/String;Z)Lorg/apache/jackrabbit/oak/query/Query; unionAll q2 +Lorg/apache/jackrabbit/oak/query/QueryImpl; e2 Ljava/text/ParseException; e Ljava/lang/Exception; query
initialise explain measure q 'Lorg/apache/jackrabbit/oak/query/Query; orderings 3[Lorg/apache/jackrabbit/oak/query/ast/OrderingImpl;
StackMapTable???
Exceptions ;(Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/Query; parseSelect -()Lorg/apache/jackrabbit/oak/query/QueryImpl; distinct list source 0Lorg/apache/jackrabbit/oak/query/ast/SourceImpl; columnArray 1[Lorg/apache/jackrabbit/oak/query/ast/ColumnImpl;
constraint 4Lorg/apache/jackrabbit/oak/query/ast/ConstraintImpl; LocalVariableTypeTable TLjava/util/ArrayList;???? addColumnIfNecessary <(Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;)V col c =Lorg/apache/jackrabbit/oak/query/SQL2Parser$ColumnOrWildcard; i$ Ljava/util/Iterator;
columnName propertyName column? {(Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;)V setSupportSQL1 (Z)V sql1
parseSelector 4()Lorg/apache/jackrabbit/oak/query/ast/SelectorImpl; Ljavax/jcr/RepositoryException; nodeTypeName type selectorName???? readName ()Ljava/lang/String; s parseSource 2()Lorg/apache/jackrabbit/oak/query/ast/SourceImpl; joinType .Lorg/apache/jackrabbit/oak/query/ast/JoinType; on 7Lorg/apache/jackrabbit/oak/query/ast/JoinConditionImpl; selector 2Lorg/apache/jackrabbit/oak/query/ast/SelectorImpl;?? parseJoinCondition 9()Lorg/apache/jackrabbit/oak/query/ast/JoinConditionImpl; selector1 selector2
childSelector descendantSelector property1
identifier name? parseConstraint 6()Lorg/apache/jackrabbit/oak/query/ast/ConstraintImpl; a parseAnd parseCondition op 8Lorg/apache/jackrabbit/oak/query/ast/DynamicOperandImpl; right left 7Lorg/apache/jackrabbit/oak/query/ast/StaticOperandImpl;? n(Lorg/apache/jackrabbit/oak/query/ast/DynamicOperandImpl;)Lorg/apache/jackrabbit/oak/query/ast/ConstraintImpl; esc v x not p 7Lorg/apache/jackrabbit/oak/query/ast/PropertyValueImpl; pv NLjava/util/ArrayList;8? getPropertyExistence t(Lorg/apache/jackrabbit/oak/query/ast/PropertyValueImpl;)Lorg/apache/jackrabbit/oak/query/ast/PropertyExistenceImpl; getPropertyInexistence v(Lorg/apache/jackrabbit/oak/query/ast/PropertyValueImpl;)Lorg/apache/jackrabbit/oak/query/ast/PropertyInexistenceImpl; parseConditionFunctionIf H(Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/ConstraintImpl; language functionName readAbsolutePath path readPath parseDynamicOperand :()Lorg/apache/jackrabbit/oak/query/ast/DynamicOperandImpl; parseExpressionFunction L(Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/DynamicOperandImpl; parsePropertyValue K(Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/PropertyValueImpl; parseStaticOperand 9()Lorg/apache/jackrabbit/oak/query/ast/StaticOperandImpl; valueType literal 1Lorg/apache/jackrabbit/oak/query/ast/LiteralImpl; var ;Lorg/apache/jackrabbit/oak/query/ast/BindVariableValueImpl; value? getUncastLiteral `(Lorg/apache/jackrabbit/oak/api/PropertyValue;)Lorg/apache/jackrabbit/oak/query/ast/LiteralImpl; parseCastAs \(Lorg/apache/jackrabbit/oak/api/PropertyValue;)Lorg/apache/jackrabbit/oak/api/PropertyValue; propertyType? getPropertyTypeFromName (Ljava/lang/String;)I matchesPropertyType (ILjava/lang/String;)Z typeName
parseOrder 5()[Lorg/apache/jackrabbit/oak/query/ast/OrderingImpl; ordering 2Lorg/apache/jackrabbit/oak/query/ast/OrderingImpl; orderList ILjava/util/ArrayList;? parseColumns ()Ljava/util/ArrayList;? V()Ljava/util/ArrayList; readOptionalAlias @(Lorg/apache/jackrabbit/oak/query/SQL2Parser$ColumnOrWildcard;)Z resolveColumns H(Ljava/util/ArrayList;)[Lorg/apache/jackrabbit/oak/query/ast/ColumnImpl; columns array GLjava/util/ArrayList; ?(Ljava/util/ArrayList;)[Lorg/apache/jackrabbit/oak/query/ast/ColumnImpl; addWildcardColumns +(Ljava/util/Collection;Ljava/lang/String;)V Ljava/util/Collection; HLjava/util/Collection; ](Ljava/util/Collection;Ljava/lang/String;)V K(Ljava/util/Collection;Lorg/apache/jackrabbit/oak/query/ast/SelectorImpl;)V }(Ljava/util/Collection;Lorg/apache/jackrabbit/oak/query/ast/SelectorImpl;)V readIf (Ljava/lang/String;)Z token isToken result read (Ljava/lang/String;)V
readString /()Lorg/apache/jackrabbit/oak/api/PropertyValue; addExpected
initialize C i len command startLoop?? checkRunOver (III)V ()V number J start chars (IC)V begin end
checkLiterals text readDecimal (II)V t !Ljava/lang/NumberFormatException; sub bd Ljava/math/BigDecimal;?s getSyntaxError ()Ljava/text/ParseException; exp buff Ljava/lang/StringBuilder;? .(Ljava/lang/String;)Ljava/text/ParseException; index getOnlySelectorName escapeStringLiteral &(Ljava/lang/String;)Ljava/lang/String; setAllowTextLiterals setAllowNumberLiterals 'setIncludeSelectorNameInWildcardColumns
isInternal
SourceFile SQL2Parser.java?h??????????? 5org/apache/jackrabbit/oak/query/ast/AstElementFactory??????? -org/apache/jackrabbit/oak/spi/state/NodeState}~ 3org/apache/jackrabbit/oak/query/QueryEngineSettings??^Z??h java/util/ArrayList?? java/util/HashMap??Yh EXPLAINTU MEASURE?? UNION ALL .org/apache/jackrabbit/oak/query/UnionQueryImpl?? ORDER BYYZ:;???? {?????????U???h java/lang/Exception java/text/ParseException java/lang/StringBuilder??? : ?????????? SELECT DISTINCTAB?? jcr:path?? jcr:score FROM??GH WHERE? )org/apache/jackrabbit/oak/query/QueryImpl?? ??? ;org/apache/jackrabbit/oak/query/SQL2Parser$ColumnOrWildcard??????
? javax/jcr/RepositoryException !could not convert node type name
? unknown node type AS??Z a token??? java/lang/String??? RIGHT OUTER?? LEFT? INNER?? JOIN ON?? (
ISSAMENODEU ,? . ISCHILDNODE ISDESCENDANTNODE ! ,ISSAMENODE, ISCHILDNODE, or ISDESCENDANTNODE ) ="# OR$% AND&' NOT("#
)*?? [&' IN !+,-./{| <>0- <1- >2- <=3- >=4- LIKE.- ESCAPE /org/apache/jackrabbit/oak/query/ast/LiteralImpl only ESCAPE '' is supported5\ \67 IS NULL 5org/apache/jackrabbit/oak/query/ast/PropertyValueImpl 8propertyName (NOT NULL is only supported for properties) 9Only property values can be tested for NOT IS NULL; got: 89:;??Z<?=>?@ CONTAINS *AB "selector name, property name, or *?CDEFGH SIMILARIJ NATIVE[\KL
SPELLCHECKMN SUGGESTONPQU
absolute path$% LENGTHRS NAMEWUTU LOCALNAMEVW SCOREXY LOWERZ[ UPPER\] PROPERTY)^ 9LENGTH, NAME, LOCALNAME, SCORE, LOWER, UPPER, or PROPERTY_`abc java/lang/Longdefg java/lang/Doublehij java/math/BigDecimalklmn Illegal operation: + ?opqrsturvw java/lang/Booleanx?yz Illegal operation: -/0 :?{|? 9org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl}~ TRUE FALSE CAST12)0 TIMESTAMP?? static operand?? data type (STRING|BINARY|...)56??78??? DESC?? ASC???b 0org/apache/jackrabbit/oak/query/ast/OrderingImpl?? EXCERPT rep:excerpt??EF rep:spellcheck :spellcheckMN?? .org/apache/jackrabbit/oak/query/ast/ColumnImpl??? 0org/apache/jackrabbit/oak/query/ast/SelectorImplMR Unknown selector: ?????]Z string value Rb??fg?????????rsp? 0[m '??WX????? Literal used?Z 1bind variable (literals of this type not allowed)?Z java/lang/NumberFormatException !Data conversion error converting to BigDecimal: , ????? (*)???? ; expected: Query: TNeed to specify the selector name because the query contains more than one selector.?? ''?? /* oak-internal */?6 *org/apache/jackrabbit/oak/query/SQL2Parser??? java/lang/Object %org/apache/jackrabbit/oak/query/Query .org/apache/jackrabbit/oak/query/ast/SourceImpl 2org/apache/jackrabbit/oak/query/ast/ConstraintImpl java/util/Iterator ,org/apache/jackrabbit/oak/query/ast/JoinType 5org/apache/jackrabbit/oak/query/ast/JoinConditionImpl 5org/apache/jackrabbit/oak/query/ast/StaticOperandImpl 6org/apache/jackrabbit/oak/query/ast/DynamicOperandImpl +org/apache/jackrabbit/oak/api/PropertyValue com/google/common/collect/Maps
newHashMap ()Ljava/util/HashMap; $com/google/common/base/Preconditions checkNotNull &(Ljava/lang/Object;)Ljava/lang/Object;
java/util/Map clear ?(ZLorg/apache/jackrabbit/oak/query/Query;Lorg/apache/jackrabbit/oak/query/Query;Lorg/apache/jackrabbit/oak/query/QueryEngineSettings;)V isEmpty ()Z setOrderings 6([Lorg/apache/jackrabbit/oak/query/ast/OrderingImpl;)V
setExplain
setMeasure setInternal init append -(Ljava/lang/String;)Ljava/lang/StringBuilder;
getMessage toString (Ljava/lang/String;I)V initCause ,(Ljava/lang/Throwable;)Ljava/lang/Throwable;(Ljava/lang/String;Lorg/apache/jackrabbit/oak/query/ast/SourceImpl;Lorg/apache/jackrabbit/oak/query/ast/ConstraintImpl;[Lorg/apache/jackrabbit/oak/query/ast/ColumnImpl;Lorg/apache/jackrabbit/oak/namepath/NamePathMapper;Lorg/apache/jackrabbit/oak/query/QueryEngineSettings;)V setDistinct iterator ()Ljava/util/Iterator; hasNext next ()Ljava/lang/Object; equals (Ljava/lang/Object;)Z add 1org/apache/jackrabbit/oak/namepath/NamePathMapper
getOakName getChildNode C(Ljava/lang/String;)Lorg/apache/jackrabbit/oak/spi/state/NodeState; exists u(Lorg/apache/jackrabbit/oak/spi/state/NodeState;Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/SelectorImpl; "org/apache/jackrabbit/oak/api/Type STRING $Lorg/apache/jackrabbit/oak/api/Type; getValue 8(Lorg/apache/jackrabbit/oak/api/Type;)Ljava/lang/Object; getSelectorName put 8(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; RIGHT_OUTER
LEFT_OUTER join ?(Lorg/apache/jackrabbit/oak/query/ast/SourceImpl;Lorg/apache/jackrabbit/oak/query/ast/SourceImpl;Lorg/apache/jackrabbit/oak/query/ast/JoinType;Lorg/apache/jackrabbit/oak/query/ast/JoinConditionImpl;)Lorg/apache/jackrabbit/oak/query/ast/JoinImpl; equalsIgnoreCase sameNodeJoinCondition w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/SameNodeJoinConditionImpl; childNodeJoinCondition f(Ljava/lang/String;Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/ChildNodeJoinConditionImpl; descendantNodeJoinCondition k(Ljava/lang/String;Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/DescendantNodeJoinConditionImpl; equiJoinCondition ?(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/EquiJoinConditionImpl; or ?(Lorg/apache/jackrabbit/oak/query/ast/ConstraintImpl;Lorg/apache/jackrabbit/oak/query/ast/ConstraintImpl;)Lorg/apache/jackrabbit/oak/query/ast/OrImpl; and ?(Lorg/apache/jackrabbit/oak/query/ast/ConstraintImpl;Lorg/apache/jackrabbit/oak/query/ast/ConstraintImpl;)Lorg/apache/jackrabbit/oak/query/ast/AndImpl; c(Lorg/apache/jackrabbit/oak/query/ast/ConstraintImpl;)Lorg/apache/jackrabbit/oak/query/ast/NotImpl;
propertyValue ](Ljava/lang/String;Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/PropertyValueImpl; ,org/apache/jackrabbit/oak/query/ast/Operator EQUAL .Lorg/apache/jackrabbit/oak/query/ast/Operator;
comparison ?(Lorg/apache/jackrabbit/oak/query/ast/DynamicOperandImpl;Lorg/apache/jackrabbit/oak/query/ast/Operator;Lorg/apache/jackrabbit/oak/query/ast/StaticOperandImpl;)Lorg/apache/jackrabbit/oak/query/ast/ComparisonImpl; NOT_EQUAL LESS_THAN GREATER_THAN
LESS_OR_EQUAL GREATER_OR_EQUAL getLiteralValue in ?(Lorg/apache/jackrabbit/oak/query/ast/DynamicOperandImpl;Ljava/util/ArrayList;)Lorg/apache/jackrabbit/oak/query/ast/ConstraintImpl; getClass ()Ljava/lang/Class; java/lang/Class getName getPropertyName propertyExistence a(Ljava/lang/String;Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/PropertyExistenceImpl; propertyInexistence c(Ljava/lang/String;Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/PropertyInexistenceImpl; fullTextSearch ?(Ljava/lang/String;Ljava/lang/String;Lorg/apache/jackrabbit/oak/query/ast/StaticOperandImpl;)Lorg/apache/jackrabbit/oak/query/ast/FullTextSearchImpl; sameNode X(Ljava/lang/String;Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/SameNodeImpl; childNode Y(Ljava/lang/String;Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/ChildNodeImpl; descendantNode ^(Ljava/lang/String;Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/DescendantNodeImpl; similar ?(Ljava/lang/String;Ljava/lang/String;Lorg/apache/jackrabbit/oak/query/ast/StaticOperandImpl;)Lorg/apache/jackrabbit/oak/query/ast/SimilarImpl; nativeFunction ?(Ljava/lang/String;Ljava/lang/String;Lorg/apache/jackrabbit/oak/query/ast/StaticOperandImpl;)Lorg/apache/jackrabbit/oak/query/ast/NativeFunctionImpl;
spellcheck (Ljava/lang/String;Lorg/apache/jackrabbit/oak/query/ast/StaticOperandImpl;)Lorg/apache/jackrabbit/oak/query/ast/ConstraintImpl; suggest +org/apache/jackrabbit/oak/commons/PathUtils
isAbsolute length i(Lorg/apache/jackrabbit/oak/query/ast/PropertyValueImpl;)Lorg/apache/jackrabbit/oak/query/ast/LengthImpl; nodeName F(Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/NodeNameImpl;
nodeLocalName K(Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl; fullTextSearchScore Q(Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/FullTextSearchScoreImpl; lowerCase m(Lorg/apache/jackrabbit/oak/query/ast/DynamicOperandImpl;)Lorg/apache/jackrabbit/oak/query/ast/LowerCaseImpl; upperCase m(Lorg/apache/jackrabbit/oak/query/ast/DynamicOperandImpl;)Lorg/apache/jackrabbit/oak/query/ast/UpperCaseImpl; o(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/PropertyValueImpl; getType &()Lorg/apache/jackrabbit/oak/api/Type; tag ()I LONG 2org/apache/jackrabbit/oak/spi/query/PropertyValues newLong ?(Ljava/lang/Long;)Lorg/apache/jackrabbit/oak/api/PropertyValue; DOUBLE newDouble A(Ljava/lang/Double;)Lorg/apache/jackrabbit/oak/api/PropertyValue; DECIMAL negate ()Ljava/math/BigDecimal;
newDecimal E(Ljava/math/BigDecimal;)Lorg/apache/jackrabbit/oak/api/PropertyValue; -(Ljava/lang/Object;)Ljava/lang/StringBuilder; longValue ()J valueOf (J)Ljava/lang/Long; doubleValue ()D (D)Ljava/lang/Double; BOOLEAN booleanValue
newBoolean 0(Z)Lorg/apache/jackrabbit/oak/api/PropertyValue; (C)Ljava/lang/StringBuilder; get bindVariable O(Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/BindVariableValueImpl; DATE newDate A(Ljava/lang/String;)Lorg/apache/jackrabbit/oak/api/PropertyValue; convert ?(Lorg/apache/jackrabbit/oak/api/PropertyValue;ILorg/apache/jackrabbit/oak/namepath/NamePathMapper;)Lorg/apache/jackrabbit/oak/api/PropertyValue; javax/jcr/PropertyType
nameFromValue (I)Ljava/lang/String;
descending l(Lorg/apache/jackrabbit/oak/query/ast/DynamicOperandImpl;)Lorg/apache/jackrabbit/oak/query/ast/OrderingImpl; ascending size toArray (([Ljava/lang/Object;)[Ljava/lang/Object; h(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/apache/jackrabbit/oak/query/ast/ColumnImpl; values ()Ljava/util/Collection; java/util/Collection getWildcardColumns ()Ljava/lang/Iterable; java/lang/Iterable
getJcrName getChars (II[CI)V java/lang/Character isJavaIdentifierPart (C)Z substring (II)Ljava/lang/String; newString org/slf4j/Logger isTraceEnabled trace java/lang/Math min (II)I max trim indexOf (I)I replace D(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; org/slf4j/LoggerFactory getLogger %(Ljava/lang/Class;)Lorg/slf4j/Logger; !RT ( WX YZ [ \ ]Z [ ^ _Z [ ` aZ [ b cZ [ d eZ [ f gZ [ h iZ [ j kZ [ l mZ [ n oZ [ p qZ [ ` rZ [ b sZ [ d tZ [ f uZ [ v wZ [ x yZ [ z {Z [ | }~ ? ?? ?? ?Z ?Z ?? ?? ?? ?? ? ? ?? ? ? ?? ? ? ?? ?? ?? ?? ?? ?? ?? ?? 5 ?? ? ? A*? *? ? *? *? *? *? Y? ? *+?
*,? ? ?
*-? ? ? ? ? *
v _ b c d f % w * x 5 y @ z? * A?? A?? A}~ A?? ?? ? N *+? *? ? *? Y? ? *? Y? ? *? >6*? ? >*? ? 6*? :*? ? ? '*? 6*? :? Y*? ? :???:*!? ? *"? #*? $:*? %? &?
*'? (?? ) ? * ? + +? ,? - ? B? . ? 8:? 0Y? 1Y? 2*? 3? 45? 4? 6? 4? 7? 8:? 9W?? ? ? ? / ? ? # ? ? ? ? $ ? ( ? - ? 6 ? 8 ? A ? D ? J ? S ? V ? ^ ? d ? w ? z ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? p ^ ?? d ?? ?? ? 3?? ?? ?? ?? * ??? - ??? J ??? } ??? ? ? 8? ?#? ?r?4? 0 ?? ? ; *+? :? ? ?? ?? ?? ? 0 ?? ? ; p*;? #*