/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠO sc ar ĠDavid ĠG all on ĠRos ero Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ* Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġcom . osc arg 7 9 8 . ami ib ow iki . nf cre ader . repository Ċ Ċ import Ġandroid . n fc . Tag Ċ import Ġcom . osc arg 7 9 8 . ami ib ow iki . core . extensions . get Or Transform Ċ import Ġcom . osc arg 7 9 8 . ami ib ow iki . core . models . Am ii bo Identifier Ċ import Ġcom . osc arg 7 9 8 . ami ib ow iki . nf cre ader . errors . Invalid Tag DataException Ċ import Ġcom . osc arg 7 9 8 . ami ib ow iki . nf cre ader . errors . Unknown Read Error Ċ import Ġcom . osc arg 7 9 8 . ami ib ow iki . nf cre ader . errors . Wrong Page FormatException Ċ import Ġcom . osc arg 7 9 8 . ami ib ow iki . nf cre ader . utils . Array Cl oner Ċ import Ġcom . osc arg 7 9 8 . ami ib ow iki . nf cre ader . utils . Byte Wrapper Ċ import Ġcom . osc arg 7 9 8 . ami ib ow iki . nf cre ader . utils . Tag Tech Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . experimental . and Ċ Ċ class ĠN FC Reader Repository Impl Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġtag Tech : ĠTag Tech , ĊĠĠĠ Ġprivate Ġval Ġarray Cl oner : ĠArray Cl oner , ĊĠĠĠ Ġprivate Ġval Ġbyte Wrapper : ĠByte Wrapper Ċ ) Ġ: ĠN FC Reader Repository Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget am ii bo Identifier From Tag ( tag : ĠTag ): ĠAm ii bo Identifier Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Tech . init Tech ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġam ii bo Data Ġ= Ġread From Tech ( tag Tech ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠgetId From Data ( am ii bo Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Tag Tech () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAm ii bo Identifier ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Head ( id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Tail ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. get Or Transform Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Tag Tech () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnknown Read Error ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose Tag Tech () Ġ= Ġtag Tech . close () ĊĊĠĠĠ Ġprivate Ġfun Ġread From Tech ( tag Tech : ĠTag Tech ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtag Data Ġ= ĠByteArray ( TAG _ FILE _ SIZE ) ĊĠĠĠĠĠĠĠ Ġval Ġpage Count : ĠInt Ġ= ĠTAG _ FILE _ SIZE Ġ/ ĠPAGE _ SIZE ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= ĠINIT _ POSITION ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġpage Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpages Ġ= Ġtag Tech . read Pages ( i ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Page Available ( pages )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠWrong Page FormatException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( pages Ġ!= Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdestination Index : ĠInt Ġ= Ġi Ġ* ĠPAGE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdestination Length Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( B UL K _ READ _ PAGE _ COUNT Ġ* ĠPAGE _ SIZE ). coerce At Most ( tag Data . size Ġ- Ġdestination Index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray Cl oner . copy ( pages , ĠINIT _ POSITION , Ġtag Data , Ġdestination Index , Ġdestination Length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= ĠB UL K _ READ _ PAGE _ COUNT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtag Data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbytes To Hex ( bytes : ĠByteArray ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhex Chars Ġ= ĠChar Array ( bytes . size Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġbytes . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv : ĠInt Ġ= Ġ( bytes [ j ] Ġand Ġ 0 xFF . to Byte ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhex Chars [ j Ġ* Ġ 2 ] Ġ= Ġhex Array [ v Ġ ush r Ġ 4 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhex Chars [ j Ġ* Ġ 2 Ġ+ Ġ 1 ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhex Array [ v Ġand Ġ 0 x 0 F ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠString ( hex Chars ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetId From Data ( data : ĠByteArray ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data . size Ġ< ĠTAG _ FILE _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Tag DataException () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġam ii bo Id Ġ= ĠByteArray ( AM I IB O _ ID _ SIZE ) ĊĊĠĠĠĠĠĠĠ Ġarray Cl oner . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA MI IB O _ ID _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġam ii bo Id , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠINIT _ POSITION , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġam ii bo Id . size ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbyte Wrapper . wrap ( am ii bo Id ). long ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Tail ( id : ĠLong ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHEAD _ TAIL _ STRING _ FORMAT _ VALUE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( id Ġand ĠT AIL _ MASK Ġshr ĠT AIL _ BIT SHIFT ). toInt () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Head ( id : ĠLong ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHEAD _ TAIL _ STRING _ FORMAT _ VALUE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( id Ġand ĠHEAD _ MASK Ġshr ĠHEAD _ BIT SHIFT ). toInt () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Page Available ( pages : ĠByteArray ?) Ġ= ĊĠĠĠĠĠĠĠ Ġpages Ġ== Ġnull Ġ|| Ġpages . size Ġ!= ĠPAGE _ SIZE Ġ* ĠB UL K _ READ _ PAGE _ COUNT Ċ } Ċ Ċ private Ġval Ġhex Array Ġ= Ġ" 0 1 2 3 4 5 6 7 8 9 ABCDEF ". toCharArray () Ċ private Ġconst Ġval ĠEMPTY Ġ= Ġ"" Ċ private Ġconst Ġval ĠINIT _ POSITION Ġ= Ġ 0 Ċ private Ġconst Ġval ĠA MI IB O _ ID _ OFFSET Ġ= Ġ 0 x 5 4 Ċ private Ġconst Ġval ĠHEAD _ TAIL _ STRING _ FORMAT _ VALUE Ġ= Ġ"% 0 8 x " Ċ private Ġconst Ġval ĠT AIL _ BIT SHIFT Ġ= Ġ 4 Ġ* Ġ 0 Ċ private Ġconst Ġval ĠT AIL _ MASK Ġ= Ġ 0 x 0 0 0 0 0 0 0 0 FFFFFFFF L Ċ private Ġconst Ġval ĠHEAD _ MASK Ġ= Ġ- 0 x 1 0 0 0 0 0 0 0 0 L Ċ private Ġconst Ġval ĠHEAD _ BIT SHIFT Ġ= Ġ 4 Ġ* Ġ 8 Ċ private Ġconst Ġval ĠA MI IB O _ ID _ SIZE Ġ= Ġ 8 Ċ private Ġconst Ġval ĠTAG _ FILE _ SIZE Ġ= Ġ 5 3 2 Ċ private Ġconst Ġval ĠPAGE _ SIZE Ġ= Ġ 4 Ċ private Ġconst Ġval ĠB UL K _ READ _ PAGE _ COUNT Ġ= Ġ 4 Ċ