Initialize Software Environment

-Write JSON data to a file
-Convert string to boolean


In [1]:
from elasticsearch import Elasticsearch
from elasticsearch import helpers
from datetime import datetime
import json
import os
import numpy as np
import re
import requests
from distutils.util import strtobool
from dateutil import parser

Define functions


In [2]:
def init_record_parsing(tdlr_all_licenses):
    """ Initializes a dictionary that contains the following parameters:
    - Number of TDLR record fields to skip
    - TDLR record field names
    
    Args:
        tdlr_all_licenses: Nested dictionary that stores TDLR records

    Return: parsing_params: Dictionary that contains parameters required to
                            parse a TDLR record
                            
                            Key:               Value:
                            ---                ------
                            numskippedfields   Number of fields to skip
                            
                            fieldname          List that contains formatted
                                               TDLR record field names """
    fieldname = []
    for elem in tdlr_all_licenses['meta']['view']['columns']:
        fieldname.append(elem['fieldName'])

    num_skipped_fields = np.argwhere([re.match('^:.*', elem) != None
                                      for elem in fieldname])[-1][0] + 1

    fieldname = [re.sub('[_\s]', '', elem) for elem in fieldname]

    fieldname = [re.sub('mmddccyy', '', elem) for elem in fieldname]

    sub_column_types = {}

    for idx in np.arange(num_skipped_fields,
                         len(tdlr_all_licenses['meta']['view']['columns'])):

        if 'subColumnTypes' in tdlr_all_licenses['meta']['view']['columns'][idx].keys():
            sub_column_types[fieldname[idx]] =\
                tdlr_all_licenses['meta']['view']['columns'][idx]['subColumnTypes']

            sub_column_types[fieldname[idx]] = [re.sub('[\s_]', '',  elem)
                                                for elem in sub_column_types[fieldname[idx]]]    
    
    fieldname = fieldname[num_skipped_fields:]
    
    return {'numskippedfields': num_skipped_fields,
            'fieldname': fieldname,
            'subcolumntypes': sub_column_types}

def init_index_mapping():
    """ Initializes a nested dictionary that defines the mapping of an 
    Elasticsearch index that contains TDLR records.
    
    Args:
        None
    
    Returns:
        mapping: Nested dictionary that defines the mapping of an
                 Elasticsearch index that contains TDLR records."""
    mapping =\
    {
        "mappings": {
            "tdlr": {
                "properties": {
                    "licensetype": {
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "licensenumber": {
                        "type": "string",
                        "index": "not_analyzed"
                    },             
                    "businesscounty": {
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "businessname": {"type": "string"},
                    "businessaddressline1": {"type": "string"},
                    "businessaddressline2": {"type": "string"},
                    "businesscity": {
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "businessstate": {
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "businesszip": {
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "businesstelephone": {
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "licenseexpirationdate": {
                        "type": "date",
                        "format": "date_optional_time"
                    },
                    "ownername": {"type": "string"},
                    "mailingaddressline1": {"type": "string"},
                    "mailingaddressline2": {"type": "string"},
                    "mailingaddresscity": {
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "mailingaddressstate": {
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "mailingaddresszip": {
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "mailingaddresscountycode": {"type": "integer"},
                    "mailingaddresscounty": {
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "ownertelephone": {
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "licensesubtype":{
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "continuingeducationflag": {"type": "boolean"},
                    "mailingaddresslocation": {"type": "geo_point"}
                }
            }        
        }
    }
    
    return mapping

def parse_int(string_value):
    """ Parses an integer number
    
    Args:
        string_value: String that contains an integer
    
    Returns:
        int_value: Integer number"""
    try:
        int_value = np.int(string_value)
    except TypeError:
        int_value = None

    return int_value

def parse_float(string_value):
    """ Parses a floating point number
    
    Args:
        string_value: String that contains a floating point number
    
    Returns:
        float_value: Floating point number"""
    try:
        float_value = np.float(string_value)
    except TypeError:
        float_value = None
    
    return float_value

def parse_boolean(string_value):
    """ Parses a boolean value
    
    Args:
        string_value: String that contains an boolean value
    
    Returns:
        boolean_value: Boolean value"""
    try:
        boolean_value = np.bool(strtobool(string_value))
    except TypeError:
        boolean_value = False
    except AttributeError:
        boolean_value = False

    return boolean_value

def parse_citystatezip(citystatezip):
    """ Parses a string that stores a city, state, & zip code.
    
    Args:
        citystatezip: String that stores a city, state, & zip code.
    
    Returns:
        citystatezip: Dictionary that stores a city, state, & zip code."""
    fields = [None] * 3
    
    patternobj = re.compile('^([A-Z0-9\s+-]+)\s([A-Z]{2})\s([0-9-]+)$')

    if citystatezip is not None:
        matchobj = patternobj.match(citystatezip)

        if matchobj is not None:
            fields = [matchobj.group(1),
                      matchobj.group(2),
                      matchobj.group(3)]
    
    return dict(zip(['city', 'state', 'zip'], fields))

def format_record(raw_record,
                  parsing_params):
    """ Formats a TDLR record
    
    Args:
        raw_record: List that contains a raw TDLR record
        
        parsing_params: Dictionary that contains parameters required to
                        parse a TDLR record
                            
                        Key:               Value:
                        ---                ------
                        numskippedfields   Number of fields to skip
                            
                        fieldname          List that contains formatted
                                           TDLR record field names
                                           
    Returns:
        formatted_record: Dictionary that stores a formatted TDLR record"""
    tdlr_record = dict(zip(parsing_params['fieldname'],
                           raw_record[parsing_params['numskippedfields']:]))

    for key in parsing_params['subcolumntypes']:
        tdlr_record[key] = dict(zip(parsing_params['subcolumntypes'][key],
                                    tdlr_record[key]))

    tdlr_record['continuingeducationflag'] =\
        parse_boolean(tdlr_record['continuingeducationflag'])

    licenseexpirationdate = tdlr_record['licenseexpirationdate']

    if len(licenseexpirationdate) == 7:
        licenseexpirationdate = '0' + licenseexpirationdate

    licenseexpirationdate =\
        datetime.strptime(licenseexpirationdate, "%m%d%Y")
    
    tdlr_record['licenseexpirationdate'] =\
        licenseexpirationdate.strftime('%Y-%m-%d')

    mailingaddresscitystatezip = tdlr_record.pop('mailingaddresscitystatezip')

    mailingaddresscitystatezip =\
        parse_citystatezip(mailingaddresscitystatezip)

    tdlr_record['mailingaddresscity'] = mailingaddresscitystatezip['city']
    tdlr_record['mailingaddressstate'] = mailingaddresscitystatezip['state']
    tdlr_record['mailingaddresszip'] = mailingaddresscitystatezip['zip']

    businesscitystatezip =\
        parse_citystatezip(tdlr_record.pop('businesscitystatezip'))

    tdlr_record['businesscity'] = businesscitystatezip['city']
    tdlr_record['businessstate'] = businesscitystatezip['state']
    tdlr_record['businesszip'] = businesscitystatezip['zip']

    mailingaddresslocation = tdlr_record.pop('mailingaddresslocation')

    tdlr_record['mailingaddresslocation'] =\
        {'lat': parse_float(mailingaddresslocation['latitude']),
         'lon': parse_float(mailingaddresslocation['longitude'])}
        
    for key in tdlr_record['mailingaddresslocation']:
        if tdlr_record['mailingaddresslocation'][key] is None:
            tdlr_record['mailingaddresslocation'][key] = -1.0

    tdlr_record['mailingaddresscountycode'] =\
        parse_int(tdlr_record['mailingaddresscountycode'])
        
    return tdlr_record

In [3]:
data_path = "./Data"
data_file = 'tdlrAllLicenses.json'
datafile_fullpath = os.path.join(data_path, data_file)

if not os.path.exists(data_path):
    os.mkdir(data_path)
    
    download_url = "https://data.texas.gov/api/views/7358-krk7/rows.json?" +\
                   "accessType=DOWNLOAD"
        
    requestobj = requests.get(download_url)
    
    with open(datafile_fullpath, "w") as outfile:
        json.dump(requestobj.json(), outfile)

with open(datafile_fullpath, "r") as infile:
    tdlr_all_licenses = json.load(infile)

Create Elasticsearch Index


In [4]:
clusterobj = Elasticsearch('localhost:9200')

if not clusterobj.indices.exists('texasopendata'):
    clusterobj.indices.create('texasopendata', body=init_index_mapping())

In [5]:
parsing_params = init_record_parsing(tdlr_all_licenses)

number_documents = len(tdlr_all_licenses['data'])

actions = []

for idx in np.arange(0, number_documents):

    actions.append({'_index': 'texasopendata',
                    '_type': 'tdlr',
                    '_source': format_record(tdlr_all_licenses['data'][idx],
                                              parsing_params)})
    
    if len(actions) % 1000 == 0:
        print("Completed formatting document #%d" % (idx))

        helpers.bulk(clusterobj, actions)

        actions = []

if len(actions) > 0:
    helpers.bulk(clusterobj, actions)


Completed formatting document #999
Completed formatting document #1999
Completed formatting document #2999
Completed formatting document #3999
Completed formatting document #4999
Completed formatting document #5999
Completed formatting document #6999
Completed formatting document #7999
Completed formatting document #8999
Completed formatting document #9999
Completed formatting document #10999
Completed formatting document #11999
Completed formatting document #12999
Completed formatting document #13999
Completed formatting document #14999
Completed formatting document #15999
Completed formatting document #16999
Completed formatting document #17999
Completed formatting document #18999
Completed formatting document #19999
Completed formatting document #20999
Completed formatting document #21999
Completed formatting document #22999
Completed formatting document #23999
Completed formatting document #24999
Completed formatting document #25999
Completed formatting document #26999
Completed formatting document #27999
Completed formatting document #28999
Completed formatting document #29999
Completed formatting document #30999
Completed formatting document #31999
Completed formatting document #32999
Completed formatting document #33999
Completed formatting document #34999
Completed formatting document #35999
Completed formatting document #36999
Completed formatting document #37999
Completed formatting document #38999
Completed formatting document #39999
Completed formatting document #40999
Completed formatting document #41999
Completed formatting document #42999
Completed formatting document #43999
Completed formatting document #44999
Completed formatting document #45999
Completed formatting document #46999
Completed formatting document #47999
Completed formatting document #48999
Completed formatting document #49999
Completed formatting document #50999
Completed formatting document #51999
Completed formatting document #52999
Completed formatting document #53999
Completed formatting document #54999
Completed formatting document #55999
Completed formatting document #56999
Completed formatting document #57999
Completed formatting document #58999
Completed formatting document #59999
Completed formatting document #60999
Completed formatting document #61999
Completed formatting document #62999
Completed formatting document #63999
Completed formatting document #64999
Completed formatting document #65999
Completed formatting document #66999
Completed formatting document #67999
Completed formatting document #68999
Completed formatting document #69999
Completed formatting document #70999
Completed formatting document #71999
Completed formatting document #72999
Completed formatting document #73999
Completed formatting document #74999
Completed formatting document #75999
Completed formatting document #76999
Completed formatting document #77999
Completed formatting document #78999
Completed formatting document #79999
Completed formatting document #80999
Completed formatting document #81999
Completed formatting document #82999
Completed formatting document #83999
Completed formatting document #84999
Completed formatting document #85999
Completed formatting document #86999
Completed formatting document #87999
Completed formatting document #88999
Completed formatting document #89999
Completed formatting document #90999
Completed formatting document #91999
Completed formatting document #92999
Completed formatting document #93999
Completed formatting document #94999
Completed formatting document #95999
Completed formatting document #96999
Completed formatting document #97999
Completed formatting document #98999
Completed formatting document #99999
Completed formatting document #100999
Completed formatting document #101999
Completed formatting document #102999
Completed formatting document #103999
Completed formatting document #104999
Completed formatting document #105999
Completed formatting document #106999
Completed formatting document #107999
Completed formatting document #108999
Completed formatting document #109999
Completed formatting document #110999
Completed formatting document #111999
Completed formatting document #112999
Completed formatting document #113999
Completed formatting document #114999
Completed formatting document #115999
Completed formatting document #116999
Completed formatting document #117999
Completed formatting document #118999
Completed formatting document #119999
Completed formatting document #120999
Completed formatting document #121999
Completed formatting document #122999
Completed formatting document #123999
Completed formatting document #124999
Completed formatting document #125999
Completed formatting document #126999
Completed formatting document #127999
Completed formatting document #128999
Completed formatting document #129999
Completed formatting document #130999
Completed formatting document #131999
Completed formatting document #132999
Completed formatting document #133999
Completed formatting document #134999
Completed formatting document #135999
Completed formatting document #136999
Completed formatting document #137999
Completed formatting document #138999
Completed formatting document #139999
Completed formatting document #140999
Completed formatting document #141999
Completed formatting document #142999
Completed formatting document #143999
Completed formatting document #144999
Completed formatting document #145999
Completed formatting document #146999
Completed formatting document #147999
Completed formatting document #148999
Completed formatting document #149999
Completed formatting document #150999
Completed formatting document #151999
Completed formatting document #152999
Completed formatting document #153999
Completed formatting document #154999
Completed formatting document #155999
Completed formatting document #156999
Completed formatting document #157999
Completed formatting document #158999
Completed formatting document #159999
Completed formatting document #160999
Completed formatting document #161999
Completed formatting document #162999
Completed formatting document #163999
Completed formatting document #164999
Completed formatting document #165999
Completed formatting document #166999
Completed formatting document #167999
Completed formatting document #168999
Completed formatting document #169999
Completed formatting document #170999
Completed formatting document #171999
Completed formatting document #172999
Completed formatting document #173999
Completed formatting document #174999
Completed formatting document #175999
Completed formatting document #176999
Completed formatting document #177999
Completed formatting document #178999
Completed formatting document #179999
Completed formatting document #180999
Completed formatting document #181999
Completed formatting document #182999
Completed formatting document #183999
Completed formatting document #184999
Completed formatting document #185999
Completed formatting document #186999
Completed formatting document #187999
Completed formatting document #188999
Completed formatting document #189999
Completed formatting document #190999
Completed formatting document #191999
Completed formatting document #192999
Completed formatting document #193999
Completed formatting document #194999
Completed formatting document #195999
Completed formatting document #196999
Completed formatting document #197999
Completed formatting document #198999
Completed formatting document #199999
Completed formatting document #200999
Completed formatting document #201999
Completed formatting document #202999
Completed formatting document #203999
Completed formatting document #204999
Completed formatting document #205999
Completed formatting document #206999
Completed formatting document #207999
Completed formatting document #208999
Completed formatting document #209999
Completed formatting document #210999
Completed formatting document #211999
Completed formatting document #212999
Completed formatting document #213999
Completed formatting document #214999
Completed formatting document #215999
Completed formatting document #216999
Completed formatting document #217999
Completed formatting document #218999
Completed formatting document #219999
Completed formatting document #220999
Completed formatting document #221999
Completed formatting document #222999
Completed formatting document #223999
Completed formatting document #224999
Completed formatting document #225999
Completed formatting document #226999
Completed formatting document #227999
Completed formatting document #228999
Completed formatting document #229999
Completed formatting document #230999
Completed formatting document #231999
Completed formatting document #232999
Completed formatting document #233999
Completed formatting document #234999
Completed formatting document #235999
Completed formatting document #236999
Completed formatting document #237999
Completed formatting document #238999
Completed formatting document #239999
Completed formatting document #240999
Completed formatting document #241999
Completed formatting document #242999
Completed formatting document #243999
Completed formatting document #244999
Completed formatting document #245999
Completed formatting document #246999
Completed formatting document #247999
Completed formatting document #248999
Completed formatting document #249999
Completed formatting document #250999
Completed formatting document #251999
Completed formatting document #252999
Completed formatting document #253999
Completed formatting document #254999
Completed formatting document #255999
Completed formatting document #256999
Completed formatting document #257999
Completed formatting document #258999
Completed formatting document #259999
Completed formatting document #260999
Completed formatting document #261999
Completed formatting document #262999
Completed formatting document #263999
Completed formatting document #264999
Completed formatting document #265999
Completed formatting document #266999
Completed formatting document #267999
Completed formatting document #268999
Completed formatting document #269999
Completed formatting document #270999
Completed formatting document #271999
Completed formatting document #272999
Completed formatting document #273999
Completed formatting document #274999
Completed formatting document #275999
Completed formatting document #276999
Completed formatting document #277999
Completed formatting document #278999
Completed formatting document #279999
Completed formatting document #280999
Completed formatting document #281999
Completed formatting document #282999
Completed formatting document #283999
Completed formatting document #284999
Completed formatting document #285999
Completed formatting document #286999
Completed formatting document #287999
Completed formatting document #288999
Completed formatting document #289999
Completed formatting document #290999
Completed formatting document #291999
Completed formatting document #292999
Completed formatting document #293999
Completed formatting document #294999
Completed formatting document #295999
Completed formatting document #296999
Completed formatting document #297999
Completed formatting document #298999
Completed formatting document #299999
Completed formatting document #300999
Completed formatting document #301999
Completed formatting document #302999
Completed formatting document #303999
Completed formatting document #304999
Completed formatting document #305999
Completed formatting document #306999
Completed formatting document #307999
Completed formatting document #308999
Completed formatting document #309999
Completed formatting document #310999
Completed formatting document #311999
Completed formatting document #312999
Completed formatting document #313999
Completed formatting document #314999
Completed formatting document #315999
Completed formatting document #316999
Completed formatting document #317999
Completed formatting document #318999
Completed formatting document #319999
Completed formatting document #320999
Completed formatting document #321999
Completed formatting document #322999
Completed formatting document #323999
Completed formatting document #324999
Completed formatting document #325999
Completed formatting document #326999
Completed formatting document #327999
Completed formatting document #328999
Completed formatting document #329999
Completed formatting document #330999
Completed formatting document #331999
Completed formatting document #332999
Completed formatting document #333999
Completed formatting document #334999
Completed formatting document #335999
Completed formatting document #336999
Completed formatting document #337999
Completed formatting document #338999
Completed formatting document #339999
Completed formatting document #340999
Completed formatting document #341999
Completed formatting document #342999
Completed formatting document #343999
Completed formatting document #344999
Completed formatting document #345999
Completed formatting document #346999
Completed formatting document #347999
Completed formatting document #348999
Completed formatting document #349999
Completed formatting document #350999
Completed formatting document #351999
Completed formatting document #352999
Completed formatting document #353999
Completed formatting document #354999
Completed formatting document #355999
Completed formatting document #356999
Completed formatting document #357999
Completed formatting document #358999
Completed formatting document #359999
Completed formatting document #360999
Completed formatting document #361999
Completed formatting document #362999
Completed formatting document #363999
Completed formatting document #364999
Completed formatting document #365999
Completed formatting document #366999
Completed formatting document #367999
Completed formatting document #368999
Completed formatting document #369999
Completed formatting document #370999
Completed formatting document #371999
Completed formatting document #372999
Completed formatting document #373999
Completed formatting document #374999
Completed formatting document #375999
Completed formatting document #376999
Completed formatting document #377999
Completed formatting document #378999
Completed formatting document #379999
Completed formatting document #380999
Completed formatting document #381999
Completed formatting document #382999
Completed formatting document #383999
Completed formatting document #384999
Completed formatting document #385999
Completed formatting document #386999
Completed formatting document #387999
Completed formatting document #388999
Completed formatting document #389999
Completed formatting document #390999
Completed formatting document #391999
Completed formatting document #392999
Completed formatting document #393999
Completed formatting document #394999
Completed formatting document #395999
Completed formatting document #396999
Completed formatting document #397999
Completed formatting document #398999
Completed formatting document #399999
Completed formatting document #400999
Completed formatting document #401999
Completed formatting document #402999
Completed formatting document #403999
Completed formatting document #404999
Completed formatting document #405999
Completed formatting document #406999
Completed formatting document #407999
Completed formatting document #408999
Completed formatting document #409999
Completed formatting document #410999
Completed formatting document #411999
Completed formatting document #412999
Completed formatting document #413999
Completed formatting document #414999
Completed formatting document #415999
Completed formatting document #416999
Completed formatting document #417999
Completed formatting document #418999
Completed formatting document #419999
Completed formatting document #420999
Completed formatting document #421999
Completed formatting document #422999
Completed formatting document #423999
Completed formatting document #424999
Completed formatting document #425999
Completed formatting document #426999
Completed formatting document #427999
Completed formatting document #428999
Completed formatting document #429999
Completed formatting document #430999
Completed formatting document #431999
Completed formatting document #432999
Completed formatting document #433999
Completed formatting document #434999
Completed formatting document #435999
Completed formatting document #436999
Completed formatting document #437999
Completed formatting document #438999
Completed formatting document #439999
Completed formatting document #440999
Completed formatting document #441999
Completed formatting document #442999
Completed formatting document #443999
Completed formatting document #444999
Completed formatting document #445999
Completed formatting document #446999
Completed formatting document #447999
Completed formatting document #448999
Completed formatting document #449999
Completed formatting document #450999
Completed formatting document #451999
Completed formatting document #452999
Completed formatting document #453999
Completed formatting document #454999
Completed formatting document #455999
Completed formatting document #456999
Completed formatting document #457999
Completed formatting document #458999
Completed formatting document #459999
Completed formatting document #460999
Completed formatting document #461999
Completed formatting document #462999
Completed formatting document #463999
Completed formatting document #464999
Completed formatting document #465999
Completed formatting document #466999
Completed formatting document #467999
Completed formatting document #468999
Completed formatting document #469999
Completed formatting document #470999
Completed formatting document #471999
Completed formatting document #472999
Completed formatting document #473999
Completed formatting document #474999
Completed formatting document #475999
Completed formatting document #476999
Completed formatting document #477999
Completed formatting document #478999
Completed formatting document #479999
Completed formatting document #480999
Completed formatting document #481999
Completed formatting document #482999
Completed formatting document #483999
Completed formatting document #484999
Completed formatting document #485999
Completed formatting document #486999
Completed formatting document #487999
Completed formatting document #488999
Completed formatting document #489999
Completed formatting document #490999
Completed formatting document #491999
Completed formatting document #492999
Completed formatting document #493999
Completed formatting document #494999
Completed formatting document #495999
Completed formatting document #496999
Completed formatting document #497999
Completed formatting document #498999
Completed formatting document #499999
Completed formatting document #500999
Completed formatting document #501999
Completed formatting document #502999
Completed formatting document #503999
Completed formatting document #504999
Completed formatting document #505999
Completed formatting document #506999
Completed formatting document #507999
Completed formatting document #508999
Completed formatting document #509999
Completed formatting document #510999
Completed formatting document #511999
Completed formatting document #512999
Completed formatting document #513999
Completed formatting document #514999
Completed formatting document #515999
Completed formatting document #516999
Completed formatting document #517999
Completed formatting document #518999
Completed formatting document #519999
Completed formatting document #520999
Completed formatting document #521999
Completed formatting document #522999
Completed formatting document #523999
Completed formatting document #524999
Completed formatting document #525999
Completed formatting document #526999
Completed formatting document #527999
Completed formatting document #528999
Completed formatting document #529999
Completed formatting document #530999
Completed formatting document #531999
Completed formatting document #532999
Completed formatting document #533999
Completed formatting document #534999
Completed formatting document #535999
Completed formatting document #536999
Completed formatting document #537999
Completed formatting document #538999
Completed formatting document #539999
Completed formatting document #540999
Completed formatting document #541999
Completed formatting document #542999
Completed formatting document #543999
Completed formatting document #544999
Completed formatting document #545999
Completed formatting document #546999
Completed formatting document #547999
Completed formatting document #548999
Completed formatting document #549999
Completed formatting document #550999
Completed formatting document #551999
Completed formatting document #552999
Completed formatting document #553999
Completed formatting document #554999
Completed formatting document #555999
Completed formatting document #556999
Completed formatting document #557999
Completed formatting document #558999
Completed formatting document #559999
Completed formatting document #560999
Completed formatting document #561999
Completed formatting document #562999
Completed formatting document #563999
Completed formatting document #564999
Completed formatting document #565999
Completed formatting document #566999
Completed formatting document #567999
Completed formatting document #568999
Completed formatting document #569999
Completed formatting document #570999
Completed formatting document #571999
Completed formatting document #572999
Completed formatting document #573999
Completed formatting document #574999
Completed formatting document #575999
Completed formatting document #576999
Completed formatting document #577999

In [ ]: