ARToolKit | Mailing List Archive |
![]() |
From: | Marco P <naspiri@y .......> | Received: | Nov 21, 2007 |
To | artoolkit <artoolkit@l .................> | ||
Subject: | [ARToolKit] artk+ and video capture with openCV | ||
Hi, it's my first mail to the mailing list. I'm working on AR and would want to use Artoolkit+ and OpenCV, but I can't get my marker detected. Here is my test code, if I uncomment the two lines which write and load the frame as an image file, all work well, but without the two lines the marker isn't detected... It seems to me there is an image format problem, but I can't figure what. Can you help me, please? ################################################################# #include "cvcam.h" #include "highgui.h" #include "cv.h" #include <ARToolKitPlus/TrackerSingleMarkerImpl.h> class MyLogger : public ARToolKitPlus::Logger { void artLog(const char* nStr) { printf(nStr); } }; int main() { const bool useBCH = false; const int width = 640, height = 480, bpp = 3, numPixels = width*height*bpp; MyLogger logger; ARToolKitPlus::TrackerSingleMarker *tracker = new ARToolKitPlus::TrackerSingleMarkerImpl<6,6,12, ARToolKitPlus::PIXEL_FORMAT_RGB>(width,height); tracker->setLogger(&logger); tracker->init("Data/LogitechPro4000.dat", 1.0f, 1000.0f); tracker->setPatternWidth(60); tracker->setBorderWidth(useBCH ? 0.125f : 0.250f); tracker->setThreshold(80); tracker->setUndistortionMode(ARToolKitPlus::UNDIST_LUT); tracker->setPoseEstimator(ARToolKitPlus::POSE_ESTIMATOR_RPP); tracker->setMarkerMode(useBCH ? ARToolKitPlus::MARKER_ID_BCH : ARToolKitPlus::MARKER_ID_SIMPLE); IplImage *image; cvNamedWindow("Image", CV_WINDOW_AUTOSIZE); CvCapture* capture = cvCaptureFromCAM( 0 ); if( !capture ) { fprintf( stderr, "ERROR: capture is NULL \n" ); getchar(); return -1; } cvNamedWindow( "Capture", CV_WINDOW_AUTOSIZE ); while( 1 ) { IplImage* frame = cvQueryFrame( capture ); if( !frame ) { fprintf( stderr, "ERROR: frame is null...\n" ); getchar(); break; } cvShowImage( "Capture", frame ); image = cvCloneImage( frame ); //if(!cvSaveImage("immagineTmp.jpg",image)) printf("Could not save\n"); //image = cvLoadImage("immagineTmp.jpg", 1); cvShowImage( "Image", image ); int markerId = tracker->calc((unsigned char *)(image->imageData)); float conf = tracker->getConfidence(); cvReleaseImage(&image); printf("\n\nFound marker %d (confidence %d%%)\n\nPose-Matrix:\n ", markerId, (int(conf*100.0f))); for(int i=0; i<16; i++) printf("%.2f %s", tracker->getModelViewMatrix()[i], (i%4==3)?"\n " : ""); if( (cvWaitKey(10) & 255) == 27 ) { break; } } cvReleaseCapture( &capture ); cvDestroyWindow( "Capture" ); cvDestroyWindow("Image"); return 0; } ################################################################ ___________________________________ L'email della prossima generazione? Puoi averla con la nuova Yahoo! Mail: http://it.docs.yahoo.com/nowyoucan.html -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.hitlabnz.org/pipermail/artoolkit/attachments/20071121/46464210/attachment.html _______________________________________________ ARToolKit mailing list ARToolKit@l ................. http://www.hitlabnz.org/mailman/listinfo.cgi/artoolkit |
From: | Daniel Wagner <daniel@i ...............> | Received: | Nov 21, 2007 |
To | artoolkit <artoolkit@l .................> | ||
Subject: | Re: [ARToolKit] artk+ and video capture with openCV | ||
Hi Marco, My suggestion is to dump the image into a file and use a tool such as Irfanview/Photoshop/etc. to check the image format (look for RAW image file in those tools). The way you configured ARTK+ it should be 640x480 in RGB24 (aka RGB888) format. It doesn't matter if it is RGB or BGR, but the image must not be flipped. Daniel Marco P wrote: > Hi, > it's my first mail to the mailing list. I'm working on AR and would want to use Artoolkit+ and OpenCV, but I can't get my marker detected. > Here is my test code, if I uncomment the two lines which write and load the frame as an image file, all work well, but without the two lines the marker isn't detected... It seems to me there is an image format problem, but I can't figure what. Can you help me, please? > ################################################################# > #include "cvcam.h" > #include "highgui.h" > #include "cv.h" > #include <ARToolKitPlus/TrackerSingleMarkerImpl.h> > > class MyLogger : public ARToolKitPlus::Logger > { > void artLog(const char* nStr) > { > printf(nStr); > } > }; > > int main() > { > const bool useBCH = false; > > const int width = 640, height = 480, bpp = 3, > numPixels = width*height*bpp; > MyLogger logger; > > ARToolKitPlus::TrackerSingleMarker *tracker = new ARToolKitPlus::TrackerSingleMarkerImpl<6,6,12, > ARToolKitPlus::PIXEL_FORMAT_RGB>(width,height); > > tracker->setLogger(&logger); > > tracker->init("Data/LogitechPro4000.dat", 1.0f, 1000.0f); > > tracker->setPatternWidth(60); > > tracker->setBorderWidth(useBCH ? 0.125f : 0.250f); > > tracker->setThreshold(80); > > tracker->setUndistortionMode(ARToolKitPlus::UNDIST_LUT); > > tracker->setPoseEstimator(ARToolKitPlus::POSE_ESTIMATOR_RPP); > > tracker->setMarkerMode(useBCH ? ARToolKitPlus::MARKER_ID_BCH : ARToolKitPlus::MARKER_ID_SIMPLE); > > IplImage *image; > cvNamedWindow("Image", CV_WINDOW_AUTOSIZE); > > CvCapture* capture = cvCaptureFromCAM( 0 ); > if( !capture ) { > fprintf( stderr, "ERROR: capture is NULL \n" ); > getchar(); > return -1; > } > cvNamedWindow( "Capture", CV_WINDOW_AUTOSIZE ); > > while( 1 ) { > IplImage* frame = cvQueryFrame( capture ); > if( !frame ) { > fprintf( stderr, "ERROR: frame is null...\n" ); > getchar(); > break; > } > > cvShowImage( "Capture", frame ); > image = cvCloneImage( frame ); > > //if(!cvSaveImage("immagineTmp.jpg",image)) printf("Could not save\n"); > > //image = cvLoadImage("immagineTmp.jpg", 1); > > cvShowImage( "Image", image ); > > int markerId = tracker->calc((unsigned char *)(image->imageData)); > float conf = tracker->getConfidence(); > > cvReleaseImage(&image); > > printf("\n\nFound marker %d (confidence %d%%)\n\nPose-Matrix:\n ", markerId, (int(conf*100.0f))); > > for(int i=0; i<16; i++) > printf("%.2f %s", tracker->getModelViewMatrix()[i], (i%4==3)?"\n " : ""); > > if( (cvWaitKey(10) & 255) == 27 ) { > break; > } > } > > cvReleaseCapture( &capture ); > cvDestroyWindow( "Capture" ); > cvDestroyWindow("Image"); > > return 0; > } > ################################################################ > > > > > ___________________________________ > L'email della prossima generazione? Puoi averla con la nuova Yahoo! Mail: http://it.docs.yahoo.com/nowyoucan.html > -------------- next part -------------- > An HTML attachment was scrubbed... > URL: http://www.hitlabnz.org/pipermail/artoolkit/attachments/20071121/46464210/attachment.html > _______________________________________________ > ARToolKit mailing list > ARToolKit@l ................. > http://www.hitlabnz.org/mailman/listinfo.cgi/artoolkit > _______________________________________________ ARToolKit mailing list ARToolKit@l ................. http://www.hitlabnz.org/mailman/listinfo.cgi/artoolkit |
From: | Naspiri <naspiri@y .......> | Received: | Nov 21, 2007 |
To | artoolkit <artoolkit@l .................> | ||
Subject: | Re: [ARToolKit] artk+ and video capture with openCV | ||
SGksClRoYW5rIHlvdSBmb3IgeW91ciBzdWdnZXN0aW9uIERhbmllbCwgdGhlIHByb2JsZW0gd2Fz IGZsaXBwaW5nLCBldmVuIGlmIEkgY2FuJ3QgZmlndXJlIGV4YWN0bHkgd2h5Li4uICAKQW55d2F5 LCBoZXJlIGlzIHRoZSB3b3JraW5nIGNvZGUuCkJ5ZQpNYXJjbwojIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIwojaW5jbHVkZSAiY3ZjYW0uaCIKI2luY2x1ZGUgImhpZ2hndWkuaCIK I2luY2x1ZGUgImN2LmgiCiNpbmNsdWRlIDxBUlRvb2xLaXRQbHVzL1RyYWNrZXJTaW5nbGVNYXJr ZXJJbXBsLmg+CmNsYXNzIE15TG9nZ2VyIDogcHVibGljIEFSVG9vbEtpdFBsdXM6OkxvZ2dlcgp7 CnZvaWQgYXJ0TG9nKGNvbnN0IGNoYXIqIG5TdHIpCnsKcHJpbnRmKG5TdHIpOwp9Cn07CmludCBt YWluKCkKewpjb25zdCBib29sIHVzZUJDSCA9IGZhbHNlOwpjb25zdCBpbnQgd2lkdGggPSA2NDAs IGhlaWdodCA9IDQ4MCwgYnBwID0gMywKbnVtUGl4ZWxzID0gd2lkdGgqaGVpZ2h0KmJwcDsKTXlM b2dnZXIgbG9nZ2VyOwpBUlRvb2xLaXRQbHVzOjpUcmFja2VyU2luZ2xlTWFya2VyICp0cmFja2Vy ID0gbmV3IEFSVG9vbEtpdFBsdXM6OlRyYWNrZXJTaW5nbGVNYXJrZXJJbXBsPDYsNiwxMiwKQVJU b29sS2l0UGx1czo6UElYRUxfRk9STUFUX1JHQj4od2lkdGgsaGVpZ2h0KTsKdHJhY2tlci0+c2V0 TG9nZ2VyKCZsb2dnZXIpOwp0cmFja2VyLT5pbml0KCJEYXRhL0xvZ2l0ZWNoUHJvNDAwMC5kYXQi LCAxLjBmLCAxMDAwLjBmKTsKdHJhY2tlci0+c2V0UGF0dGVybldpZHRoKDYwKTsKdHJhY2tlci0+ c2V0Qm9yZGVyV2lkdGgodXNlQkNIID8gMC4xMjVmIDogMC4yNTBmKTsKdHJhY2tlci0+c2V0VGhy ZXNob2xkKDgwKTsKdHJhY2tlci0+c2V0VW5kaXN0b3J0aW9uTW9kZShBUlRvb2xLaXRQbHVzOjpV TkRJU1RfTFVUKTsKdHJhY2tlci0+c2V0UG9zZUVzdGltYXRvcihBUlRvb2xLaXRQbHVzOjpQT1NF X0VTVElNQVRPUl9SUFApOwp0cmFja2VyLT5zZXRNYXJrZXJNb2RlKHVzZUJDSCA/IEFSVG9vbEtp dFBsdXM6Ok1BUktFUl9JRF9CQ0ggOiBBUlRvb2xLaXRQbHVzOjpNQVJLRVJfSURfU0lNUExFKTsK SXBsSW1hZ2UgKmltYWdlOwpjdk5hbWVkV2luZG93KCJDYXB0dXJlIiwgQ1ZfV0lORE9XX0FVVE9T SVpFKTsKQ3ZDYXB0dXJlKiBjYXB0dXJlID0gY3ZDYXB0dXJlRnJvbUNBTSggMCApOwppZiggIWNh cHR1cmUgKSB7CmZwcmludGYoIHN0ZGVyciwgIkVSUk9SOiBjYXB0dXJlIGlzIE5VTEwgXG4iICk7 CmdldGNoYXIoKTsKcmV0dXJuIC0xOwp9CmN2TmFtZWRXaW5kb3coICJDYW0iLCBDVl9XSU5ET1df QVVUT1NJWkUgKTsKd2hpbGUoIDEgKSB7CklwbEltYWdlKiBmcmFtZSA9IGN2UXVlcnlGcmFtZSgg Y2FwdHVyZSApOwppZiggIWZyYW1lICkgewpmcHJpbnRmKCBzdGRlcnIsICJFUlJPUjogZnJhbWUg aXMgbnVsbC4uLlxuIiApOwpnZXRjaGFyKCk7CmJyZWFrOwp9CmN2U2hvd0ltYWdlKCAiQ2FtIiwg ZnJhbWUgKTsKaW1hZ2UgPSBjdkNyZWF0ZUltYWdlKGN2R2V0U2l6ZShmcmFtZSksIDgsIDMpOwpp bWFnZS0+b3JpZ2luID0gZnJhbWUtPm9yaWdpbjsKY3ZGbGlwKGZyYW1lLCBpbWFnZSwgMSk7CmN2 U2hvd0ltYWdlKCAiQ2FwdHVyZSIsIGltYWdlICk7CmludCBtYXJrZXJJZCA9IHRyYWNrZXItPmNh bGMoKHVuc2lnbmVkIGNoYXIgKikoaW1hZ2UtPmltYWdlRGF0YSkpOwpmbG9hdCBjb25mID0gdHJh Y2tlci0+Z2V0Q29uZmlkZW5jZSgpOwpjdlJlbGVhc2VJbWFnZSgmaW1hZ2UpOwpwcmludGYoIlxu XG5Gb3VuZCBtYXJrZXIgJWQgKGNvbmZpZGVuY2UgJWQlJSlcblxuUG9zZS1NYXRyaXg6XG4gIiwg bWFya2VySWQsIChpbnQoY29uZioxMDAuMGYpKSk7CmZvcihpbnQgaT0wOyBpPDE2OyBpKyspCnBy aW50ZigiJS4yZiAlcyIsIHRyYWNrZXItPmdldE1vZGVsVmlld01hdHJpeCgpW2ldLCAoaSU0PT0z KT8iXG4gIiA6ICIiKTsKaWYoIChjdldhaXRLZXkoMTApICYgMjU1KSA9PSAyNyApIHsKYnJlYWs7 Cn0KfQpjdlJlbGVhc2VDYXB0dXJlKCAmY2FwdHVyZSApOwpjdkRlc3Ryb3lXaW5kb3coICJteXdp bmRvdyIgKTsKcmV0dXJuIDA7Cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMK CgotLS0tLSBNZXNzYWdnaW8gb3JpZ2luYWxlIC0tLS0tCkRhOiBEYW5pZWwgV2FnbmVyIDxkYW5p ZWxAaW1zLnR1d2llbi5hYy5hdD4KQTogYXJ0b29sa2l0IDxhcnRvb2xraXRAbGlzdHMuaGl0bGFi bnoub3JnPgpDYzogTWFyY28gUCA8bmFzcGlyaUB5YWhvby5pdD4KSW52aWF0bzogTWVyY29sZWTD rCAyMSBub3ZlbWJyZSAyMDA3LCAxMDoxMDoxMwpPZ2dldHRvOiBSZTogW0FSVG9vbEtpdF0gYXJ0 aysgYW5kIHZpZGVvIGNhcHR1cmUgd2l0aCBvcGVuQ1YKCkhpIE1hcmNvLAoKTXkgc3VnZ2VzdGlv biBpcyB0byBkdW1wIHRoZSBpbWFnZSBpbnRvIGEgZmlsZSBhbmQgdXNlIGEgdG9vbCBzdWNoIGFz CklyZmFudmlldy9QaG90b3Nob3AvZXRjLiB0byBjaGVjayB0aGUgaW1hZ2UgZm9ybWF0IChsb29r IGZvciBSQVcgaW1hZ2UKZmlsZSBpbiB0aG9zZSB0b29scykuIFRoZSB3YXkgeW91IGNvbmZpZ3Vy ZWQgQVJUSysgaXQgc2hvdWxkIGJlIDY0MHg0ODAKaW4gUkdCMjQgKGFrYSBSR0I4ODgpIGZvcm1h dC4gSXQgZG9lc24ndCBtYXR0ZXIgaWYgaXQgaXMgUkdCIG9yIEJHUiwgYnV0CnRoZSBpbWFnZSBt dXN0IG5vdCBiZSBmbGlwcGVkLgoKRGFuaWVsCgoKTWFyY28gUCB3cm90ZToKPiBIaSwKPiBpdCdz IG15IGZpcnN0IG1haWwgdG8gdGhlIG1haWxpbmcgbGlzdC4gSSdtIHdvcmtpbmcgb24gQVIgYW5k IHdvdWxkIHdhbnQgdG8gdXNlIEFydG9vbGtpdCsgYW5kIE9wZW5DViwgYnV0IEkgY2FuJ3QgZ2V0 IG15IG1hcmtlciBkZXRlY3RlZC4KPiBIZXJlIGlzIG15IHRlc3QgY29kZSwgaWYgSSB1bmNvbW1l bnQgdGhlIHR3byBsaW5lcyB3aGljaCB3cml0ZSBhbmQgbG9hZCB0aGUgZnJhbWUgYXMgYW4gaW1h Z2UgZmlsZSwgYWxsIHdvcmsgd2VsbCwgYnV0IHdpdGhvdXQgdGhlIHR3byBsaW5lcyB0aGUgbWFy a2VyIGlzbid0IGRldGVjdGVkLi4uIEl0IHNlZW1zIHRvIG1lIHRoZXJlIGlzIGFuIGltYWdlIGZv cm1hdCBwcm9ibGVtLCBidXQgSSBjYW4ndCBmaWd1cmUgd2hhdC4gQ2FuIHlvdSBoZWxwIG1lLCBw bGVhc2U/Cj4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMKPiAjaW5jbHVkZSAiY3ZjYW0uaCIKPiAjaW5jbHVkZSAiaGlnaGd1 aS5oIgo+ICNpbmNsdWRlICJjdi5oIgo+ICNpbmNsdWRlIDxBUlRvb2xLaXRQbHVzL1RyYWNrZXJT aW5nbGVNYXJrZXJJbXBsLmg+Cj4KPiBjbGFzcyBNeUxvZ2dlciA6IHB1YmxpYyBBUlRvb2xLaXRQ bHVzOjpMb2dnZXIKPiB7Cj4gICAgdm9pZCBhcnRMb2coY29uc3QgY2hhciogblN0cikKPiAgICB7 Cj4gICAgICAgIHByaW50ZihuU3RyKTsKPiAgICB9Cj4gfTsKPgo+IGludCBtYWluKCkKPiB7Cj4g ICAgY29uc3QgYm9vbCAgICB1c2VCQ0ggPSBmYWxzZTsKPgo+ICAgIGNvbnN0IGludCAgICB3aWR0 aCA9IDY0MCwgaGVpZ2h0ID0gNDgwLCBicHAgPSAzLAo+ICAgICAgICAgICAgICAgICAgbnVtUGl4 ZWxzID0gd2lkdGgqaGVpZ2h0KmJwcDsKPiAgICBNeUxvZ2dlciAgICAgIGxvZ2dlcjsKPgo+ICAg IEFSVG9vbEtpdFBsdXM6OlRyYWNrZXJTaW5nbGVNYXJrZXIgKnRyYWNrZXIgPSBuZXcgQVJUb29s S2l0UGx1czo6VHJhY2tlclNpbmdsZU1hcmtlckltcGw8Niw2LDEyLAo+ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSVG9vbEtpdFBsdXM6 OlBJWEVMX0ZPUk1BVF9SR0I+KHdpZHRoLGhlaWdodCk7Cj4KPiAgICB0cmFja2VyLT5zZXRMb2dn ZXIoJmxvZ2dlcik7Cj4KPiAgICB0cmFja2VyLT5pbml0KCJEYXRhL0xvZ2l0ZWNoUHJvNDAwMC5k YXQiLCAxLjBmLCAxMDAwLjBmKTsKPgo+ICAgIHRyYWNrZXItPnNldFBhdHRlcm5XaWR0aCg2MCk7 Cj4KPiAgICB0cmFja2VyLT5zZXRCb3JkZXJXaWR0aCh1c2VCQ0ggPyAwLjEyNWYgOiAwLjI1MGYp Owo+Cj4gICAgdHJhY2tlci0+c2V0VGhyZXNob2xkKDgwKTsKPgo+ICAgIHRyYWNrZXItPnNldFVu ZGlzdG9ydGlvbk1vZGUoQVJUb29sS2l0UGx1czo6VU5ESVNUX0xVVCk7Cj4KPiAgICB0cmFja2Vy LT5zZXRQb3NlRXN0aW1hdG9yKEFSVG9vbEtpdFBsdXM6OlBPU0VfRVNUSU1BVE9SX1JQUCk7Cj4K PiAgICB0cmFja2VyLT5zZXRNYXJrZXJNb2RlKHVzZUJDSCA/IEFSVG9vbEtpdFBsdXM6Ok1BUktF Ul9JRF9CQ0ggOiBBUlRvb2xLaXRQbHVzOjpNQVJLRVJfSURfU0lNUExFKTsKPgo+ICAgIElwbElt YWdlICppbWFnZTsKPiAgICBjdk5hbWVkV2luZG93KCJJbWFnZSIsIENWX1dJTkRPV19BVVRPU0la RSk7Cj4KPiAgICBDdkNhcHR1cmUqIGNhcHR1cmUgPSBjdkNhcHR1cmVGcm9tQ0FNKCAwICk7Cj4g ICAgaWYoICFjYXB0dXJlICkgewo+ICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJFUlJPUjogY2Fw dHVyZSBpcyBOVUxMIFxuIiApOwo+ICAgICAgICBnZXRjaGFyKCk7Cj4gICAgICAgIHJldHVybiAt MTsKPiAgICB9Cj4gICAgY3ZOYW1lZFdpbmRvdyggIkNhcHR1cmUiLCBDVl9XSU5ET1dfQVVUT1NJ WkUgKTsKPgo+ICAgIHdoaWxlKCAxICkgewo+ICAgICAgICBJcGxJbWFnZSogZnJhbWUgPSBjdlF1 ZXJ5RnJhbWUoIGNhcHR1cmUgKTsKPiAgICAgICAgaWYoICFmcmFtZSApIHsKPiAgICAgICAgICBm cHJpbnRmKCBzdGRlcnIsICJFUlJPUjogZnJhbWUgaXMgbnVsbC4uLlxuIiApOwo+ICAgICAgICAg IGdldGNoYXIoKTsKPiAgICAgICAgICBicmVhazsKPiAgICAgICAgfQo+Cj4gICAgICAgIGN2U2hv d0ltYWdlKCAiQ2FwdHVyZSIsIGZyYW1lICk7Cj4gICAgICAgIGltYWdlID0gY3ZDbG9uZUltYWdl KCBmcmFtZSApOwo+Cj4gICAgICAgIC8vaWYoIWN2U2F2ZUltYWdlKCJpbW1hZ2luZVRtcC5qcGci LGltYWdlKSkgcHJpbnRmKCJDb3VsZCBub3Qgc2F2ZVxuIik7Cj4gICAgICAgIAo+ICAgICAgICAv L2ltYWdlID0gY3ZMb2FkSW1hZ2UoImltbWFnaW5lVG1wLmpwZyIsIDEpOwo+Cj4gICAgICAgIGN2 U2hvd0ltYWdlKCAiSW1hZ2UiLCBpbWFnZSApOwo+Cj4gICAgICAgIGludCBtYXJrZXJJZCA9IHRy YWNrZXItPmNhbGMoKHVuc2lnbmVkIGNoYXIgKikoaW1hZ2UtPmltYWdlRGF0YSkpOwo+ICAgICAg ICBmbG9hdCBjb25mID0gdHJhY2tlci0+Z2V0Q29uZmlkZW5jZSgpOwo+Cj4gICAgICAgIGN2UmVs ZWFzZUltYWdlKCZpbWFnZSk7Cj4KPiAgICAgICAgcHJpbnRmKCJcblxuRm91bmQgbWFya2VyICVk ICAoY29uZmlkZW5jZSAlZCUlKVxuXG5Qb3NlLU1hdHJpeDpcbiAgIiwgbWFya2VySWQsIChpbnQo Y29uZioxMDAuMGYpKSk7Cj4KPiAgICAgICAgZm9yKGludCBpPTA7IGk8MTY7IGkrKykKPiAgICAg ICAgICAgIHByaW50ZigiJS4yZiAgJXMiLCB0cmFja2VyLT5nZXRNb2RlbFZpZXdNYXRyaXgoKVtp XSwgKGklND09Myk/IlxuICAiIDogIiIpOwo+Cj4gICAgICAgIGlmKCAoY3ZXYWl0S2V5KDEwKSAm IDI1NSkgPT0gMjcgKSB7Cj4gICAgICAgICAgICBicmVhazsKPiAgICAgICAgfQo+ICAgIH0KPgo+ ICAgIGN2UmVsZWFzZUNhcHR1cmUoICZjYXB0dXJlICk7Cj4gICAgY3ZEZXN0cm95V2luZG93KCAi Q2FwdHVyZSIgKTsKPiAgICBjdkRlc3Ryb3lXaW5kb3coIkltYWdlIik7Cj4KPiAgICByZXR1cm4g MDsKPiB9Cj4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIwoKCiAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fIApMJ2VtYWlsIGRlbGxhIHByb3NzaW1hIGdlbmVyYXppb25lPyBQdW9pIGF2ZXJsYSBjb24g bGEgbnVvdmEgWWFob28hIE1haWw6IGh0dHA6Ly9pdC5kb2NzLnlhaG9vLmNvbS9ub3d5b3VjYW4u aHRtbAotLS0tLS0tLS0tLS0tLSBuZXh0IHBhcnQgLS0tLS0tLS0tLS0tLS0KQW4gSFRNTCBhdHRh Y2htZW50IHdhcyBzY3J1YmJlZC4uLgpVUkw6IGh0dHA6Ly93d3cuaGl0bGFibnoub3JnL3BpcGVy bWFpbC9hcnRvb2xraXQvYXR0YWNobWVudHMvMjAwNzExMjEvMjk3ZTc1YzIvYXR0YWNobWVudC5o dG1sIApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBUlRv b2xLaXQgbWFpbGluZyBsaXN0CkFSVG9vbEtpdEBsaXN0cy5oaXRsYWJuei5vcmcKaHR0cDovL3d3 dy5oaXRsYWJuei5vcmcvbWFpbG1hbi9saXN0aW5mby5jZ2kvYXJ0b29sa2l0Cg== |