반응형
Introduction

jQuery 공부를 시작하기에 앞서 툴을 세팅합시다.. -_-v

Eclipse Galileo + Apatna 를 사용하여 jQuery Code Assist를 사용해 봅시다.

http://www.aptana.org



Installation Plugin

Help - Install New Software 클릭




http://download.aptana.org/tools/studio/plugin/install/studio 를 등록 후 Aptana Studio 를 선택합니다.




Next 클릭




라이센스 수락 후 Finish 클릭




경고가 나오는군요... 깔끔하게 패스!




이클리스를 재시작 합니다.




파이어폭스가 필요하다네요...





Install Aptana Features

Aptana 플러그인을 설치했다고 바로 되는게 아닙니다.

jQuery 를 지원하기 위해 플러그인 설치해야 합니다.

도구 모음에 보면 Aptana Studio 관련 아이콘이 몇 개 생겼습니다.

Install Aptna Features 를 클릭합니다.




여러가지 라이브러리를 많이 지원하네요!

Ajax Libraries - jQuery Support 를 선택 후 Install 버튼을 클릭합니다.




플러그인 설치 화면으로 넘어갑니다.

Ajax Frameworks - Aptana Support for jQuery 선택 후 Next 버튼을 클릭합니다.




Finish 클릭




플러그인 설치 - 이클립스 재시작 후 WIndow - Preferences 클릭




Aptana - Editors - JavaScript - Code Assist 메뉴에서 jQuery를 선택합니다.




js 파일을 편집하면 편집기가 Aptana 편집기인 것을 확인할 수 있습니다.

잘 되는군요 ㅎㅎㅎ




만약 편집기가 설치 전의 그냥 보통 편집기일 경우 설정에서 변경해줘야 합니다.




사용해본 결과(jQuery, ExtJS) 생각보다는 그렇게 잘 Code Assist 가 되지는 않는것 같네요.. 특히 ExtJs... ㅠ_ㅠ
반응형

'JavaScript > jQuery' 카테고리의 다른 글

jQuery UI Datepicker IE 버그 해결...  (1) 2011.08.26
//

게시판 1.0

Posted at 2010. 3. 11. 13:04 | Posted in Mini Project
반응형
2011.01.24 - 제목, 작성자에 html 태그 넣으면 이상하던거 수정 -_-

Introduction


http://antop.nerv.kr/board_v1/list.do

전에 php로 일할때는 게시판을 직접 만들어서 홈페이지를 만들었었는데

JAVA 로 갈아타면서 제대로된 게시판을 만들어보질 못했네요...

그래서 열심히 게시판을 하나 만들어 봤습니다.

아래의 기능들을 사용했습니다.

JSP Standard Tag Library (JSTL)
Strtus 1.3.10 (GA)
Hibernate 3.3.2 (GA)
json-taglib
json_parse.js
SWFUpload 2.2.0.1
SmartEditor Basic 0.3.17
Google Kaptcha 2.3
Lightbox JS 2.0

알고리즘은 반업데이트 방식을 사용했습니다.



알고있는 버그(에러) 몇개 있지만 차차 고치도록 하고.... 일단 개시!!!!!! ㄷㄷ;;

에러 많아 잡아주세용~






Version

1.0.0
 - 게시판 완성


1.5.0 (예정)
 - 다중 게시판으로 변경
 - 댓글(comment) 구현

2.0.0 (예정)
 - javascript 부분 jQuery로 교체
 - 게시판을 관리하는 관리자 구현
 - swfupload 개선

3.0.0 (예정)
 - jQuery를 이용한 풀 AJAX 구현



Table Structure





Flowchart

아주 아주 간략한 흐름을 그려봤습니다. 초큼 상세하게 할려고 했는데... 포기 ㅠ_ㅠ




반응형

'Mini Project' 카테고리의 다른 글

Proftpd Manager  (0) 2012.12.10
게시판 2.0  (5) 2011.07.27
Sudoku  (0) 2011.06.09
간단한 JAVA 실행기(?)  (1) 2011.03.21
Forecast Repository  (8) 2010.11.30
Sales History API  (2) 2010.05.27
Order Entry API  (0) 2010.05.13
Human Resources API  (0) 2010.05.10
비밀번호 생성기(Generate Password)  (1) 2010.02.10
Weather History API  (2) 2010.01.18
//

Chapter C - Unit Testing

Posted at 2010. 3. 2. 17:33 | Posted in Oracle Solution/PO Processing
반응형
Introduction

SOA composite 레벨에서 테스트를 할 수 있습니다.

아래 4가지 유닛 테스트를 해봅시다.

1. An inbound message for receivePO.
2. A simulation of a callback message returned by as service
3. An assertion to verify the order status at completion
4. An assertion the will always fail for the input we provided in this testcase



Create the Unit Test

프로젝트 - SOA Content - testsuites 에서 마우스 오른쪽 버튼 클릭 후 Create Test Suite 클릭




이름은 logic Test로 입력




생성될 파일 이름을 TestDelivery로 입력




Exposed Services와 External Reference 영역이 노란색으로 변경되었습니다.

Return to SOA composite diagram 버튼을 누르면 진짜 composite 화면으로 갑니다.





Set the inbound message

reveivePO를 더블클릭하거나 오른쪽 버튼 클릭 후 Create Initiate Messages를 클릭합니다.






request Part의 값을 입력합니다.




receivePO 그림에 파란색 화살표가 생겼습니다.




이번에는 getCreditCarStatus에서 approveLargeOrder로 리턴(return)이 항상 VALID가 나오게 해봅시다.

approveLargeOrder(BPEL Process)와 getCreditCardStatus(Web Service)를 연결하는 선을 더블 클릭합니다.



Emulates 탭에서 Emulate를 추가합니다.




Generate Sample 버튼을 클릭하면 아웃풋의 샘플이 나옵니다.

태그 사이의 값을 VALID로 수정합니다.




OK를 클릭합니다.




선이 변경되었습니다.





Set the assertion for success

routePO 에서 WriteApprovalResults 로 갈 때 상태(status) 내가 지정한 값과 같은지 검증합니다.

routePo(Mediator)와 WriteApprovalResults(File Adapter)를 연결하는 선을 더블 클릭합니다.




Asserts 탭에서 Assert를 추가합니다.




Assert Target 오른쪽의 Browse 버튼을 클릭합니다.




status를 선택합니다.




값을 approved 로 입력합니다.





Set the assertion for failure

이번에는 배송 처리할 때 고객ID(CustomerID)가 내가 지정한 값과 일치하는지 검증해봅시다.

approveLargeOrder와 FullfillementProcess를 연결하는 선을 더블 클릭합니다.




Assert를 추가합니다.




값은 9999를 입력합니다.




OK 클릭





Deploying the Application

배치합니다. 이번에는 혹시몰라 1.1 버젼으로 배치했습니다. ㄷㄷ





Testing the application

프로젝트(POProcessing [1.1]) 선택 후 단위 테스트 탭을 선택 후 실행을 클릭합니다.




테스트 실행 이름을 입력합니다.




테스트 실행의 결과 상태가 "실행 중"이면 테스트 상태 새로 고침을 버튼 클릭해서 상태를 갱신합니다.




상태가 "실패"로 나왔습니다.




아래쪽 검증 세부 정보를 보면 검증 결과가 나온 것을 확인할 수 있습니다.







반응형
//
반응형
Introduction





Surfacing binding properties at the composite level

File Adapter를 직접 수정하지 않고 프로퍼티만 설정해서 생성될 파일의 이름을 바꿔봅시다.

WriteApproval 레퍼런스(File Adapter)를 선택합니다.




레퍼런스(또는 Property Inspector) 패널에서 Binding Properties를 추가합니다.




Name은 FileNamingConvention을 선택하고 Value는 test_%SEQ%.xml을 입력합니다.




composite.xml을 Source 보기로 보면 아래와 같이 프로퍼티가 추가되었습니다.





Generating and validating a deployment plan

여치 계획 파일을 만들어서 배치할 때 여러가지 설정을 적용(변경)한 상태로 배치를 할 수 있습니다.

composite.xml 파일에서 마우스 오른쪽 버튼 클릭 후 Generate Config Plan을 클릭합니다.




생성할 파일 이름을 POProcessing_dev_cfgplan.xml 으로 설정 후 OK 클릭




아래의 위치에 텍스트를 추가합니다.

File Adapter 의 출력 파일명을 변경합니다.




아래의 위치에  텍스트를 추가합니다.

파일을 쓸 디렉토리의 위치를 변경합니다.




모두 저장 후 composite.xml 파일에서 오르쪽 버튼 클릭 후 Validate Config Plan을 클릭합니다.




configuration plan 파일을 선택합니다.




어떻게 바뀔 것인지 로그가 나옵니다.




서버에 디플로이 할때 아래와 같이 플랜 파일을 선택할 수 있습니다.





Testing

테스트를 해보면 주문 파일이 설정 플랜에서 설정한 대로 파일이 생성되는 것을 확인할 수 있습니다.



반응형
//
반응형
Introduction

배송정보를 JMS 큐(Queue)에 등록하겠습니다.

Chapter 1 에서 JMS 관련 서버 설정이 되어있어야 합니다.



Add the JMS adapters

JMS Adapter를 External References 영역에 추가합니다.



Name : JMS_USPS



Oracle Weblogic JMS를 선택합니다.



서버 커넥션을 선택합니다.



Define from operation and schema (specified later)를 선택합니다.



Produce Message를 선택합니다.



Browse... 를 클릭합니다.



demoFulfillmentQueue (queue)를 선택합니다.



JNDI Name : eis/QUeue/demo



browse 버튼을 클릭합니다.



fulfillment.xsd - Fulfillment 를 선택합니다.



Next 클릭



Finish 클릭




위와 같은 방법으로 JMS_UPS, JMS_FedEx를 추가로 만들어줍니다.

다 만든 후 FilfillmentProcess(BPEL Process)와 연결합니다.





Invoke the services from BPEL

FulfillmentProcess(BPEL Process)를 더블 클릭하여 편집합니다.



FulfillmentProcess(Business Rule 액티브) 아래에 Switch 액티브를 추가합니다.



Case를 2개 더 추가합니다.



<case> 부분을 더블 클릭합니다.



General 탭에서 Name은 USPS를 입력합니다.

Expression은 아래와 같이 입력합니다. (빌더를 이용하세요)



두번째 <case> 도 더블 클릭해서 UPS를 입력합니다.



세번째 <case>는  FedEx



<case USPS> 안에 Invoke 액티브를 추가합니다.




추가한 Invoke 액티브와 JMS_USPS 컴포넌트를 연결합니다.



이름은 Invoke_USPS를 입력하고, Input Variables 를 기본으로 추가합니다.



UPSFedEx도 마찬가지로 추가합니다.



Assign 액티브를 <case USPS> 영역 안의 Invoke_USPS 위에 추가합니다.



더블 클릭하여 편집합니다.



General 탭에서 이름을 Assign_USPS로 입력합니다.



Copy Operation을 아래와 같이 추가합니다.

UPSFedEx도 똑같이 추가합니다. (그래도 To는 틀려야겠죠? -_-)



<otherwish> 부분은 삭제합니다.



완성되었습니다.





Deploying and testing the application

배치 후 테스트 해보면 마지막에 JMS로 데이터가 간 것을 확인할 수 있습니다.



WebLogic Console로 접속해서 서비스 - 메시징 - JMS 모듈로 이동합니다.



SOAJMSModule을 클릭합니다.



demoFulfillmentQueue를 클릭합니다.



모니터링 탭에서 SOAJMSModule! demoFulfillmentQueue를 체크 후 메시지 표시를 클릭합니다.



들어온 메세지를 확인합니다.



데이터를 확인합니다.







반응형
//

Chapter 8 - Adding Fulfillment

Posted at 2010. 3. 2. 16:55 | Posted in Oracle Solution/PO Processing
반응형
Introduction

배송을 처리하는 BPEL Process 와 Business Rule 를 추가하여 봅시다.

1000원 이하는 USPS, 1000~5000원은 UPS, 5000원 초과는 FedEx 로 배송 처리합니다.



Add a BPEL Process and a Business Rule


BPEL Process 를 Components 영역에 추가합니다.




Name : FulfillmentProcess
Template: Asynchronous BPEL Process
Service Name : fulfillmentprocess_client
Expose as a SOAP service 체크 해제

Input 오른쪽의 찾기 버튼 클릭




Import 클릭






파일을 불러옵니다.






Fufillment 를 선택합니다.




Output 은 CarrierSelection 를 선택합니다.




Input 과 Output 확인 후 OK 클릭




Business Rule 컴포넌트를 Components 영역에 추가합니다.




Genral 탭에서

Name : FulfillmentRules
Package : fulfillmentrules

Input 을 추가합니다.




Fulfillment를 선택합니다.




이어서 Output을 추가합니다.




CarrierSelection을 선택합니다.



Advanced 탭에서 Service Name에 OracleRulesFulfillment 입력 후 OK를 클릭합니다.



approveLargeOrder와 FulfillmentProcess를 연결합니다.




FulfillmentProcess와 FulfillmentRules를 연결합니다.





Define the Business Rule

FulfillmentRules(Business Rule) 컴포넌트를 더블클릭하여 편집합니다.





왼쪽 메뉴에서 Bucketsets을 클릭합니다.



List of Ranges 를 추가합니다.



아이콘을 더블클릭하여 편집창을 띄웁니다.



Name은 OrderTotal, Data Type는 double 선택. 녹색 플러스 버튼을 클릭하여 아래와 같이 입력합니다.



왼쪽 메뉴에서 Facts를 클릭 한 후, 목록에서 FulfillmentType을 수정합니다.



total의 Bucketset을 OrderTotal로 설정합니다.



왼쪽 메뉴에서 Ruleset_1을 선택 후 Create Decision Table을 클릭합니다.



<insert condition> 부분을 클릭합니다.



<edit condition> 부분을 더블 클릭하고 FulfillmentType.total을 선택합니다.



R1 셀을 클릭 후 small을 선택합니다.



Rule을 추가합니다.



R2 셀에 large,를 선택합니다.

다시 Rule 추가 후 R3 셀에 xtralarge를 선택합니다.



Actions 부분에 Assert를 추가합니다.



assert new를 더블 클릭합니다.




Facts는 CarrierSelection을 선택하고 Parameterized를 체크합니다. 그리고 Always Selected를 체크합니다.

OK를 클릭합니다.



small의 액션에 CarrierValue.UPS를 선택합니다.



large에는 CarrierValue.UPS, xtralarge는 CarrierValue.FED_EX를 선택합니다.





Define the BPEL Process

FulfillmentProcess(BPEL Process)를 더블 클릭해서 편집합니다.



Business Rule
액티브를 추가합니다.



이름은 FulfillmentProcess를 입력, Dictionary는 FilfillmentRules를 선택합니다.

Assign Input Facts 탭에서 Assign을 추가합니다.



아래와 같이 선택합니다.



Assign Output Facts 탭에서 Assign을 생성합니다.





OK를 클릭합니다.





Invoke FulfillmentProcess

approveLargeOrder(BPEL Process를 더블 클릭합니다.



Invoke 액티브를 ManualPOApproval_1이 있는 Switch 액티브 아래에 추가합니다.



추가한 Invoke 액티브와 FufillmentProcess(BPEL Process) 컴포넌트와 연결합니다.

Name : Invoke_Fulfillment

Input Variable을 기본 이름으로 추가합니다.



Transform 액티브를 Invoke_Fulfillment 액티브 위에 추가합니다.



추가한 Transform 액티브를 더블 클릭하여 편집합니다.



Source Variable 은 inputVariablepayload를 선택합니다.



Target Variable은 Invoke_Fulfillment_process_InputVariablepayload를 선택합니다.

Create Mapping 버튼을 클릭합니다.



customerIdorderId를 매핑합니다.



Mathematical Functions - multiply 을 가운데 영역에 추가합니다.

그리고 priceqty를 추가한 multiply과 연결하고, totalmultiply과 연결합니다.



Switch 액티브를 Invoke_Fulfillment 액티브 바로 액티브 아래에 추가합니다.



Sequence 액티브를 Switch 액티브의 <case> 영역 안에 추가합니다.



Transform_1을 추가한 Sequence 안으로 옮깁니다.



Invoke_Fulfillment를 Sequence안 Transform_1 아래로 옮깁니다.



<case>의 조건을 아래와 같이 설정합니다. (XPath Expression Builder 를 이용하세요)



<other wish> 부분은 삭제합니다.





routePO를 더블 클릭하여 수정합니다.



static routing rule을 추가합니다.



Service 클릭



타겟 서비스를 선택합니다.



맵핑을 선택합니다.



맵핑파일을 생성합니다.



아래와 같이 맵핑 합니다.



Mediator 설정에서 FulfillmentProcess로 가는 조건을 추가합니다.





모두 저장합니다~ 완성되었습니다.





Deploying and testing the application

테스트를 해보면 배송 처리가 된 것을 확인할 수 있습니다.







반응형
//

비밀번호 생성기(Generate Password)

Posted at 2010. 2. 10. 14:21 | Posted in Mini Project
반응형
그냥 비밀번호가 필요한데... 혼자 짜내니 계속 비슷한거만 나오고... 해서

영어, 숫자가 섞인 비밀번호를 생성하는 걸 하나 만들어봤습니다. 허접하네용 ㄷㄷ

http://antop.nerv-team.co.kr/genPwd/gen_pwd.jsp

객체지향 정신에 맞춰서 언제든지 갖다 쓸 수 있게 클래스로 하나 만들었습니다.

자리수와 생성 갯수를 지정할 수 있습니다. (지정 해야합니다. ㄷㄷ)

소스는 간단해서 그냥 war 파일로 올려놓을께용 ㅎㅎ


반응형

'Mini Project' 카테고리의 다른 글

Proftpd Manager  (0) 2012.12.10
게시판 2.0  (5) 2011.07.27
Sudoku  (0) 2011.06.09
간단한 JAVA 실행기(?)  (1) 2011.03.21
Forecast Repository  (8) 2010.11.30
Sales History API  (2) 2010.05.27
Order Entry API  (0) 2010.05.13
Human Resources API  (0) 2010.05.10
게시판 1.0  (1) 2010.03.11
Weather History API  (2) 2010.01.18
//

Chapter 7 - Adding Business Rules

Posted at 2010. 2. 10. 13:52 | Posted in Oracle Solution/PO Processing
반응형
Introduction

Business Rule 컴포넌트를 이용하여 5000원이 넘는 주문만 휴먼테스크를 이용해 처리하고 5000~1000의 주문이면 그냥 카드상태만 체크하게 변경해봅시다~



이렇게 규칙(?)을 때로 빼놓으면 나중에 7,500원이 넘는 결제를 휴먼테스크로 처리하고 싶으면 Business Rule 컴포넌트만 변경하면 되지 편하겠네용용~



Adding a Bussiness Rule to POProcessing

비지니스 룰(Business Rule) 컴포넌트를 Components 영역에 드래그 앤 드랍 합니다.



Name : ManualApproval

Input 추가



Import 클릭 - 아래 파일을 임포트(import) 합니다.









price를 선택합니다.



이번에는 Output을 추가 합니다.



discountandshipping 선택



OK 클릭



ManualApproval(Business Rule) 더블클릭



Ruleset_1 에서 Create 버튼 클릭



아래 Rule_1 이 추가 되는데 IF 부분에 <insert test> 클릭



클릭 하면 <operand> == <operand> 가 나오는데 앞의 <operand> 클릭 후 price 선택



== 부분 클릭 후 <= 선택



마지막 오른쪽 <operand> 클릭 후 5000 입력



THEN 아래 부분의 <insert action> 클릭 후 assert new 클릭



assert new <target> 가 생기고 <target> 클릭 후 discountandshipping 선택



<add property> 클릭



Value를 아래 그림과 같이 바꿔 줍니다.



Rule 를 하나 더 추가 합니다.

IF
    price.price < 5000
THEN
    .........





2개의 Rule 만들어졌습니다.



저장 후 Business Rule 편집창을 닫습니다.

approveLargeOrder(BPEL Process)를 더블 클릭해서 편집 합니다.

구조 팔레트(Structure palette) 부분에서 Variables - Process - Variables를 선택합니다.

선택 되어있는 상태에서 + 버튼(Create An Object of The Selected Node Type)을 클릭합니다.



Name: approvalRequired

엘리먼트(Element) 선택 후, 오른쪽의 찾기(Browse) 버튼 클릭



OrderBookingDiscount.xsd - discountandshipping 선택



OK 클릭



Business Rule 액티브를 ManualPOApproval_1 위에 드래그 앤 드랍 합니다.



Name : ApprovalRule
Dictionary : ManualApproval

Assign Input Facts 탭에서 추가(Create) 버튼 클릭



아래와 같이 입력 합니다. (빌더를 이용하셔요~)



Assign Output Facts 탭에서 추가(Create) 버튼 클릭



아래와 같이 선택합니다.



OK 클릭



추가된 ApprovalRule(Business Rule) 아래에 스위치(Switch) 액티브를 추가합니다.



추가된 스위치의 <case> 영역에 시퀀스(Sequence) 액티브를 추가합니다.



ManualPOApproval_1 액티브를 스위치 <case>의 시퀀스 액티브 안으로 옮깁니다.



taskSwitch 도 마찬가지로 이동



<case> 조건을 설정합니다.



Xpath Builder 클릭



bpws:getVariableData('approvalRequired','/ns5:discountandshipping/ns5:approvalRequired') = 'true'



<otherwise> 영역에 Assign 액티브를 추가합니다.



Assign_1 더블 클릭



General 탭에서

Name : AutoApproved



Copy Operation 탭에서 값을 세팅합니다.



'approved' 를 outputVariable - status 에 입력합니다.



OK 클릭



모두 저장합니다.





Deploying and Running the application

주문가격(price * quantity)이 5,000원 이상인 주문을 테스트 해봅시다~

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body xmlns:ns1="http://xmlns.oracle.com/ns/order">
        <ns1:PurchaseOrder>
            <ns1:CustID>1111</ns1:CustID>
            <ns1:ID>1212</ns1:ID>
            <ns1:productName>HD TV</ns1:productName>
            <ns1:itemType>Electronics</ns1:itemType>
            <ns1:price>2250</ns1:price>
            <ns1:quantity>10</ns1:quantity>
            <ns1:status>Initial</ns1:status>
            <ns1:ccType>Mastercard</ns1:ccType>
            <ns1:ccNumber>1234-1234-1234-1234</ns1:ccNumber>
        </ns1:PurchaseOrder>
    </soap:Body>
</soap:Envelope>

ManualPOApproval(Human Task)에서 실행 중 상태입니다.



BPEL Process(approveLargeOrder)를 조금 자세히 보자면 아래와 같습니다.



BPM 작업 목록에서 확인해보면 주문이 하나 올라와있습니다. 승인 처리 해봅시다.



모든 처리가 완료 되었습니다.



Write 된 파일입니다.



1,000 ~ 4,999원의 주문은 그냥 카드 상태만 검사합니다.

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body xmlns:ns1="http://xmlns.oracle.com/ns/order">
        <ns1:PurchaseOrder>
            <ns1:CustID>1111</ns1:CustID>
            <ns1:ID>2222</ns1:ID>
            <ns1:productName>iPod shuffle</ns1:productName>
            <ns1:itemType>Electronics</ns1:itemType>
            <ns1:price>145</ns1:price>
            <ns1:quantity>30</ns1:quantity>
            <ns1:status>Initial</ns1:status>
            <ns1:ccType>Mastercard</ns1:ccType>
            <ns1:ccNumber>1234-1234-1234-1234</ns1:ccNumber>
        </ns1:PurchaseOrder>
    </soap:Body>
</soap:Envelope>

ManualPOApproval(Human Task)을 타지 않았습니다.



Business Rule 이후에 approvalRequired 변수가 false로 갱신되었습니다.



1,000원 미만의 주문은 패스... 직접 해보세요~

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body xmlns:ns1="http://xmlns.oracle.com/ns/order">
        <ns1:PurchaseOrder>
            <ns1:CustID>1111</ns1:CustID>
            <ns1:ID>2121</ns1:ID>
            <ns1:productName>Bluetooth Headset</ns1:productName>
            <ns1:itemType>Electronics</ns1:itemType>
            <ns1:price>49.99</ns1:price>
            <ns1:quantity>1</ns1:quantity>
            <ns1:status>Initial</ns1:status>
            <ns1:ccType>Mastercard</ns1:ccType>
            <ns1:ccNumber>8765-8765-8765-8765</ns1:ccNumber>
        </ns1:PurchaseOrder>
    </soap:Body>
</soap:Envelope>





반응형
//