IOS рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдЯреЗрдирд┐рдпрдо рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рдирд╛

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЯрд╛рдЗрдЯреЗрдирд┐рдпрдо рдХреЗ рд▓рд┐рдП рдПрдХ рджреЗрд╢реА рдЖрдИрдУрдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЯрд╛рдЗрдЯреЗрдирд┐рдпрдо рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рддреЗ рд╕рдордп рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдирд╛ рд╣реИ, рддрд╛рдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЖрдк рдЯрд╛рдЗрдЯреЗрдирд┐рдпрдо рдХреА рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ / рддреЗрдЬ рдХрд░рдиреЗ рд╕реЗ рдбрд░рддреЗ рдирд╣реАрдВ рд╣реИрдВред рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдкреГрд╖реНрдареЛрдВ рдХреЗ рдКрдкрд░ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдУрд╡рд░рд▓реЗ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдкреАрдбреАрдПрдл рдлрд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред

рд╕реНрд░реЛрдд рдХреЛрдб - рдХреМрди рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдЯрд╛рдЗрдЯреЗрдирд┐рдпрдо рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлреЛрдирдЧреИрдк рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдХреЗрд╡рд▓ WebView рдореЗрдВ html5 рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рдкреЗрдЯрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдиреЛрдбрдЬреЗрдПрд╕ рд╕рд░реНрд╡рд░ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдпрд╣ рд╕рднреА рдШреВрдорддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреАрдбреАрдПрдл рдХреЗ рд╕рд╛рде рдЗрддрдирд╛ рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реИред рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП, pdf.js рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореЛрдмрд╛рдЗрд▓ рд╕рдлрд╛рд░реА рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЪрд▓ рд░рд╣реА рд╣реИ, рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рд╡рд╣рд╛рдБ jspdf рд╣реИ , рдЬрд╣рд╛рдВ рдЦрд░рд╛рдм рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрдореЛрд░реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓ рд░реИрдо рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдФрд░ рдлрд┐рд░ рдХреЗрд╡рд▓ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдУрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрд╡реЗрджрди рдХреЛ рдорд╛рд░рддрд╛ рд╣реИред
рддреЛ, рдХрдЯреМрддреА рдХреЗ рддрд╣рдд, рдЖрд╡реЗрджрди рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╣реИред

рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдЯреЗрдирд┐рдпрдо рдПрд╕рдбреАрдХреЗ 3 рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реИред рдЕрдкрдиреЗ MacOS рдкрд░ рдЯрд╛рдЗрдЯреЗрдирд┐рдпрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, "рдЯрд╛рдЗрдЯреЗрдирд┐рдпрдо" рдХрдорд╛рдВрдб рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛, рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдФрд░ рд╣рдореЗрдВ "~ / рд▓рд╛рдЗрдмреНрд░реЗрд░реА / рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рд╕рдкреЛрд░реНрдЯ / рдЯрд╛рдЗрдЯреЗрдирд┐рдпрдо / рдореЛрдмрд╛рдЗрд▓ / рдкреАрдбреАрдПрдХреНрд╕ / рдУрдПрдХреНрд╕рдПрдХреНрд╕ / [рдПрд╕рдбреАрдХреЗ рд╕рдВрд╕реНрдХрд░рдг] /" рд╕реЗ "рдЯрд╛рдЗрдЯреЗрдирд┐рдпрдо" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдПрд▓рд┐рдпрд╛рд╕ рдЬреЛрдбрд╝реЗрдВред

$ cat ~/.bash_profile alias ios_builder="/Users/peinguin/Library/Application\ Support/Titanium/mobilesdk/osx/3.1.3.GA/iphone/builder.py" alias titanium.py="/Users/peinguin/Library/Application\ Support/Titanium/mobilesdk/osx/3.1.3.GA/titanium.py" 

рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрдВрдХрд╛рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

 $ titanium.py create --platform=iphone --type=module --dir=/Volumes/yanpix_projects --name=pdfsaver --id=ti.pdfsaver 

рдЖрдк рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 $ ./build.py 

рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдпрд╣ рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЖрдк рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдЪрд┐рд╣реНрдирд┐рдд рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдкреАрдбреАрдПрдл рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдФрд░ рдХреИрдирд╡рд╛рд╕ рдерд╛ред рдХреБрдЫ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рдкреАрдбреАрдПрдл рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдкрд╣рд▓реЗ рдкреГрд╖реНрда рдХреЗ рдердВрдмрдиреЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ "рдЙрджрд╛рд╣рд░рдг / app.js" рдореЗрдВ рдмрддрд╛рдПрдВред

 // TODO: write your module tests here var pdfsaver = require('ti.pdfsaver'); Ti.API.info("module is => " + pdfsaver); var old = Titanium.Filesystem.getFile(Titanium.Filesystem.getTempDirectory(),'test.pdf'); var newpdf = Titanium.Filesystem.getFile(Titanium.Filesystem.getTempDirectory(),'export.pdf'); pdfsaver.saveInExportFileWithDrawings( old.resolve(), newpdf.resolve(), { 1: 'data:image/png;base64,[base64 image representation], 4: 'data:image/png;base64,[base64 image representation]' }, 1 ); var jpeg = Titanium.Filesystem.getFile(Titanium.Filesystem.getTempDirectory(),'export.jpeg'); pdfsaver.saveThumbnail( newpdf.resolve(), jpeg.resolve() ); 


рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЖрдк "рд╕рдВрд╕рд╛рдзрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛" рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ "рдЯреЗрдВрдк рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА" (~ / рд▓рд╛рдЗрдмреНрд░реЗрд░реА / рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдкреЛрд░реНрдЯ / рдЖрдИрдлреЛрди рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ / 5.1 / рдПрдкреНрд▓реАрдХреЗрд╢рди / [рдРрдк рдЖрдИрдбреА] / tmp) рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

рдпрджрд┐ рдЖрдк рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдорд╛рдирддреЗ рд╣реИрдВ, рддреЛ "TiPdfsaverModuleAssets.h" рдФрд░ "TiPdfsaverModuleAssets.m" рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ - рд╡реЗ рд╕рднреА рд╕рдорд╛рди рд╣реИрдВред рдЖрдкрдХрд╛ рдХреЛрдб "TiPdfsaverModule.m" рдФрд░, рддрджрдиреБрд╕рд╛рд░, "TiPdfsaverModule.h" рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдБ рдореЗрд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХреЛрдб рд╣реИ:

 #pragma Public APIs -(void)saveThumbnail:(id)args{ NSString *pdf = [args objectAtIndex:0]; NSString *jpeg = [args objectAtIndex:1]; CFURLRef url = CFURLCreateWithFileSystemPath (NULL, (CFStringRef)pdf, kCFURLPOSIXPathStyle, 0); CGPDFDocumentRef templateDocument = CGPDFDocumentCreateWithURL(url); CFRelease(url); CGPDFPageRef templatePage = CGPDFDocumentGetPage(templateDocument, 1); // get the first page CGRect templatePageBounds = CGPDFPageGetBoxRect(templatePage, kCGPDFCropBox); UIGraphicsBeginImageContext(templatePageBounds.size); CGContextRef contextRef = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(contextRef, 0.0, templatePageBounds.size.height); CGContextScaleCTM(contextRef, 1.0, -1.0); CGContextDrawPDFPage(contextRef, templatePage); UIImage *imageToReturn = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CGPDFDocumentRelease(templateDocument); [UIImageJPEGRepresentation(imageToReturn, 1.0) writeToFile:jpeg atomically:YES]; } -(void)saveInExportFileWithDrawings:(id)args{ NSString *fresh = [args objectAtIndex:0]; NSString *exportpath = [args objectAtIndex:1]; NSDictionary *drawings = [args objectAtIndex:2]; NSNumber *all = [args objectAtIndex:3]; CFURLRef url = CFURLCreateWithFileSystemPath (NULL, (CFStringRef)fresh, kCFURLPOSIXPathStyle, 0); CGPDFDocumentRef templateDocument = CGPDFDocumentCreateWithURL(url); CFRelease(url); size_t count = CGPDFDocumentGetNumberOfPages(templateDocument); UIGraphicsBeginPDFContextToFile(exportpath, CGRectMake(0, 0, 612, 792), nil); for (int pageNumber = 1; pageNumber <= count; pageNumber++) { id image = [drawings objectForKey:[NSString stringWithFormat:@"%d",pageNumber ]]; if(image == nil && [all boolValue] == NO){ continue; } CGPDFPageRef templatePage = CGPDFDocumentGetPage(templateDocument, pageNumber); CGRect templatePageBounds = CGPDFPageGetBoxRect(templatePage, kCGPDFCropBox); UIGraphicsBeginPDFPageWithInfo(templatePageBounds, nil); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(context, 0.0, templatePageBounds.size.height); CGContextScaleCTM(context, 1.0, -1.0); CGContextDrawPDFPage(context, templatePage); CGContextTranslateCTM(context, 0.0, templatePageBounds.size.height); CGContextScaleCTM(context, 1.0, -1.0); if(image != nil){ NSURL *url = [NSURL URLWithString:image]; NSData *imageData = [NSData dataWithContentsOfURL:url]; UIImage *ret = [UIImage imageWithData:imageData]; [ret drawInRect:CGRectMake(0, 0, templatePageBounds.size.width, templatePageBounds.size.height)]; } } CGPDFDocumentRelease(templateDocument); UIGraphicsEndPDFContext(); } 

рдЖрдк рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдЬреИрд╕реЗ рдЪрд╛рд╣реЗрдВ рдЙрддрдиреЗ рддрд░реНрдХ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ "objectAtIndex" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдм рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

 $ titanium.py run 

рдЬрдм рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред "Build.py" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдПрдБ рдФрд░ рдЬрд╝рд┐рдк рдлрд╝рд╛рдЗрд▓, рдЬреЛ рдореЙрдбреНрдпреВрд▓ рдХреА рдЬрдбрд╝ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдЯ рдкрд░ рдЕрдирдЬрд╝рд┐рдк рдХрд░реЗрдВред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ "tiapp.xml" рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЯреИрдЧ "рдореЙрдбреНрдпреВрд▓" рдХреЗ рд▓рд┐рдП рдЯреИрдЧ "рдореЙрдбреНрдпреВрд▓" рднреА рдЬреЛрдбрд╝реЗрдВред

 <modules> <module platform="iphone">ti.pdfsaver</module> </modules> 

рд▓реЗрдЦ рдореЗрдВ рдХреЗрд╡рд▓ рдореВрд▓ рдмрд╛рддреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рд╣реИред рд╡реНрдпреВ рдФрд░ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдирд╣реАрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдлреА рдЙрджрд╛рд╕ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЧреНрд░рд╛рд╣рдХ рдРрд╕реА рдЪреАрдЬ рдорд╛рдВрдЧрддрд╛ рд╣реИ рдЬреЛ рдЬреЗрдПрд╕ рдкрд░ рдХрд╛рдлреА рдзреАрдореА рд╣реЛ рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рд╣реИред рдЬреЗрдПрд╕ рдкрд░, рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдЖрд╡реЗрджрди рдХреЛ рд╕реНрд╡рдпрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрд╡реЗрджрди рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдореВрд▓ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдордп рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рдПрдВрдЧреЗ, рдЬреЛ рдЕрдВрдд рдореЗрдВ, рдЯрд╛рдЗрдЯреЗрдирд┐рдпрдо рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрдВрдЧреЗред

Source: https://habr.com/ru/post/In201354/


All Articles