📺 Develpreneur YouTube Episode

Video + transcript

SQL Sync Part 25

2022-11-08 •Youtube

Detailed Notes

Focus for this episode: This is a step into building out our hierarchy and determining which tables make sense if rows copied are limited and which ones need another approach.

This tutorial walks through the creation of a database synchronization tool in Python. It continues our Python and SQL Tutorials with a useful application that provides a deeper look at SQL structures and commands.

Repository For Code: git clone [email protected]:rbroadhead/dbsync.git

Transcript Text
thank you
[Music]
well hello and welcome back we're
continuing our series of tutorials SQL
python sort of Blended together in our
database synchronization application and
we're getting into walking through our
relational hierarchy in order to grab
data as we need it particularly when we
limit cert you know have a certain
number of rows we want to pull across
from our source to our destination we
need to make sure that we look up the
uh the related rows and pull those
across as well so it's going to get a
little tricky
um we started out first time last time
we just sort of got some basic stuff
together so what you may see is
uh let me flip back over here we use
this guy quite a bit when we were
grabbing our constraint name and table
name
and let's uh switch us over to giganator
if that's a database we're going to be
using today
and whoop
helps to
get the name right there we go
and so we've got a fair amount of I
think that's the one I'm using
uh
uh yeah that's what I'm using we've got
a fair amount of tables we've got a fair
amount of relationships we've got a lot
of these lkp lkp lookup type tables
among others got a lot of these like
performer performance which ties a
performer to a performance and of course
has its keys
now what we're doing last time is we had
this little smart empty sink so
basically we're going to do is we're
going to say hey
we are going to come through and we're
going to figure out if
a table is something we can go ahead and
load the data for it right away that
it's in our
clean section
or is it not
and what we're going to do is we're
going to do let's do uh
I want to see how do we want to do this
so the the first thing we need to do
which we did last time was I sort of did
this
load data and load data for children so
when we run it
and this only runs for one but we can
see here
and I tweaked it a little since our last
call if I can jump up to the top of this
somewhere here we go connect to the
database so load data for children so
for performer
and I did let's see the table name is
the last row so for the contract table
the performer
is tied to it so there is a foreign key
from contract back to performer which
means that performer has to be loaded
before contract is
it also means that we may have some
issues deleting data now one thing we
did in the past is we just went through
if you go think this is the sink Rose
is we just said we will just clear
everything out we're going to drop the
foreign keys we're going to truncate all
the data
if we want to we can do that and
what we'll do is let's just say
let's create a new one and we're going
to call it
drop data
and it's also going to be self it
doesn't need Max rows
it does need those two
and it's basically that piece whoops but
now I got two
this so that it all lines up right so
now I've got this drop data
and what I'm going to do here is instead
of doing this
I'm going to take it out of the sink
Rose
it is not in the Sim empty sink and then
I'm going to put it
here and this is basically because I
don't want to accidentally do stuff
sometimes and let's add a feature flag
of d
for drop
and
uh
we'll do that and if D is in there then
we'll do it okay
so
we'll have to drop we would have to sync
it first so we should be good did we
have an all here
uh we did have it all but I think we can
just do like this
there we go and that'll get us some
stuff going there
okay I think we are good so now back to
this so we've got our you know
get our comparison of tables that we
need to do and then we're going to come
into that's not main it's over here
now what we want to do for each of these
is
we can either load the table data right
away
or we're going to have to get the
children first so for the data that we
can load right away which means that it
does not have
a parent to worry about
then all we need to do here is let's see
we're going to do the data sync and
actually what we probably will do
um
so here we do it by the limit okay
so we're going to do
we're going to create like a little one
here and so this is going to be uh
load table data
and it's probably going to need
some information so rotate the table the
load table data
we're going to give it a table
and
oh we're gonna need our source and our
destination
which is sort of par for the course so
let's do this let's get our cleanup here
let's get our startup up here
and then we're going to go in we're
going to load table data which is uh
down here
uh oh that's not the one we want we
don't want create missing there we go
smart empty sink
so here what we're going to do
um
I don't know that it matters but we're
going to go ahead and put this in ahead
of it just so it's there
okay
so now what we can do is we can come in
and we can say if
oh that's missing tape I want to go back
up uh where is
okay what did I just do
to create missing tables sync rows
load table data smart empty sync rows
okay
let's just do it this way so we want to
take that
and we want to push that after load
table data
okay
so now we're going to come in here and
here we're going to just do the load so
what we can do is we can do
uh self dot load table data we're going
to give it the table name
and we're off and we're oh we do want to
give it
and we have to give it Max Rose whoops
comma Max rows
so in this case
here we go
so this is a straightforward one
and in this case this is basically what
we had before
uh let me go to
a sink Rose
it's going to do the same thing
and it's going to do whoops
load table data
for table
comma Max rows okay
so now we're pulling that
I see something weird up there
nope okay
drop rows sync so now we're going to do
a load table data we come in here now
this
is gonna be a little different for our
children
so the last thing we're going to do
let's see is
so in this case it is a child which
means so for what for these what we need
to do is we need to
uh
make sure parent is loaded
first
and what we want to do is this is going
to be imported tables so when we get
done here we're going to do uh once
we're done we're going to import tables
dot append table
so we're going to go through each of the
parents in this case which I think is
the first row
uh let's see he's right yeah okay
so we're going to go for each of those
we're going to say parent equals just to
do it this way
and then what we want to do is say
and how do we want to do this so we want
to make sure
that the parent does a smart
oh do we want to do it like that we want
to see if the parent has parents
so we probably
oh this is a good one because we could
just keep calling this but we need to
call it for each table
instead what we want to do
is we want to see
so then what we need to do
let's see
we're going to do
attempt to load
parent
and that's going to be our load table
data
except we're going to have one now
it's a little different
that's going to be unlimited let's go
here
because it's going to be a whole
different
this will be load
parent table data
and all I'm going to get here
uh I will have to pass up Max rows
and so this is going to get a little
tricky because what I'm going to do is
we're gonna have to run this check SQL
again
for that
one
and let's see
so the first thing I want to do is let's
see
check if parent is loaded
so if
parent and imported tables
whoop
then
and I want to say cool
tells
trying to load the parent
so the parent
and now
we can just say so let's see so that's
for each of those and then once we've
gone through each of the parents and
loaded our way down then we can do
uh
load this table data
so we probably
this becomes interesting because what we
really don't want to do what we'd like
to do is avoid making this call
over and over and over again
because that's technically what we're
going to have to do each time
so
if we look at that what we could do is
instead of doing it based off that we
could actually store
each of these as a key as a pair so
you'd have a table and you'd have what
its reference table is
and then figure out what its parents are
it seems like that would be
and we're going to call it here anyway
so let's just do that
and so this is now going to be
what we should probably do is for each
of those try to load it
this is where we're sort of thinking on
the fly a little bit here because it's
like what do we really want to do
in order to get our data go through all
of our tables and then make sure that
the parents are hit first
now what we're doing here is we're just
saying okay I'm going to get all of the
top parent rows
uh first well
it's really not doing that
so actually let's do it this way
so let's see so okay
I'm going to change this up a little bit
so what we're going to do first is we're
going to import the data for parent rows
and then and in this case it's going to
be Max rows we know we're good so every
parent is cool we're going to get it's
um
X number of rows
and that's the load table that we've
done so far and all is good
now what we need to do here is
essentially the same thing
um
let's see so for each table we're going
to do that okay so now we're going to do
the same thing
this time
we know it is going to be
um
this is going to be okay well we'll
leave it I'll say import data so these
are parents or these are root root
tables
and then
we're going to come here
and now we're going to do it for
uh
non-root tables
and so this is going to be a little more
tricky because what we're going to do
here is we're going to say
for each of these we're going to come in
and we're going to load table but we're
going to need to do it for uh we don't
really care what Max rows are anymore
so we're going to do a table
and parent
and this is going to be that load
parent table data
whoop
I hope that's right did we have it right
like that
um
well we're gonna go like this so let's
do it so load parent table data
should be table
and parent did I do it in that direction
did I do it in that order
yep table and parent
and then I get to append it and say I'm
good actually I probably should send
imported tables just to be sure because
I don't I can skip it if it's already
imported
yep yep yep
and so now
if it is greater than zero
so if it shows up once or more now I
have to do something a little different
okay so it's that load data for channel
children I can get rid of all of that
and I need to make the parent
which is parent
equals uh what is that
f k
whoop
oh I have to do that for each of the oh
for
so I kind of did it before let's see
let's just call it for
Row in
FK rows
and then parent equals
row
uh it's going to be the so oh
did I do I did the wrong thing okay so
now we're going to do is we're going to
come through and for each of these we're
now going to call this load parent table
data
and we're going to give it the table and
the parent
and then in here the first thing we're
going to do is we're going to see oh and
the
imported rows
um
uh can we check it yeah we probably want
to check it here because what we're
going to do here is we're going to say
if
parent in
imported rows
then we're just going to return
otherwise we're going to come in here
and we're going to first so we're going
to have a couple things we have to look
at here
because now what we're going to need to
do is
see if
they have a parent
which is basically the same thing here
it's going to look fairly similar so I
may just take the whole thing
uh but I probably won't so okay so first
let's well
I know I'm um wish washy this but let's
go here let's do this check SQL because
we're going to need this
so we have to see if
oh we're gonna have to actually do this
for a couple times so this would be good
so what we're going to do is we're going
to come in here
and uh
uh we don't need to do four table
because we're gonna do it just for this
one table
and for that table we're going to figure
out what it has and for each of those
we're going to say if it's
uh one then we're going to have to do a
special uh
do special
data load
is that right
let's see
this can get tricky because what we're
going to need to do is we're going to
say okay if our parent has been loaded
that's all we need right now
so we have two cases let's see let's go
back up here so
if parent is loaded
actually if all parents because you can
have more than one all parents
loaded
load
based on
data in parent
else
we're going to have to go in and uh load
the parent
or yeah load
each parent not loaded so it's going to
get a little bit tricky as we start
running through this and I think this is
a good point to step place to stop we
will come back around to this and start
digging into it it becomes like I said
we're slowing down a little bit here
because we're getting into some tricky
stuff but I wanted to sort of show the
thought process as we're going through
this otherwise you're going to end up
with a whole bunch of code we're going
to fly through and I think it'll be
harder to follow
but uh as always you can check out the
show notes if you want some if you have
questions shoot us an email if you have
any questions uh info developpinor.com
and other than that we're going to let
you get back to your day we will be back
next time and we're going to continue
trudging our way through this one till
then go out there and have yourself a
great day a great week and we will talk
to you
next time
thank you
foreign
Transcript Segments
10.7

thank you

18.89

[Music]

27.06

well hello and welcome back we're

28.98

continuing our series of tutorials SQL

31.92

python sort of Blended together in our

34.68

database synchronization application and

37.44

we're getting into walking through our

40.34

relational hierarchy in order to grab

44.28

data as we need it particularly when we

47.28

limit cert you know have a certain

49.559

number of rows we want to pull across

51

from our source to our destination we

54.3

need to make sure that we look up the

57

uh the related rows and pull those

59.28

across as well so it's going to get a

61.559

little tricky

62.879

um we started out first time last time

64.799

we just sort of got some basic stuff

66.96

together so what you may see is

71.4

uh let me flip back over here we use

74.159

this guy quite a bit when we were

75.54

grabbing our constraint name and table

77.4

name

78.299

and let's uh switch us over to giganator

82.74

if that's a database we're going to be

84.36

using today

86.479

and whoop

88.52

helps to

90.96

get the name right there we go

94.86

and so we've got a fair amount of I

97.38

think that's the one I'm using

98.939

uh

100.439

uh yeah that's what I'm using we've got

102.18

a fair amount of tables we've got a fair

103.439

amount of relationships we've got a lot

104.939

of these lkp lkp lookup type tables

108.74

among others got a lot of these like

111.06

performer performance which ties a

112.86

performer to a performance and of course

115.38

has its keys

117.479

now what we're doing last time is we had

119.159

this little smart empty sink so

121.2

basically we're going to do is we're

122.22

going to say hey

123.18

we are going to come through and we're

124.979

going to figure out if

127.74

a table is something we can go ahead and

130.14

load the data for it right away that

132.06

it's in our

134.36

clean section

136.86

or is it not

139.14

and what we're going to do is we're

140.52

going to do let's do uh

144.54

I want to see how do we want to do this

146.34

so the the first thing we need to do

148.02

which we did last time was I sort of did

149.7

this

150.599

load data and load data for children so

153.84

when we run it

155.52

and this only runs for one but we can

157.56

see here

159.3

and I tweaked it a little since our last

161.76

call if I can jump up to the top of this

163.98

somewhere here we go connect to the

165.9

database so load data for children so

169.379

for performer

171.12

and I did let's see the table name is

173.819

the last row so for the contract table

176.879

the performer

178.92

is tied to it so there is a foreign key

182.879

from contract back to performer which

185.58

means that performer has to be loaded

188.7

before contract is

191.459

it also means that we may have some

195.3

issues deleting data now one thing we

199.019

did in the past is we just went through

201.12

if you go think this is the sink Rose

203.94

is we just said we will just clear

206.72

everything out we're going to drop the

208.86

foreign keys we're going to truncate all

210.599

the data

211.56

if we want to we can do that and

216.3

what we'll do is let's just say

221.4

let's create a new one and we're going

223.319

to call it

224.64

drop data

227.459

and it's also going to be self it

229.799

doesn't need Max rows

232.14

it does need those two

236.34

and it's basically that piece whoops but

239.4

now I got two

243.06

this so that it all lines up right so

246.36

now I've got this drop data

248.94

and what I'm going to do here is instead

251.519

of doing this

254.939

I'm going to take it out of the sink

256.38

Rose

257.579

it is not in the Sim empty sink and then

261.72

I'm going to put it

266.52

here and this is basically because I

270

don't want to accidentally do stuff

271.199

sometimes and let's add a feature flag

273.9

of d

278.699

for drop

283.74

and

286.32

uh

290.16

we'll do that and if D is in there then

292.86

we'll do it okay

294.66

so

297.06

we'll have to drop we would have to sync

299.1

it first so we should be good did we

300.84

have an all here

302.34

uh we did have it all but I think we can

304.02

just do like this

308.22

there we go and that'll get us some

311.4

stuff going there

315.419

okay I think we are good so now back to

319.56

this so we've got our you know

321.72

get our comparison of tables that we

323.46

need to do and then we're going to come

325.32

into that's not main it's over here

328.919

now what we want to do for each of these

331.44

is

333.06

we can either load the table data right

335.88

away

336.9

or we're going to have to get the

338.4

children first so for the data that we

340.199

can load right away which means that it

342

does not have

344.039

a parent to worry about

347.1

then all we need to do here is let's see

350.94

we're going to do the data sync and

352.44

actually what we probably will do

358.139

um

359.82

so here we do it by the limit okay

362.639

so we're going to do

365.58

we're going to create like a little one

367.08

here and so this is going to be uh

369.72

load table data

373.32

and it's probably going to need

377.16

some information so rotate the table the

380.039

load table data

382.08

we're going to give it a table

386.34

and

389.759

oh we're gonna need our source and our

391.979

destination

393.36

which is sort of par for the course so

395.1

let's do this let's get our cleanup here

398.759

let's get our startup up here

406.139

and then we're going to go in we're

407.639

going to load table data which is uh

411

down here

412.86

uh oh that's not the one we want we

414.66

don't want create missing there we go

416.58

smart empty sink

417.96

so here what we're going to do

420.6

um

421.979

I don't know that it matters but we're

423.96

going to go ahead and put this in ahead

425.4

of it just so it's there

429.18

okay

430.259

so now what we can do is we can come in

432.18

and we can say if

434.22

oh that's missing tape I want to go back

435.72

up uh where is

443.52

okay what did I just do

449.639

to create missing tables sync rows

459.12

load table data smart empty sync rows

462.24

okay

463.38

let's just do it this way so we want to

465.12

take that

467.039

and we want to push that after load

469.44

table data

471.96

okay

473.039

so now we're going to come in here and

474.419

here we're going to just do the load so

476.639

what we can do is we can do

479.36

uh self dot load table data we're going

483.599

to give it the table name

487.52

and we're off and we're oh we do want to

490.56

give it

491.639

and we have to give it Max Rose whoops

494.58

comma Max rows

497.34

so in this case

502.02

here we go

507.06

so this is a straightforward one

509.94

and in this case this is basically what

511.979

we had before

513.839

uh let me go to

516.479

a sink Rose

520.26

it's going to do the same thing

523.14

and it's going to do whoops

528.66

load table data

531.06

for table

532.98

comma Max rows okay

535.86

so now we're pulling that

541.26

I see something weird up there

543.779

nope okay

545.279

drop rows sync so now we're going to do

547.44

a load table data we come in here now

549.6

this

550.8

is gonna be a little different for our

553.26

children

554.339

so the last thing we're going to do

557.339

let's see is

559.8

so in this case it is a child which

562.2

means so for what for these what we need

565.98

to do is we need to

568.32

uh

569.82

make sure parent is loaded

574.2

first

576.24

and what we want to do is this is going

578.339

to be imported tables so when we get

580.56

done here we're going to do uh once

583.019

we're done we're going to import tables

585

dot append table

589.8

so we're going to go through each of the

594.24

parents in this case which I think is

596.94

the first row

599.58

uh let's see he's right yeah okay

603.779

so we're going to go for each of those

608.04

we're going to say parent equals just to

610.98

do it this way

615.48

and then what we want to do is say

622.92

and how do we want to do this so we want

625.38

to make sure

630

that the parent does a smart

635.58

oh do we want to do it like that we want

638.76

to see if the parent has parents

643.74

so we probably

650.7

oh this is a good one because we could

652.14

just keep calling this but we need to

653.76

call it for each table

655.92

instead what we want to do

662.339

is we want to see

667.019

so then what we need to do

669.06

let's see

671.459

we're going to do

673.68

attempt to load

676.2

parent

679.26

and that's going to be our load table

681.839

data

683.279

except we're going to have one now

685.44

it's a little different

688.26

that's going to be unlimited let's go

691.2

here

693

because it's going to be a whole

694.26

different

695.88

this will be load

698.399

parent table data

701.459

and all I'm going to get here

704.279

uh I will have to pass up Max rows

711.079

and so this is going to get a little

713.1

tricky because what I'm going to do is

714.959

we're gonna have to run this check SQL

716.76

again

720.44

for that

723

one

724.86

and let's see

727.079

so the first thing I want to do is let's

728.7

see

730.079

check if parent is loaded

734.519

so if

737.519

parent and imported tables

742.8

whoop

747.3

then

751.56

and I want to say cool

755.76

tells

762.12

trying to load the parent

764.639

so the parent

767.519

and now

770.639

we can just say so let's see so that's

773.339

for each of those and then once we've

775.079

gone through each of the parents and

777.24

loaded our way down then we can do

780.66

uh

782.16

load this table data

787.079

so we probably

790.26

this becomes interesting because what we

791.94

really don't want to do what we'd like

793.38

to do is avoid making this call

796.26

over and over and over again

798.54

because that's technically what we're

799.8

going to have to do each time

803.94

so

806.16

if we look at that what we could do is

808.5

instead of doing it based off that we

810.36

could actually store

813.18

each of these as a key as a pair so

817.2

you'd have a table and you'd have what

818.94

its reference table is

823.019

and then figure out what its parents are

824.639

it seems like that would be

827.82

and we're going to call it here anyway

829.139

so let's just do that

831.66

and so this is now going to be

838.32

what we should probably do is for each

841.26

of those try to load it

843.6

this is where we're sort of thinking on

845.279

the fly a little bit here because it's

846.66

like what do we really want to do

850.139

in order to get our data go through all

853.86

of our tables and then make sure that

855.6

the parents are hit first

857.94

now what we're doing here is we're just

859.26

saying okay I'm going to get all of the

861.42

top parent rows

863.779

uh first well

868.68

it's really not doing that

871.8

so actually let's do it this way

874.44

so let's see so okay

878.339

I'm going to change this up a little bit

879.66

so what we're going to do first is we're

880.98

going to import the data for parent rows

885.42

and then and in this case it's going to

887.699

be Max rows we know we're good so every

890.279

parent is cool we're going to get it's

893.279

um

894.42

X number of rows

897.18

and that's the load table that we've

899.339

done so far and all is good

902.88

now what we need to do here is

906.66

essentially the same thing

909.48

um

912.72

let's see so for each table we're going

914.82

to do that okay so now we're going to do

916.44

the same thing

917.639

this time

919.8

we know it is going to be

923.76

um

925.5

this is going to be okay well we'll

927.779

leave it I'll say import data so these

929.76

are parents or these are root root

932.639

tables

934.98

and then

936.8

we're going to come here

940.139

and now we're going to do it for

943.26

uh

945.199

non-root tables

949.44

and so this is going to be a little more

951

tricky because what we're going to do

951.959

here is we're going to say

955.56

for each of these we're going to come in

958.079

and we're going to load table but we're

960.18

going to need to do it for uh we don't

962.639

really care what Max rows are anymore

964.98

so we're going to do a table

967.26

and parent

970.92

and this is going to be that load

974.16

parent table data

977.339

whoop

980.04

I hope that's right did we have it right

981.66

like that

984.12

um

985.079

well we're gonna go like this so let's

987.36

do it so load parent table data

991.079

should be table

993.24

and parent did I do it in that direction

995.1

did I do it in that order

998.04

yep table and parent

1000.5

and then I get to append it and say I'm

1003.44

good actually I probably should send

1008.92

imported tables just to be sure because

1012.74

I don't I can skip it if it's already

1014.959

imported

1017.779

yep yep yep

1020.74

and so now

1024.98

if it is greater than zero

1029.059

so if it shows up once or more now I

1032.12

have to do something a little different

1033.02

okay so it's that load data for channel

1034.939

children I can get rid of all of that

1039.74

and I need to make the parent

1043.1

which is parent

1045.579

equals uh what is that

1048.98

f k

1051.38

whoop

1056.72

oh I have to do that for each of the oh

1060.5

for

1066.74

so I kind of did it before let's see

1068.78

let's just call it for

1071.2

Row in

1073.6

FK rows

1077.9

and then parent equals

1081.82

row

1083.72

uh it's going to be the so oh

1088.88

did I do I did the wrong thing okay so

1091.94

now we're going to do is we're going to

1092.78

come through and for each of these we're

1094.58

now going to call this load parent table

1096.08

data

1098.059

and we're going to give it the table and

1099.559

the parent

1100.76

and then in here the first thing we're

1102.44

going to do is we're going to see oh and

1104.6

the

1107.02

imported rows

1111.14

um

1115.059

uh can we check it yeah we probably want

1117.5

to check it here because what we're

1119

going to do here is we're going to say

1120.679

if

1123.2

parent in

1125.12

imported rows

1128.179

then we're just going to return

1132.2

otherwise we're going to come in here

1136.22

and we're going to first so we're going

1138.32

to have a couple things we have to look

1139.34

at here

1140.9

because now what we're going to need to

1142.28

do is

1145.52

see if

1148.4

they have a parent

1153.26

which is basically the same thing here

1158.059

it's going to look fairly similar so I

1160.1

may just take the whole thing

1166.78

uh but I probably won't so okay so first

1170.059

let's well

1172.4

I know I'm um wish washy this but let's

1175.64

go here let's do this check SQL because

1177.799

we're going to need this

1182

so we have to see if

1186.14

oh we're gonna have to actually do this

1187.34

for a couple times so this would be good

1188.539

so what we're going to do is we're going

1189.74

to come in here

1191.14

and uh

1195.38

uh we don't need to do four table

1196.58

because we're gonna do it just for this

1197.9

one table

1200.24

and for that table we're going to figure

1202.039

out what it has and for each of those

1205.22

we're going to say if it's

1208.16

uh one then we're going to have to do a

1211.16

special uh

1212.919

do special

1215.48

data load

1220.34

is that right

1221.84

let's see

1223.1

this can get tricky because what we're

1225.02

going to need to do is we're going to

1226.1

say okay if our parent has been loaded

1230.72

that's all we need right now

1233.419

so we have two cases let's see let's go

1235.46

back up here so

1237.5

if parent is loaded

1243.38

actually if all parents because you can

1246.799

have more than one all parents

1251.6

loaded

1254.24

load

1257.559

based on

1260.84

data in parent

1263.48

else

1267.679

we're going to have to go in and uh load

1271.039

the parent

1272.24

or yeah load

1275.419

each parent not loaded so it's going to

1279.14

get a little bit tricky as we start

1281.299

running through this and I think this is

1283.94

a good point to step place to stop we

1286.1

will come back around to this and start

1288.38

digging into it it becomes like I said

1290.48

we're slowing down a little bit here

1291.38

because we're getting into some tricky

1292.64

stuff but I wanted to sort of show the

1295.28

thought process as we're going through

1297.14

this otherwise you're going to end up

1298.64

with a whole bunch of code we're going

1300.08

to fly through and I think it'll be

1301.28

harder to follow

1302.6

but uh as always you can check out the

1304.58

show notes if you want some if you have

1305.84

questions shoot us an email if you have

1307.46

any questions uh info developpinor.com

1310.7

and other than that we're going to let

1312.62

you get back to your day we will be back

1314.24

next time and we're going to continue

1317.419

trudging our way through this one till

1319.76

then go out there and have yourself a

1321.38

great day a great week and we will talk

1324.08

to you

1325.159

next time

1330.32

thank you

1338.96

foreign