PKOM(݊pyFixedFlatFile/__init__.py"""PyFixedFlatFile""" __version__ = '1.4.0' from pyFixedFlatFile.pyFixedFlatFile import PyFixedFlatFile from pyFixedFlatFile import cnabs PK#g+M#nnpyFixedFlatFile/exceptions.pyclass ParamsException(Exception): """Exception raised when tp, fmt and size values are wrongs""" pass PK\2Mo299"pyFixedFlatFile/pyFixedFlatFile.py"""module to build fixed flat files""" import inspect from pyFixedFlatFile.specs import Spec class PyFixedFlatFile: """implements the logics to build the flat files""" def __init__(self, *args, **kwargs): self.__spec = Spec() self.nl = '\r\n' if kwargs.get('NL') == 'dos' else '\n' @property def spec(self): return self.__spec @property def data(self): """return steps from specs definition""" return self.spec.data def fmt(self, spec, registro): result = "" ident = spec['ident'] size = spec['size'] if ident == 'constant': # o valor que está em size é o valor da constante result = str(size) else: if 'fmt' in spec: resp = spec['fmt'](registro[ident]) elif ident == 'id': resp = registro[ident] if len(resp) != size: raise Exception("The value of id parameter is not equal size! Id value: {}, size value {}. the size must be {}".format( resp, size, len(resp))) elif ident == 'filler': resp = ' ' # o campo será preenchido com espaços em branco else: if ident in registro: resp = registro[ident] else: if 'default' in spec: resp = spec['default'] else: raise Exception( "attribute {} not specified".format(ident)) if 'tp' in spec and spec['tp'] == 'numeric': # Coloca zero(a) a esquerda result = '{:0>{size}}'.format(int(resp), size=size) else: # alinha os dados a esquerda e preenche com espaços em branco a direita result = '{:<{size}}'.format(resp, size=size) if len(result) != size: raise Exception("The length of value returned by function is not equal the size! Value return ed: {}, size value {}. the size must be {}".format( resp, size, len(resp))) return result def eq(self, id): """Setando o identicador da linha""" self.spec.eq(id) def generate(self, registro): s = "" if 'id' in registro and registro['id'] in self.data: reg_spec = self.data[registro['id']] for spec in reg_spec: s += self.fmt(spec, registro) else: raise Exception("Id is not in attributes specification!") return s def generate_all(self, registros): s = "" for registro in registros: row_str = self.generate(registro) + "{}".format(self.nl) s += row_str return s def read(self, file_path): result = [] with open(file_path, 'r') as file_: for line in file_: # get the size of the identifier in self.data # This size will be used to get the identifier in line string line_id_size = len(list(self.data.keys())[0]) line_id = line[:line_id_size] reg_spec = self.data[line_id] position = 0 dict_line = {} for spec in reg_spec: resp, pos = self.fmt_file(spec, line, position, result) dict_line.update(resp) position = pos result.append(dict_line) return result def fmt_file(self, spec, line, position, dict_line): ident = spec['ident'] size = spec['size'] if ident == 'constant': # o valor que está em size é o valor da constante size = len(size) end = position+size param = line[position:end].strip() if 'fmt' in spec: if len(inspect.signature(spec['fmt']).parameters) == 1: param = spec['fmt'](param) else: param = spec['fmt'](param, dict_line) if 'tp' in spec and spec['tp'] == 'numeric': param = int(param) if 'tp' in spec and spec['tp'] == 'float': param = float(param) result = {ident: param} return result, end def to_csv(self, file_to_read, csv_file_name='csv_file'): result = self.read(file_to_read) import csv with open('{}.csv'.format(csv_file_name), 'w', newline='') as csvfile: for row in result: writer = csv.DictWriter(csvfile, fieldnames=row.keys()) writer.writerow(row) def __getattr__(self, class_name): """implementation of builder pattern that turn possible write code like this: builder = PyFixedFlatFile() builder.eq("10") builder.id(2).\ cnpj(14, fmt=lambda v: "{:>14}".format(v)).\ inscricaoEstadual(14, default='').\ """ def builder(size, **kwargs): keys = {'ident': class_name, **kwargs} self.spec.builder(size, **keys) return self return builder PK]2M,0pyFixedFlatFile/specs.py"""Module to build a dict with the information of the attibutes defined in specification""" from pyFixedFlatFile.exceptions import ParamsException class Spec: """create __steps dict with the data defined in specification""" def __init__(self, *args, **kwargs): self.current_id = None # identifier of the line self._spec_data = {} @property def data(self): return self._spec_data def eq(self, id): self.current_id = str(id) def builder(self, size, **kwargs): """Builds the dict with the attributes of the specification. This dict will be used for generate method from PyFixedFlatFile generate linha of the flat file. """ if kwargs['ident'] != 'constant' and not isinstance(size, int): raise ParamsException( "Size must be a int! Error in {} attribute.".format(kwargs['ident'])) if 'tp' in kwargs and kwargs['tp'] not in ('numeric', 'float'): raise ParamsException( "tp value must be only 'numeric'! Error in {} attribute.".format(kwargs['ident'])) if 'fmt' in kwargs and not callable(kwargs['fmt']): raise ParamsException( "fmt value must be only a callable! Error in {} attribute.".format(kwargs['ident'])) specs = {k: v for k, v in kwargs.items()} try: # preciso colocar isso dentro de um trycexcept specs['size'] = int( size) if kwargs['ident'] != 'constant' else size except Exception as e: raise Exception( "size attribute must be int but its value has type {}".format(type(size))) if not self.current_id: raise Exception( "Id of line not especified: You must use 'eq' method of PyFixedFlatFile!") if self.current_id not in self.data: self.data[self.current_id] = [] self.data[self.current_id].append(specs) return PKOME!pyFixedFlatFile/cnabs/__init__.pyfrom pyFixedFlatFile.cnabs.itau import Itau from pyFixedFlatFile.cnabs.bradesco import Bradesco from pyFixedFlatFile.cnabs.santander import SantanderPK}2MST55!pyFixedFlatFile/cnabs/bradesco.py""" BRADESCO EXTRATO DE CONTA CORRENTE Layout de Arquivos – CNAB240 – Versão 5.0 """ from pyFixedFlatFile import PyFixedFlatFile from datetime import datetime class BradescoFlatFile(PyFixedFlatFile): def __init__(self, *args, **kwargs): super(BradescoFlatFile, self).__init__(*args, **kwargs) def read(self, file_path): result = [] with open(file_path, 'r') as file_: for line in file_: line_id = line[7] reg_spec = self.data[line_id] position = 0 dict_line = {} for spec in reg_spec: resp, pos = self.fmt_file(spec, line, position, dict_line) dict_line.update(resp) position = pos result.append(dict_line) return result Bradesco = BradescoFlatFile() # REGISTRO HEADER DE ARQUIVO - TAMANHO DO REGISTRO = 240 Bytes Bradesco.eq('0') (Bradesco .codigo_banco(3, tp='numeric') .codigo_lote(4, tp='numeric') .tipo_registro(1) .vazio1(9) .tipo_inscricao(1) .numero_inscricao(14, tp='numeric') .codigo_convenio(20) .codigo_agencia(5, tp='numeric') .digito_verificador_agencia(1) .numero_conta(12, tp='numeric') .digito_verificador_conta(1) .digito_verificador_conta_agencia(1) .nome_empresa(30) .nome_banco(30) .vazio2(10) .codigo_retorno(1) .data_geracao_arquivo(8, fmt=lambda d: datetime.strptime(d, '%d%m%Y')) .hora_geracao_arquivo(6, fmt=lambda date, data: datetime.strptime(data['data_geracao_arquivo'].strftime('%d%m%Y') + ' ' + date , '%d%m%Y %H%M%S')) .sequencia(6, tp='numeric') .layout(3) .densidade(5) .reservado_banco(20) .reservado_empresa(20) .vazio3(29)) # REGISTRO HEADER LOTE - TAMANHO DO REGISTRO = 240 Bytes Bradesco.eq('1') (Bradesco .codigo_banco(3, tp='numeric') .codigo_lote(4, tp='numeric') .tipo_registro(1) .tipo_operacao(1) .tipo_servico(2, tp='numeric') .forma_lancamento(2, tp='numeric') .layout(3) .vazio1(1) .tipo_inscricao(1) .numero_inscricao(14, tp='numeric') .codigo_convenio(20) .codigo_agencia(5, tp='numeric') .digito_verificador_agencia(1) .numero_conta(12, tp='numeric') .digito_verificador_conta(1) .digito_verificador_conta_agencia(1) .nome_empresa(30) .vazio2(40) .data_inicial(8, fmt=lambda d: datetime.strptime(d, '%d%m%Y')) .valor_inicial(18, fmt=lambda value: value[:16] + '.' + value[16:] , tp='float') .situacao_inicial(1) .status_inicial(1) .tipo_moeda(3) .sequencia_extrato(5, tp='numeric') .vazio3(62)) ## REGISTRO SEGMENTO E - TAMANHO DO REGISTRO = 240 Bytes Bradesco.eq('3') (Bradesco .codigo_banco(3, tp='numeric') .codigo_lote(4, tp='numeric') .tipo_registro(1) .numero_registro(5, tp='numeric') .segmento(1) .vazio1(3) .tipo_inscricao(1) .numero_inscricao(14, tp='numeric') .codigo_convenio(20) .codigo_agencia(5, tp='numeric') .digito_verificador_agencia(1) .numero_conta(12, tp='numeric') .digito_verificador_conta(1) .digito_verificador_conta_agencia(1) .nome_empresa(30) .vazio2(6) .natureza(3) .tipo_complemento(2, tp='numeric') .complemento(20) .cpmf(1) .data_contabil(8, fmt=lambda d: datetime.strptime(d, '%d%m%Y') if d else '') .data_lancamento(8, fmt=lambda d: datetime.strptime(d, '%d%m%Y') if d else '') .valor_lancamento(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .tipo_lancamento(1) .categoria(3, tp='numeric') .codigo_historico(4) .historico(25) .numero_documento(39)) ## REGISTRO TRAILER DE LOTE - TAMANHO DO REGISTRO = 240 Bytes Bradesco.eq('5') (Bradesco .codigo_banco(3, tp='numeric') .codigo_lote(4, tp='numeric') .tipo_registro(1) .vazio1(9) .tipo_inscricao(1) .numero_inscricao(14, tp='numeric') .codigo_convenio(20) .codigo_agencia(5, tp='numeric') .digito_verificador_agencia(1) .numero_conta(12, tp='numeric') .digito_verificador_conta(1) .digito_verificador_conta_agencia(1) .vazio2(16) .bloqueado(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .limite(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .saldo_bloqueado(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .data_final(8, fmt=lambda d: datetime.strptime(d, '%d%m%Y')) .saldo_final(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .situacao(1) .status(1) .total_registros(6, tp='numeric') .total_valor_debito(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .total_valor_credito(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .vazio5(28)) ## REGISTRO TRAILER DE ARQUIVO - TAMANHO DO REGISTRO = 240 Bytes Bradesco.eq('9') (Bradesco .codigo_banco(3, tp='numeric') .codigo_lote(4) .tipo_registro(1) .vazio1(9) .total_quantidade_lotes(6, tp='numeric') .total_quantidade_registros(6, tp='numeric') .total_contas_conciliadas(6, tp='numeric') .vazio2(205))PK:s5M@ʕpyFixedFlatFile/cnabs/itau.py""" ITAU EXTRATO DE CONTA CORRENTE Layout de Arquivos – CNAB240 – Versão 5.0 """ from pyFixedFlatFile import PyFixedFlatFile from datetime import datetime class ItauFlatFile(PyFixedFlatFile): def __init__(self, *args, **kwargs): super(ItauFlatFile, self).__init__(*args, **kwargs) def read(self, file_path): result = [] with open(file_path, 'r') as file_: for line in file_: line_id = line[7] reg_spec = self.data[line_id] position = 0 dict_line = {} for spec in reg_spec: resp, pos = self.fmt_file(spec, line, position, dict_line) dict_line.update(resp) position = pos result.append(dict_line) return result Itau = ItauFlatFile() # REGISTRO HEADER DE ARQUIVO - TAMANHO DO REGISTRO = 240 Bytes Itau.eq('0') (Itau .codigo_banco(3, tp='numeric') .codigo_lote(4, tp='numeric') .tipo_registro(1) .vazio1(9) .tipo_inscricao(1) .numero_inscricao(14, tp='numeric') .vazio2(15) .codigo_convenio(5) .zeros1(1, tp='numeric') .codigo_agencia(4, tp='numeric') .digito_verificador_agencia(1) .zeros(7, tp='numeric') .numero_conta(5, tp='numeric') .vazio3(1) .digito_verificador_conta_agencia(1) .nome_empresa(30) .nome_banco(30) .vazio4(10) .codigo_retorno(1) .data_geracao_arquivo(8, fmt=lambda d: datetime.strptime(d, '%d%m%Y')) .hora_geracao_arquivo(6, fmt=lambda date, data: datetime.strptime(data['data_geracao_arquivo'].strftime('%d%m%Y') + ' ' + date , '%d%m%Y %H%M%S')) .sequencia(6, tp='numeric') .layout(3) .zeros2(5, tp='numeric') .reservado(5) .vazio5(49)) # REGISTRO HEADER LOTE - TAMANHO DO REGISTRO = 240 Bytes Itau.eq('1') (Itau .codigo_banco(3, tp='numeric') .codigo_lote(4, tp='numeric') .tipo_registro(1) .tipo_operacao(1) .tipo_servico(2, tp='numeric') .forma_lancamento(2, tp='numeric') .layout(3) .vazio1(1) .tipo_inscricao(1) .numero_inscricao(14, tp='numeric') .tipo_conta(4) .vazio2(11) .codigo_convenio(5) .zeros1(1, tp='numeric') .codigo_agencia(4, tp='numeric') .digito_verificador_agencia(1) .zeros(7, tp='numeric') .numero_conta(5, tp='numeric') .vazio3(1) .digito_verificador_conta_agencia(1) .nome_empresa(30) .vazio4(40) .data_inicial(8, fmt=lambda d: datetime.strptime(d, '%d%m%Y')) .valor_inicial(18, fmt=lambda value: value[:16] + '.' + value[16:] , tp='float') .situacao_inicial(1) .status_inicial(1) .tipo_moeda(3) .sequencia_extrato(5, tp='numeric') .vazio5(62)) # REGISTRO SEGMENTO E - TAMANHO DO REGISTRO = 240 Bytes Itau.eq('3') (Itau .codigo_banco(3, tp='numeric') .codigo_lote(4, tp='numeric') .tipo_registro(1) .numero_registro(5, tp='numeric') .segmento(1) .lancamento(1) .vazio1(2) .tipo_inscricao(1) .numero_inscricao(14) .vazio2(15) .codigo_convenio(5) .zeros1(1) .codigo_agencia(4) .digito_verificador_agencia(1) .zeros(7) .numero_conta(5) .vazio3(1) .digito_verificador_conta_agencia(1) .nome_empresa(30) .reservado(6) .natureza(3) .tipo_complemento(2) .banco_origem(3) .agencia_origem(5) .agencia_conta_origem(12) .cpmf(1) .data_contabil(8, fmt=lambda d: datetime.strptime(d, '%d%m%Y') if d else '') .data_lancamento(8, fmt=lambda d: datetime.strptime(d, '%d%m%Y') if d else '') .valor_lancamento(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .lancamento(1) .categoria(3) .codigo_lancamento(4) .historico(25) .vazio4(33) .numero_documento(6)) # REGISTRO TRAILER DE LOTE - TAMANHO DO REGISTRO = 240 Bytes Itau.eq('5') (Itau .codigo_banco(3, tp='numeric') .codigo_lote(4, tp='numeric') .tipo_registro(1) .vazio1(9) .tipo_inscricao(1) .numero_inscricao(14, tp='numeric') .vazio2(15) .codigo_convenio(5) .zeros1(1, tp='numeric') .codigo_agencia(4, tp='numeric') .digito_verificador_agencia(1) .zeros(7, tp='numeric') .numero_conta(5, tp='numeric') .vazio3(1) .digito_verificador_conta_agencia(1) .vazio4(16) .bloqueado(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .limite(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .saldo_bloqueado(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .data_final(8, fmt=lambda d: datetime.strptime(d, '%d%m%Y')) .saldo_final(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .situacao(1) .status(1) .total_registros(6, tp='numeric') .total_valor_debito(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .total_valor_credito(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .totais_valores_nao_contabeis(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .vazio5(10)) #REGISTRO TRAILER DE ARQUIVO - TAMANHO DO REGISTRO = 240 Bytes Itau.eq('9') (Itau .codigo_banco(3, tp='numeric') .codigo_lote(4) .tipo_registro(1) .vazio1(9) .total_quantidade_lotes(6, tp='numeric') .total_quantidade_registros(6, tp='numeric') .total_contas_conciliadas(6, tp='numeric') .vazio2(205))PKқOM^)DD"pyFixedFlatFile/cnabs/santander.py""" Layout Santander 240 posições versão 8.2 com complemento """ from pyFixedFlatFile import PyFixedFlatFile from datetime import datetime class SantanderFlatFile(PyFixedFlatFile): def __init__(self, *args, **kwargs): super(SantanderFlatFile, self).__init__(*args, **kwargs) def read(self, file_path): result = [] with open(file_path, 'r') as file_: for line in file_: line_id = line[7] reg_spec = self.data[line_id] position = 0 dict_line = {} for spec in reg_spec: resp, pos = self.fmt_file(spec, line, position, dict_line) dict_line.update(resp) position = pos result.append(dict_line) return result Santander = SantanderFlatFile() # REGISTRO HEADER DE ARQUIVO - TAMANHO DO REGISTRO = 240 Bytes Santander.eq('0') (Santander .codigo_banco(3, tp='numeric') .codigo_lote(4, tp='numeric') .tipo_registro(1) .vazio1(9) .tipo_inscricao(1) .numero_inscricao(14, tp='numeric') .codigo_convenio(20) .codigo_agencia(5) .digito_verificador_agencia(1) .numero_conta(12, tp='numeric') .digito_verificador_conta(1) .digito_verificador_conta_agencia(1) .nome_empresa(30) .nome_banco(30) .vazio2(10) .codigo_retorno(1) .data_geracao_arquivo(8, fmt=lambda d: datetime.strptime(d, '%d%m%Y')) .hora_arquivo(6, fmt=lambda date, data: datetime.strptime(data['data_geracao_arquivo'].strftime('%d%m%Y') + ' ' + date , '%d%m%Y %H%M%S')) .arquivo_sequencia(5) .layout(3) .densidade_gravacao(5) .vazio3(70)) # REGISTRO HEADER LOTE - TAMANHO DO REGISTRO = 240 Bytes Santander.eq('1') (Santander .numero_banco(3) .lote_servico(4) .tipo_registro(1) .tipo_operacao(1) .tipo_servico(2) .forma_lancamento(2) .numero_versao_layout_lote(3) .vazio1(1) .tipo_inscricao_empresa(1) .numero_inscricao_empresa(14) .codigo_convenio(20) .codigo_agencia(5) .digito_verificador_agencia(1) .numero_conta(12) .digito_verificador_conta(1) .digito_verificador_conta_agencia(1) .nome_empresa(30) .vazio2(38) .data_geracao_arquivo(8) .saldo_inicial(18) .situacao_saldo_inicial(1) .posicao_saldo_inicial(1) .moeda_referenciada_extrato(3) .numero_sequencia_extrato(5) .vazio3(16) .vazio4(47)) # REGISTRO SEGMENTO E - TAMANHO DO REGISTRO = 240 Bytes Santander.eq('3') (Santander .codigo_banco(3, tp='numeric') .codigo_lote(4, tp='numeric') .tipo_registro(1) .numero_registro(5, tp='numeric') .segmento(1) .vazio1(3) .tipo_inscricao(1) .numero_inscricao(14) .codigo_convenio(20) .codigo_agencia(5) .digito_verificador_agencia(1) .numero_conta(12) .digito_verificador_conta(1) .digito_verificador_conta_agencia(1) .nome_empresa(30) .reservado(6) .natureza(3) .tipo_complemento(2) .reservado2(20) .cpmf(1) .data_contabil(8, fmt=lambda d: datetime.strptime(d, '%d%m%Y') if d else '') .data_lancamento(8, fmt=lambda d: datetime.strptime(d, '%d%m%Y') if d else '') .valor_lancamento(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .lancamento(1) .categoria(3) .codigo_lancamento(4) .historico(25) .numero_documento(6) .complemento_historico(25) .reservado3(8)) # REGISTRO TRAILER DE LOTE - TAMANHO DO REGISTRO = 240 Bytes Santander.eq('5') (Santander .codigo_banco(3, tp='numeric') .codigo_lote(4, tp='numeric') .tipo_registro(1) .vazio1(9) .tipo_inscricao(1) .numero_inscricao(14, tp='numeric') .codigo_convenio(20) .codigo_agencia(5) .digito_verificador_agencia(1) .numero_conta(12, tp='numeric') .digito_verificador_conta(1) .digito_verificador_conta_agencia(1) .saldo(16, fmt=lambda value: value[:14] + '.' + value[14:], tp='float') .vazio2(18) .limite(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .saldo_bloqueado(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .data_final(8, fmt=lambda d: datetime.strptime(d, '%d%m%Y')) .saldo_final(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .situacao(1) .posicao_final(1) .total_registros(6, tp='numeric') .total_valor_debito(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .total_valor_credito(18, fmt=lambda value: value[:16] + '.' + value[16:], tp='float') .vazio3(28)) #REGISTRO TRAILER DE ARQUIVO - TAMANHO DO REGISTRO = 240 Bytes Santander.eq('9') (Santander .codigo_banco(3, tp='numeric') .codigo_lote(4) .tipo_registro(1) .vazio1(9) .total_quantidade_lotes(6, tp='numeric') .total_quantidade_registros(6, tp='numeric') .total_contas_conciliadas(6, tp='numeric') .vazio2(205))PK#g+M`::+pyFixedFlatFile-1.4.0.dist-info/LICENSE.txtThe MIT License (MIT) Copyright (c) 2017 Anderson Marques 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.PK!HSmPO%pyFixedFlatFile-1.4.0.dist-info/WHEEL HM K-*ϳR03rOK-J,/RH,rzd&Y)r$[)T&UrPK!HF,` &(pyFixedFlatFile-1.4.0.dist-info/METADATAZ[oF~8pQH*dƒ4nMbGH/afHiC>W= IIH qfm;z.+Jl.U8E"(3TSMm,V2qoz!fI ˕F*0EmhxUD pgθ605!X f3]œ :@f?XA:kهG\"{Qc"թ1aۏ~wMo+Ok;#5~klf*80MYFѨjMl"B"3|NO!P*}܈YMr|!;LWYc ^!A8hm]]?Cj m'_`.H!e}х&Qf[O]'TuX{1# S~#*C<`d1\~HmFO/$·@ !:p^A,uNNb5@D " J aWt4b[_M>}shUŠ{eD#.zݽӼ–Tû+)>̋WJ'eI{?}?ST]FfފP=]!uBm=i97K~ϣC ;/ˬ 2FlrAu␐!\\s56JV!7vy_bj@2eM\2kh -"BtMtr;ޞ8c@h!5(zt}[9~vL߻-4"o%N87tXTQI- Lι_qPAl&= +an,c%Jȏʕ2Ԝ `D5,_3*Iښ"(;PE ɗ(]ʮhlntǡd7$Fwa1]#Ł7U!{]#/paD]طȗfu2cŨhlK{\ aNJjB)3 !*5D'M`4T]T ?*,&tm3nago/yZSNĎ5F4~J=ns3^ VŔ }F]b)ĠA)S1hÙlHeu$JMs{vgsW, v]1Dgwsw:+޿QsDsE($q'+Y~qFJT% @\j6EMd(YY{2M :-` Za+P\f, :*$M~tj#!Oj֐q}Z ^vokshrp%n%i}+Q](̇.C9G/k-nMkt;1?\UE"?}T-na2:-Jzmgx<ЂzX\hy[Ö|ᶀBܶ74"-g. x,(0RY: zeiӶhCz>=0)hS2[yﯚc4ݻÇV`˃,LʩuxI%JeQrt tZ,>\al-% 7o :N@0d]Sf045&Y#o'Л9dtӧ$_f$)h-4!+K/>WBQρTfaՒZLN5.t9%~CR`*VgĂHCks/hg!ĉ]0?S)Ѹҧ&JD+}l,B-CVO G Ib볳gO<"gg.s*nPK!HR+H&pyFixedFlatFile-1.4.0.dist-info/RECORDMs@{~ A8OAG1^FHF_CcWu=v{X)m,(oh\ B}, c~i0OҬ,E(|ϴR|#YyV?k .9.%Ĝk{q=ғQ%_<,J).ZזX<9tD+NOt]qU]iYar(G. <]U&û#@E8oɚDsHElC9\wRPT~MX0:lwՕ%~ukgs_T2@?ȼ&1(M$a+dz$a;4ϑifEPk54KX@zغWnG٢#6,6mj,cAT;=cq N+qtsof|f&7H){†/p, Vo圿gi/olNN/TF%KsF (NnKBWszI5 n= hmPKOM(݊pyFixedFlatFile/__init__.pyPK#g+M#nnpyFixedFlatFile/exceptions.pyPK\2Mo299"lpyFixedFlatFile/pyFixedFlatFile.pyPK]2M,0pyFixedFlatFile/specs.pyPKOME!pyFixedFlatFile/cnabs/__init__.pyPK}2MST55!pyFixedFlatFile/cnabs/bradesco.pyPK:s5M@ʕ%3pyFixedFlatFile/cnabs/itau.pyPKқOM^)DD"}HpyFixedFlatFile/cnabs/santander.pyPK#g+M`::+\pyFixedFlatFile-1.4.0.dist-info/LICENSE.txtPK!HSmPO%`pyFixedFlatFile-1.4.0.dist-info/WHEELPK!HF,` &(apyFixedFlatFile-1.4.0.dist-info/METADATAPK!HR+H&mpyFixedFlatFile-1.4.0.dist-info/RECORDPK p